Всем привет.
При распространении софта в виде deb пакетов для Ubuntu может возникнуть ситуация, когда нужно поставить софт на компьютер, на котором отсутствует доступ в интернет ("offline установка").
Очевидно, что нужно выявить зависимые пакеты и выкачать их. Причем для установки на «чистую машину» нужно получить полный комплект зависимостей, включая возможные подзависимости зависимостей и т.д. При этом нужно выкачать минимальный набор необходимых пакетов относительно «чистой машины». Также нужно учитывать, что в зависимости от версии Ubuntu, установленной на «чистой машине», список пакетов может меняться. Плюс хотелось бы чтобы все это уместилось в shell скрипт.
Найденные мной в интернете способы решения проблемы "offline установки" не решали данную задачу. Поэтому и был написан данный топик. Также, данная статья показывает, насколько велики возможности, которые предоставляет Linux разработчику и с какой легкостью решаются достаточно сложные задачи.
Написать скрипт, позволяющий получить deb пакет и минимальный набор его зависимостей, которые можно поставить на «чистую offline машину» с определенной версией Ubuntu.
Итак, последовательность действий:
Всем спасибо за внимание. Удачных решений!
Вступление
При распространении софта в виде 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/
- Как вы можете видеть, обрабочик прерывания/завершения скрипта автоматически демонтирует примонтированные во время работы системные директории. Поэтому, можно безопасно удалить директорию с образцовой файловой системой как только она перестанет быть нужна.
Всем спасибо за внимание. Удачных решений!