Hatred's Log Place

DON'T PANIC!

Oct 7, 2021 - 4 minute read - Linux

Ubuntu: persistent live stick

Задача: сделать USB стик с Ubuntu, но так, что бы состояние сохранялось. Между перезагрузкам.

Забегая вперёд, это делается, но с одним ограничением: ядро не меняется. Но под мои задачи этого достаточно.

Итак, для начала, информации в интернете достаточно, но чёткого пошагового плана я не находил. И вот ресурсы, которыми я пользовался:

Мне же ещё хотелось обойтись только стандартными утилитами. Но я позволю себе, как лентяю, пользоваться GParted, благо устанавливается он в Manjaro/ArchLinux в одну команду.

Из всех вышеперечисленных ссылок, по сути, достаточно только вдумчивого чтения одной: LiveUsbPendrivePersistent. Всё остальное - от лукавого. Но для общего развития почитать можно.

Первым шагом качаем ISO образ Ubuntu, пусть у нас это будет 20.04:

wget https://mirror.linux-ia64.org/ubuntu-releases/20.04.3/ubuntu-20.04.3-desktop-amd64.iso

Вторым шагом, берём USB флешку, я брал на 16Gb с USB3 интерфейсом - особо одарённые флешки такие тормозные, что загрузка с них даже не начинается. Имейте это в виду.

На флешке любым удобным методом создаём два раздела:

  1. FAT32, Primary, гигов на 4-5 и обязательно задаём метку UBUNTU
  2. EXT4, Primary, на всю котлету и обязательно задаём метку casper-rw

Очередность разделов тоже имеет роль, по крайней мере в минимизации объёма гимора. Да, ради этой же цели, используйте MBR вместо GPT для нашей флехи.

Для раздела UBUNTU не забываем задать флаг boot:

Далее, монтируем раздел UBUNTU, у меня он примонтировался в /run/media/hatred/UBUNTU/ с этим и будем работать. В общем виде этот путь на многих современных системах можно записать в обобщённом виде:

/run/media/$USER/UBUNTU

Аналогично монтируем и сам образ ISO, который мы скачали, для этого в каталоге с ним выполним команды:

mkdir mount
sudo mount -o loop ubuntu-20.04.3-desktop-amd64.iso mount 
cd mount

А теперь, согласно документации, копируем необходимые файлы на флешку:

cp -a .disk casper dists install pool preseed /run/media/hatred/UBUNTU/
cp -a isolinux /run/media/hatred/UBUNTU/syslinux # copy and rename
mv /run/media/hatred/UBUNTU/syslinux/isolinux.cfg /run/media/hatred/UBUNTU/syslinux/syslinux.cfg
mv /run/media/hatred/UBUNTU/syslinux/isolinux.bin /run/media/hatred/UBUNTU/syslinux/syslinux.bin

В ISO образе у нас есть символьные ссылки, FAT32 их не поддерживает, поэтому будут предупреждения, которые нужно просто проигнорировать.

ISO образ теперь можно отключить.

Для того, что бы флешка могла загрузиться, нужно установить Bootloader. В качестве оного используется syslinux и его части мы уже стянули с ISO образа, и для начала нужно их откорректировать:

  1. Открываем /run/media/hatred/UBUNTU/syslinux/txt.cfg для редактирования
  2. Заменяем все вхождения “/cdrom” пустой строкой ("")
  3. Копируем первую label секцию и вставляем её самой первой, после чего:
    1. Аргумент label заменяем имя на persistent, можно любое другое, но сейчас работаем с этим
    2. Аргумент menu label заменяем на что-то человеко-понятное и описательное, например: “^Use Ubuntu in persistent mode”
    3. К строке append необходимо добавить аргумент persistent, лучшее место для этого - перед initrd=...
  4. Аргумент для default стоит заменить на persistent, что бы наша флешка грузилась с сохранением состояния автоматически.

Собственно шаг 3.3 и говорит загрузочным скриптам попытаться найти раздел с именем casper-rw, примонтировать его и использовать как оверлей для сохранения состояния файловой системы.

В моём случае полная конфигурация получилась такой:

default persistent
label persistent
  menu label ^Use Ubuntu in persistent mode
  kernel /casper/vmlinuz
  append  file=/preseed/ubuntu.seed persistent initrd=/casper/initrd quiet splash ---
label live
  menu label ^Try Ubuntu without installing
  kernel /casper/vmlinuz
  append  file=/preseed/ubuntu.seed initrd=/casper/initrd quiet splash ---
label live-nomodeset
  menu label ^Try Ubuntu without installing (safe graphics)
  kernel /casper/vmlinuz
  append  file=/preseed/ubuntu.seed initrd=/casper/initrd quiet splash nomodeset ---
label live-install
  menu label ^Install Ubuntu
  kernel /casper/vmlinuz
  append  file=/preseed/ubuntu.seed only-ubiquity initrd=/casper/initrd quiet splash ---
label live-install-nomodeset
  menu label ^Install Ubuntu (safe graphics)
  kernel /casper/vmlinuz
  append  file=/preseed/ubuntu.seed only-ubiquity initrd=/casper/initrd quiet splash nomodeset ---
label memtest
  menu label Test ^memory
  kernel /install/mt86plus
label hd
  menu label ^Boot from first hard disk
  localboot 0x80

На этом с конфигурацией загрузчика мы закончили, теперь нужно его и поставить. Для этого нам нужны пакеты syslinux и mtools:

sudo pacman -S syslinux mtools

Ну и отключаем наш раздел с Ubuntu, можно мышкой по меняюшкам или:

umount /run/media/hatred/UBUNTU/

Да, нужно посмотреть, что за устройство соответствует этому разделу. Например, через dmesg или через mount до отключения раздела. У меня это /dev/sdc1, но напишу в обобщённом виде, дабы не затереть чего:

# X меняем на нужную букву
sudo syslinux /dev/sdX1

Делаем магию (да, олдфаговая привычка):

sync
sync
sync

Извлекаем флешку и идём грузиться.

Enjoy!