Эта тема поднималась много раз но полного решения нет в том числе и на этом форуме
Ситуация следующая: есть глухой (без usb/cdrom/fdd) сервер без выхода в интернет. На нем поднят Ubuntu Server LTS 10.04.01. Архитектура i386. Иксов нет - только консольный режим. Доступ возможен только по SSH.
Задача: настроить регулярное обновление с использованием домашней машины с другой архитектурой и операционкой (Ubuntu Maverik 10.10). Отпадают способы основанные на графическом интерфейсе типа Keryx, APTonCD тоже не приемлим - сервер глухой
Основная трудность возникает с обновлением списка изменений, который получается обычно командой вида
sudo apt-get update
Перерыл весь интернет, готового решения именно для Ubuntu Server LTS 10.04 не нашел. Есть для старых версий Debian, но там даже структура каталогов другая поэтому буду собирать из отдельных кусков информации (которую нарыл) свой алгоритм обновления.
Как мне представляется логика работы должна быть такой
1) На сервере запускаем команду
apt-get -y --print-uris update > source.lst
получаем файл вида
'http://path_1/Sources.bz2' file_name_1 0 :
'http://path_2/Packages.bz2' file_name_2 0 :
'http://path_3/Release.gpg' file_name_3 0 :
...
2) копируем полученный файл к себе на клиента командой вида
scp user@server:/home/user/source.lst ~/source.lst
3) записывем его на флешку, тащим в места обетованные, где есть интернет (например домой)
4) дома запускаем скрипт вида
#!/bin/bash
FileSource="source.lst"
# если присутствует первый аргумент, то предполагаем, что это список источников обновления
if [ -n "$1" ]
then
FileSource=$1
fi
# проверяем наличие файла со списком обновления
if [ ! -e $FileSource ]
then
echo -e "нет такого файла " $FileSource "!...\n"
exit 1
fi
# Дальше надо скачать каждый файл из по адресу из списка ${FileSource}, если это архив то
# распаковать, переименовать в имена представленные в том же файле ${FileSource}
# все это делается по одному, потому что имена повторяются (типа Packages.bz2 или Sources.bz2)
while read line; do
# выцепляем http адреса (они заключены в одинарные кавычки)
http_adr=${line%%\' *} # это http адрес файла с ' впереди
http_adr=${http_adr#\'} # просто http адрес файла
# выцепляем имена файлов (они ограничены пробелами)
s1=${line##*\' } # удаляем все от начала до первого пробела включительно
file_nam=${s1%% *} # удаляем с конца строки до первого пробела с начала строки включительно
s1=${http_adr##*/} # Удаляем полный путь, оставляем только имя файла с расширением и '
download_file_name=${s1%\'} # откусываем кавычку сзади, получаем имя скачаного файла
wget -c $http_adr # скачиваем файл по http_adr
# проверяем это архив или нет
mimetype=$(file $download_file_name | cut -f2 -d':' | cut -f2 -d' ') # определяем миме тип файла
if [ $mimetype = "bzip2" ] # если это архив bz2
then
bzip2 -d $download_file_name # то распаковываем
download_file_name=${download_file_name%.bz2} # теперь в download_file_name имя файла без расширения
fi
# переносим файл в каталог /lists и переименовываем в file_nam
mv $download_file_name ./lists/$file_nam
done < $FileSource
итого: в каталоге ./lists образовался набор файлов с актуальными изменениями именно для этого сервера
5) опять сгружаем это все на флешку и тащим обратно
6) с клиентской машины заливаем по SSH каталог /lists на сервер
scp ~/update/lists/* user@server:/home/user/update/lists
7) на сервере переименовываем на всякий случай каталог /var/lib/apt/lists в /var/lib/apt/lists.old и копируем принесенный каталог на его место
sudo mv /var/lib/apt/lists /var/lib/apt/lists.old
sudo cp ~/update/lists /var/lib/apt/lists
# копируем файлы и папки непонятного мне назначения, чтобы все было как в оригинале
sudo cp /var/lib/apt/lists.old/partail /var/lib/apt/lists
sudo cp /var/lib/apt/lists.old/lock /var/lib/apt/lists
проверяем права доступа и владельца - должно быть root:root и 644 если что - меняем
8 ) получаем список обновлений командой вида
apt-get -y --print-uris upgrade | grep \.deb | cut -f2 -d"'" > update-deb.lst
9) опять добираемся домой прихватив файл update-deb.lst, там скачиваем потребные файлы командой
wget -i update-deb.lst
получаем кучу пакетов
10) переносим эти пакеты на сервер и устанавливаем их командой
sudo dpkg -i *.deb
Данный подход вполне работоспособен НО для каждого обновления нужна куча телодвижений и бегать два дня, а с установкой нового пакета это вообще раздражает. Понадобилось тебе поставить мелочь типа pdf2djvu - извольте сначала четыре раза сбегать.
ВОПРОС: а можно ли этот алгоритм ужать до двух ходок, типа как в Keryx только в терминальном режиме и по SSH? За кривой скрипт прошу не бить - я только четыре месяца как пересел на linux и это мой третий сценарий. Любые советы по его оптимизации только приветствуются.