Deb пакеты Ubuntu с зависимостями для «offline установки»
Всем привет.
Очевидно, что нужно выявить зависимые пакеты и выкачать их. Причем для установки на «чистую машину» нужно получить полный комплект зависимостей, включая возможные подзависимости зависимостей и т.д. При этом нужно выкачать минимальный набор необходимых пакетов относительно «чистой машины». Также нужно учитывать, что в зависимости от версии Ubuntu, установленной на «чистой машине», список пакетов может меняться. Плюс хотелось бы чтобы все это уместилось в shell скрипт.
Найденные мной в интернете способы решения проблемы "offline установки" не решали данную задачу. Поэтому и был написан данный топик. Также, данная статья показывает, насколько велики возможности, которые предоставляет Linux разработчику и с какой легкостью решаются достаточно сложные задачи.
Вступление
При распространении софта в виде deb пакетов для Ubuntu может возникнуть ситуация, когда нужно поставить софт на компьютер, на котором отсутствует доступ в интернет ("offline установка").Очевидно, что нужно выявить зависимые пакеты и выкачать их. Причем для установки на «чистую машину» нужно получить полный комплект зависимостей, включая возможные подзависимости зависимостей и т.д. При этом нужно выкачать минимальный набор необходимых пакетов относительно «чистой машины». Также нужно учитывать, что в зависимости от версии Ubuntu, установленной на «чистой машине», список пакетов может меняться. Плюс хотелось бы чтобы все это уместилось в shell скрипт.
Найденные мной в интернете способы решения проблемы "offline установки" не решали данную задачу. Поэтому и был написан данный топик. Также, данная статья показывает, насколько велики возможности, которые предоставляет Linux разработчику и с какой легкостью решаются достаточно сложные задачи.
Задача
Написать скрипт, позволяющий получить deb пакет и минимальный набор его зависимостей, которые можно поставить на «чистую offline машину» с определенной версией Ubuntu.Решение
Итак, последовательность действий:- Выкачиваем дистрибутив ubuntu, который установлен на 'offline-машине'. Я использовал образ ubuntu 10.04
- Извлекаем из образа 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}/
Скрипт принимает два параметра:
- путь к образу ubuntu
- выходная директория, куда будет скопирована образцовая файловая система
- Создаем работоспособный энворимент в выкачанной образцовой файловой системе для использования под 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"
Скрипт принимает параметры:
- путь к образцовой файловой системе
- список пакетов
- В итоге, в нашей образцовой файловой системе по пути var/cache/apt/archives/ появятся необходмые нам пакеты. Для установки на чистую машину достаточно скопировать их на нее (например, в директорию ~/) и выполнить sudo dpkg -i ~/*.deb
- Для возвращения фаловой системы в исходной состояние достаточно удалить выкаченные deb пакеты из var/cache/apt/archives/
- Как вы можете видеть, обрабочик прерывания/завершения скрипта автоматически демонтирует примонтированные во время работы системные директории. Поэтому, можно безопасно удалить директорию с образцовой файловой системой как только она перестанет быть нужна.
0 комментариев