вторник, 17 июня 2008 г.

Ужатие portage в Gentoo

Как известно всем пользователям Gentoo, в системе должны постоянно присутствовать база portage (обычно /usr/portage), которая занимает значительное место - порядка 500 мегабайт. Конечно, для новых винчестеров это не столь уж существенная цифра, однако некотрые всё ещё работают на относительно маломощных компьютерах, и пытаются экономить на мегабайтах. И я - среди них. Моё домашний ноутбук имеет винчестер размером всего 40 гигабайт. Нужно было что-то делать.

Тогда я прошерстил интернет в поисках решения, и кое-что нашёл. Решение не полностью подходило для меня, и его пришлось хорошенько адаптировать.

Итак, условия в которых я содержу свой Gentoo:
1. Анлим интернет ночью. Скорость около 60 килобайт в секунду.
2. rsync не работает, т.к. не настроен домашний сервер, через который я хожу в интернет.

Таким образом меня совершенно не напрягает скачать полный образ portage раз в месяц (сжатый bzip2 ясное дело).

Будем использовать сжатую файловую систему, для хранения дерева портов. Для этого возьмём squashfs. Это сжатая файловая система, которая не позволяет редактировать данные. Но, нам это и не нужно. Кстати, не забудьте включить поддержку squashfs в ядре.

Есть одна небольшая проблема. По умолчанию /usr/portage/distfiles должен быть доступен на RW, но это решается просто - переназначением директории с дистрибутивами в /etc/make.conf:
DISTDIR=/var/distfiles
/var/distfiles нужно предварительно создать. Кстати, у меня это не директория, а ссылка на /mnt/autofs/nfs/homeserv/gentoo/distfiles, при обращении к которой происходит авто монтирование NFS ресурса сервера с дистрибутивами. Так они и не занимают место на ноутбуке и доступны без необходимости что-то монтировать руками.

Затем впишем в /etc/fstab строку для монтирования сжатого образа portage в /usr/portage:
/var/data/portage.sqfs /usr/portage squashfs loop,ro
(да, сжатые данные у меня лежат в /var/data/portage.sqfs)

А теперь, код для скачивания и обновления нового образа portage:
#!/bin/bash
dir=~/MyDownloads/update-portage-$(date -u +%Y-%m-%d) # (1)
mkdir -p $dir
cd $dir
wget -c http://distfiles.gentoo.org/snapshots/portage-latest.tar.bz2 # (2)
if [[ $? == 0 ]]; then
update-portage.sh portage-latest.tar.bz2 № (3)
fi
(1) Конструируем новую директорию в которую будет производится закачивание, создаём её, и переходим туда.
(2) Скачиваем последнюю имеющуюся версию образа portage. Я решил не заморачиваться с конструированием имён типа portage-20080517.tar.bz2 и всегда качаю последнее, что имеется.
(3) Если всё хорошо - вызываем скрипт обновляющий portage.

У меня 2 скрипта, но это всего-лишь из-за моей лени объединить их. Я бы объединил их перед написанием статьи, но опасаюсь внести ошибку, а проверить негде - нет под рукой Linux-а.

Второй скрипт - обновление Portage.
#!/bin/bash

if [[ $1 == "" ]]; then
echo "usage: $0 "
fi

# Отключаем файловую систему, смонтированную в /usr/portage (наш сжатый образ)
echo "Try umount current portage"
sudo umount /usr/portage

# Удаляем сжатый файл с старыми данными
echo "Remove old sqfs file"
sudo rm /var/data/portage.sqfs

# Распаковываем новые данные в /usr/portage
echo "Unpack new data"
sudo tar xfjp $1 -C /usr

# обновляем метаданные. Я не уверен, но кажется эта операция требует записи в portage.
# Но она производится только раз, поэтому мы подсуетимся заранее,
# пока есть возможность записи
echo "Update metadata"
sudo emerge --metadata

# Создаём сжатый файл на основе новых данных
echo "Create new sqfs file"
sudo mksquashfs /usr/portage /var/data/portage.sqfs

# Удаляем распакованные данные
echo "Remove all unpacked data"
sudo rm -fR /usr/portage/*

# Монтируем новый образ. После чего системе будет доступен portage
echo "mount new portage"
sudo mount /usr/portage

# Обновляем базы esearch. Кстати, полезная утилитка.
echo "Update search DB"
sudo eupdatedb
Всё. Данные обновлены и сжаты. Сжатый образ portage занимает что-то около 40Mb против 500Mb. Плюс ко всему похоже работает быстрее. portage-latest.tar.bz2, кстати остаётся на память - вдруг что пойдёт не так, что-бы не скачивать снова. Нужно удалять руками.

P.S. Под словари StarDict я тоже стесняюсь отводить много места, поэтому я и их сжал.

Комментариев нет: