
Я пытаюсь создать небольшой раздел восстановления (~800 МБ свободного места после всех других разделов системы и хранилища) для ноутбука со специализированным оборудованием, которому требуются специальные ядра и модули ядра, поэтому стандартные инструменты восстановления, такие как Clonezilla Live и GParted Live, работают не очень хорошо. Раздел слишком мал, чтобы включить модули и программное обеспечение, необходимые для того, что я хочу собрать, поэтому большую часть системы нужно сжать и загрузить в оперативную память во время выполнения. Кроме того, я предпочитаю полностью извлекать систему, а не полагаться на squashfs
, и я хотел бы иметь возможность сохранять изменения, внесенные в систему, насколько позволяет раздел. Используя Ubuntu 20.04 в качестве базовой системы, я разработал следующую схему для этой цели:
- После сборки исходной системы в
chroot
создайте пустую папку/ram
в качестве точки монтирования дляtmpfs
размещения распакованных системных и пользовательских файлов во время выполнения, переместите все системные и пользовательские папки с файлами (home
,usr
,var
,opt
,etc
,и т. д.) в/ram
и замените каждый символической ссылкой на/ram/$dir
. Сожмите/ram
как/ram.tar.gz
и оставьте специальные точки монтирования (dev
,sys
,run
,tmp
, иproc
), а такжеboot
в покое наrootfs
. Удалите/ram/*
и запишитеrootfs
на раздел. initrd
При загрузке, после загрузки ядра и , предварительно монтируйтеrootfs
, монтируйтеtmpfs
в/ram
, затем извлекайте содержимое/ram.tar.gz
в/ram
. Это должно произойти доrootfs
заменыinitramfs
с правами root, поскольку в противном случаеrootfs
не будет доступа к утилитам, необходимым для монтирования/ram
и извлечения из сжатого архива.- Смонтируйте
rootfs
и продолжите загрузку. - При выключении сделайте резервную копию,
/ram.tar.gz
а/ram.tar.gz.bak
затем сожмите измененное/ram
в/ram.tar.gz
. Это можно сделать с помощьюsystemd
.
Очевидно, что на шаге 4 могут возникнуть проблемы, поэтому на шаге 2 необходимо включить проверку целостности /ram.tar.gz
и загрузку резервной копии, если это не удастся, но это должно быть всего лишь несколько дополнительных команд для включения в initramfs-tools
сценарий, и это выходит за рамки моего вопроса, который заключается в следующем:
Не изменяя /usr/share/initramfs-tools/init
, как мне создать скрипт /etc/initramfs-tools/scripts
для выполнения шага 2? Команды должны быть достаточно простыми, как
mount -t tmpfs -o $OPTIONS none /ram
tar xvzf ram.tar.gz
Но я немного не понимаю, в какую папку включить скрипт (init? local? top? bottom? premount?) и как работать с заголовком PREREQ
в самом скрипте.
решение1
Оказалось, что это довольно просто. Создать:
/etc/initramfs-tools/scripts/local-bottom/ramfiles
#!/bin/sh
set -e
PREREQ=""
prereqs()
{
echo "${PREREQ}"
}
case "${1}" in
prereqs)
prereqs
exit 0
;;
esac
mount -t tmpfs -o size=100% none ${rootmnt}/ram
tar xvzf ${rootmnt}/ram.tar.gz -C ${rootmnt}
затем
sudo chmod +x /etc/initramfs-tools/scripts/local-bottom/ramfiles
sudo update-initramfs -u