Deb пакеты Ubuntu с зависимостями для «offline установки»

Всем привет.

Вступление

При распространении софта в виде deb пакетов для Ubuntu может возникнуть ситуация, когда нужно поставить софт на компьютер, на котором отсутствует доступ в интернет ("offline установка").

Очевидно, что нужно выявить зависимые пакеты и выкачать их. Причем для установки на «чистую машину» нужно получить полный комплект зависимостей, включая возможные подзависимости зависимостей и т.д. При этом нужно выкачать минимальный набор необходимых пакетов относительно «чистой машины». Также нужно учитывать, что в зависимости от версии Ubuntu, установленной на «чистой машине», список пакетов может меняться. Плюс хотелось бы чтобы все это уместилось в shell скрипт.

Найденные мной в интернете способы решения проблемы "offline установки" не решали данную задачу. Поэтому и был написан данный топик. Также, данная статья показывает, насколько велики возможности, которые предоставляет Linux разработчику и с какой легкостью решаются достаточно сложные задачи.

Задача

Написать скрипт, позволяющий получить deb пакет и минимальный набор его зависимостей, которые можно поставить на «чистую offline машину» с определенной версией Ubuntu.

Решение

Итак, последовательность действий:
  1. Выкачиваем дистрибутив ubuntu, который установлен на 'offline-машине'. Я использовал образ ubuntu 10.04
  2. Извлекаем из образа ubuntu файловую систему, которая монтируеся в RAM при загрузке с Live CD. Она будет для нас эталоном файловой системы «чистой машины». Скрипт извлечения файловой системы:
    #!/bin/bash
    
    ISO=$1
    OUTDIR=$2
    
    UMOUNT()
    {
     sudo umount ${WORKDIR}/fs
     sudo umount ${WORKDIR}/iso
    
    rm -r ${WORKDIR}
    }
    
    trap UMOUNT EXIT
    
    echo
    echo "Mounting $ISO..."
    mkdir -p ${WORKDIR}/iso
    sudo mount -o loop $ISO $WORKDIR/iso
    
    echo
    echo "Mounting Live CD fs ..."
    mkdir -p ${WORKDIR}/fs
    sudo mount -t squashfs -o loop ${WORKDIR}/iso/casper/filesystem.squashfs ${WORKDIR}/fs
    
    echo
    echo "Creating a writeable copy of Live CD fs ..."
    mkdir -p ${OUTDIR}
    sudo cp -rf $WORKDIR/fs/* ${OUTDIR}/
    


    Скрипт принимает два параметра:
    1. путь к образу ubuntu
    2. выходная директория, куда будет скопирована образцовая файловая система
  3. Создаем работоспособный энворимент в выкачанной образцовой файловой системе для использования под chroot и выкачиваем пакеты. Соответствующий скрипт:

    #!/bin/bash
    
    INDIR=$1
    shift 1
    PACKS=$@
    
    UMOUNT()
    {
     sudo chroot $INDIR/ umount /proc
     sudo chroot $INDIR/ umount /sys
     sudo chroot $INDIR/ umount /dev/pts
    
    sudo umount $INDIR/dev
    }
    
    echo
    echo "Copying config files to LiveCD fs ..."
    for F in /etc/resolv.conf /etc/apt/sources.list
    do
     echo "Copying $F"
     sudo cp $F $INDIR/$(dirname $F)
    done
    
    trap UMOUNT EXIT
    
    echo
    echo "Mounting /dev to LiveCD fs ..."
    sudo mount --bind /dev $INDIR/dev
    
    echo
    echo "Mounting proc, sysfs, devpts in LiveCD fs ..."
    sudo chroot $INDIR/ mount -t proc none /proc
    sudo chroot $INDIR/ mount -t sysfs none /sys
    sudo chroot $INDIR/ mount -t devpts none /dev/pts
    
    echo
    echo "Downloading packages and its dependensies in LiveCD environment ..."
    sudo chroot $INDIR/ apt-get update -qq
    sudo chroot $INDIR/ apt-get clean -qq
    sudo chroot $INDIR/ apt-get install --quiet --download-only --reinstall --yes --force-yes $PACKS
    
    echo
    echo "Done"
    


    Скрипт принимает параметры:
    1. путь к образцовой файловой системе
    2. список пакетов
  4. В итоге, в нашей образцовой файловой системе по пути var/cache/apt/archives/ появятся необходмые нам пакеты. Для установки на чистую машину достаточно скопировать их на нее (например, в директорию ~/) и выполнить sudo dpkg -i ~/*.deb
  5. Для возвращения фаловой системы в исходной состояние достаточно удалить выкаченные deb пакеты из var/cache/apt/archives/
  6. Как вы можете видеть, обрабочик прерывания/завершения скрипта автоматически демонтирует примонтированные во время работы системные директории. Поэтому, можно безопасно удалить директорию с образцовой файловой системой как только она перестанет быть нужна.
Всем спасибо за внимание. Удачных решений!


0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.