persistence-mode или создаем LiveCD/LiveUSB с возможностью сохранения /home раздела и настроек пользователя

Предисловие.

Понадобилось мне как-то, чтобы CMC (Calculate Media Center) был установлен на флешку (LiveUSB).
Но вот досада - если делать LiveUSB (не USB-HDD), то раздел /home не сохраняется
и при каждой перезагрузке пересоздаетя заново ( настройки сбрасываются ).
Так дело не пойдет! Но порывшись в инете ничего путного не нашёл.
Инфа только для Ubuntu с ёё casper-rw разделом!

И о чудо - оказывается есть возможность в Gentoo LiveCD 12.0 сохранить /home на флеху

Но ее нет в Calculate Linux ! ( негодую :slight_smile: )

И так приступим к созданию LiveDVD/LiveUSB Calculate Media Center с возможностью сохранения раздела /home

I ПОГОТОВКА СИСТЕМЫ

1. Берем с сайта последний stage CMC http://mirror.cnet.kz/calculate/CMC/stages/i686/

2. Кладем stage в папку /var/calculate/linux

3. sudo cl-assemble -p desktop/CMC/x86/binary -d /tmp/build/cmc --source=CMC --march=i686

4. Кладем файл http://www.calculate-linux.ru/attachments/2693/persistence в каталог /mnt/calculate-desktop-CMC-x86-binary/etc/init.d/
пример sudo cp путь_до_файла_persistence /mnt/calculate-desktop-CMC-x86-binary/etc/init.d/

5. Делаем его испольняемым (root:root 0755)

6. sudo chroot /mnt/calculate-desktop-CMC-x86-binary

7. ln -s /etc/init.d/persistence /etc/runlevels/boot или rc-update add persistence boot

8. выходим из chroot - exit

9. Собираем систему cl-make -p calculate/desktop/CMC/x86/binary -u -V

10. Собираем образ cl-image -p calculate/desktop/CMC/x86/binary --live iso

11. Закрываем сборку cl-make --break -p calculate/desktop/CMC/x86/binary

Все со сборкой образа закончили

Теперь у нас образ с возможность сохранения раздела /home на usb носителе и жеском диске
(я поправил исходный файл закоментировал строки с 54 по 57 включительно для возможности сохранения как на usb так и на hdd разделе, в оригинале можно было сохранять только на usb - то-есть только на съемные устройства)

II ПОДГОТОВКА НОСИТЕЛЯ

Далее решаем - будем сохранять раздел /home на одной флешке с образом системы или на другой.

1. Если на другой - то устанавливаем CMC штатным способом на флешку cl-install -d /dev/sdb

2. Если хотим сохранять /home на тойже флешке что и образ - то надо разбить флешку на 2 раздела /dev/sdb1 и /dev/sdb2. Делаем разбиение на два раздела например с помощью Gparted. Далее устанавливаем unetbootin и ставим наш образ на раздел /dev/sdb1.

К сожалению нет способа сохранить /home на одном разделе с squash образом, так как раздел sdb1 монтируется в режиме ro.

III ПОДГОТОВКА К ЗАГРУЗКЕ

Необходимо создать пустой файл-ключ с названием persistence-mode на разделе где будем хранить папку-раздел /home

1. Если вы выбрали в главе II раздел 1 - то создаем файл persistence-mode на другой флешке или на разделе HDD

2. Если вы выбрали в главе II раздел 2 - то создаем файл persistence-mode на разделе sdb2 флешки с образом системы

Внимание - файловые системы для разделов могут быть любые (fat, fat16, fat32, ext) КРОМЕ NTFS. Я не смог добиться работы с этой файловой системой.

IV ПАРАМЕТРЫ ЗАГРУЗКИ ЯДРА

1. Параметр persistence должен быть указан всегда, если хотим грузится в режиме persistence-mode

2. Параметр persistence_mb= - размер папки /home. Указываетя один раз для создания файла-раздела gentoo-persistence.ext4 на разделе где лежит файл-ключ persistence-mode. По умолчанию составляет 256 mb ( если не указывать).
Например persistence_mb=500 - будет размер 500 MB, а persistence_mb=1G - 1 GB (для указания гигабайтов надо добавлять к размеру букву G, а для указания в мегабайтах никаих букв не надо только цифры)

Эти параметры указываем при начальной загрузке с LiveDVD или LiveUSB при старте isolinux или syslinux когда видим строки с выбором способов загрузки, а вверху Welcom to Calculate Linux. Просто нажимаем клавишу TAB и дописываем через пробел вышеуказанные параметры в конец появившейся строки. Или меняем загрузку по примеру статьи http://www.calculate-linux.ru/boards/44/topics/13010

ВСЕ

Проверяем что получилось

Должен быть создан файл gentoo-persistence.ext4 на том разделе где вы создали файл persistence-mode

Пример дистрибутива CMC с persistence-mode http://narod.ru/disk/61813462001.cc27fe9dce0a5f5accad06cd67b1f9f7/cmc-20121001a-i686.iso.html вводить параметр persistence не нужно а persistence_mb по желанию (если не ввести то будет создана папка /home размером 256MB)
Пример дистрибутива CLDX для i586 с persistence-mode
http://narod.ru/disk/61814844001.f646042470661f7019f064e44633cdea/cldx-20121001a-i586.iso.html

ЗЫ - Применить можно к любому дистру Calculate

Мысли вслух - по аналогии наверное можно не только раздел /home сохранять но и еще какие нибудь типа /etc

PS Может разработчики добавят все что я описал и прикрепил в базовые системы CLD, CLDX, CLDG,CDS и прочие для удобства пользователей

Все делается несколько проще, без необходимости пересобирать образ.

В конце инициализации системы в initramfs, в режиме загрузки cdroot, в случае наличия /mnt/cdrom/cdupdate.sh с флагом +x, этот скрипт исполняется.
Из него можно производить все действия с монтированием.
Одним словом - просто установите систему на флешку, и создайте на этой же партиции файл cdupdate.sh примерно такого содержания:

#!/bin/sh
/bin/ash

Теперь вы сможете “ставить опыты” внутри ядра, в т.ч. и прописать нужные пути в fstab
Теперь система загружаемая с этой флешки будет останавливаться и выдавать приглашение shell перед выполнением chroot в squash.
Если из этого шелла выйти - загрузка пойдет дальше обычным образом.

Не совсем понял - пока :slight_smile: Можно подробнее? и что за cdroot ?
Но речь по моему шла немного о другом
Как прицепить к тому что Вы описали Михал - persistence-mode аля gentoo way
Может посмотрите как все работает сначала ?

Не совсем понял - пока :slight_smile: Можно подробнее? и что за cdroot ?

функция из genkernel-овского initramfs-а запускающая /mnt/cdrom/cdupdate.sh

Может посмотрите как все работает сначала ?

Признаюсь - читал по диагонали.
в глаза бросилась задача - монтировать home на лету из LiveCD
Нечто подобное я решил у себя при загрузке по pxe. Потому и решил предложить вариант без переделки ISO-шки.

Постараюсь его расписать.

Итак, система грузится с ключем cdroot. Тут скрипт /linuxrc после инициализации системы, запуска udev-а, и перед chroot-ом в aufs-бутербод из squash-а и tmpfs-а запускает функцию cdupdate

<code class="sh">
 # less -N /usr/share/genkernel/defaults/linuxrc
.....
    826 
    827 # Execute script on the cdrom just before boot to update things if necessary
    828 cdupdate
    829 
.....
</code>

импортируемую из initrd.scripts:

<code class="sh">
 # less -N /usr/share/genkernel/defaults/initrd.scripts
.....
    971 cdupdate() {
    972         if [ "${CDROOT}" = '1' ]
    973         then
    974                 if [ -x /${NEW_ROOT}/mnt/cdrom/cdupdate.sh ]
    975                 then
    976                         good_msg "Running cdupdate.sh"
    977                         ${NEW_ROOT}/mnt/cdrom/cdupdate.sh
    978                         if [ "$?" != '0' ]
    979                         then
    980                                 bad_msg "Executing cdupdate.sh failed!"
    981                                 run_shell
    982                         fi
    983                 else
    984                         good_msg 'No cdupdate.sh script found, skipping...'
    985                 fi
    986         fi
    987 }
.....
</code>

В моем случае я не стал делать монстра из файла cdupdate.sh, а прописал в него следующее:

<code class="sh">
#!/bin/sh
if [ -z "${NEW_ROOT}" ]; then
        export NEW_ROOT=/union/
fi
for f in `dirname "$0"`/cdupdate.d/*; do
        if [ -x "$f" ]; then
                echo
                echo "Running $f..."
                sh "$f"
        fi
done
#/bin/ash
:
</code>

И среди прочего, в одном из этих файлов я анализировал доступные партиции командой blkid, и нужные мне партиции прописывал в ${NEW_ROOT}/etc/fstab.
В вашем случае - UUID второй партиции на флешке, на которой установлен образ кальки, вам известен.
В cdupdate.sh можно закинуть лишь что-то вроде:

echo "UUID=01234567-89ab-cdef-0123-456789abcdef /home auto noatime,noexec,nosuid,nodev 0 0" >> ${NEW_ROOT}/etc/fstab

В остальном - это будет почти обычная флешка, с установленной на нее калькой. Правда, как я выше уже писал, стоит разбить ее на две партиции, и на вторую поставить reiser/ext3/ext4, но ни как не FAT.

PS
Тем же способом можно в стандартный образ поместить/примонтировать все что угодно, в т.ч. и шаблоны, и этого демона persistence

Я сейчас довожу до ума скрипты для cdupdate.d реализующие гораздо больше чем просто монтирование /home (напомню, есть еще такая штука как группы, есть пароли, явки шифрование хомяка, ключи ssh и vpn)

Когда этот набор костылей превратится во что-то что будет не очень стыдно показать другим, выложу в открытый доступ.

Хочется верить - даже девелоперов этим решением заинтересую.
Но стараюсь сделать все так, чтоб это решение было совместимо со стандартными iso-образами кальки.

Интересно - что нибудь из выше описанного включат в официальное дерево Кальки?
Александр Ваше решение?

Михаил, уже два человека ожидают ваш “набор костылей”)))))
заинтересовало как сохранение изменений на флешке (возможно без ее переразбивки?), так и возможность шифрования хомяка (флешка все таки, теряются они)

Михаил, ваш “набор костылей” готов для опубликования?))))))))

Михаил, есть ли новости о топике?
Даже багрепорт готов. :slight_smile: http://www.calculate-linux.ru/issues/556
Спасибо.

есть ли новости о топике?

К сожалению, сейчас у меня так сложилась ситуация, что времени свободного совсем нет.
Наработки на этот счет есть, причем такие, что этот скрипт cdupdate по сравнению с ними - обычный Hello World
Но они еще не работают как должны.

Если кто-то возьмется допиливать - могу выложить свои скрипты с комментариями.

Все дело в том, что я “замахнулся” на linuxrc, многие вещи в нем, по-моему, надо переписать, или вообще выкинуть.

Но этот скрипт писало/переписывало множество людей, так что одни костыли получились связанными с другими, и так просто туда не влезть.

Работа усложняется тем, что не всё можно оттестировать выполнив, к примеру, chroot в распакованный initrd, да и в виртуалке не очень удобно с этим работать.

Однако решение с cdupdate.sh, описанное ранее, вполне себе рабочее.
Пусть оно и не оформлено в установочный пакет, но, мне кажется, я достаточно его расписал, чтоб вы могли воспроизвести его у себя.

Если будут конкретные вопросы - готов ответить.