Pull to refresh

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. Как вы можете видеть, обрабочик прерывания/завершения скрипта автоматически демонтирует примонтированные во время работы системные директории. Поэтому, можно безопасно удалить директорию с образцовой файловой системой как только она перестанет быть нужна.

Всем спасибо за внимание. Удачных решений!
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.