Содержание статьи
- Подготовка
- Создаем пустой файл под размер флешки
- Создаем разметку диска
- Монтируем в систему созданный образ
- Форматируем разделы
- Монтируем разделы в /mnt/usb
- Копируем airootfs
- Перевод некоторых файлов на русский (необязательно)
- Ставим пакеты
- Докручиваем настройки
- Ставим загрузчики
- Настраиваем журналирование
- Дополнительное действие
- Задаем пароль рута (необязательно)
- Образ готов, демонтируем устройства
- Пишем образ на флешку
- Тестируем образ в QEMU (необязательно)
- Выводы
- Бонус
У каждого линуксоида есть любимая система. У некоторых даже несколько, каждая — для особых задач. Один из таких специальных случаев — это портативная система, которую можно загрузить на чужой машине или на твоей, если основная ОС вдруг перестала работать нормально.
Есть множество готовых разработок, предназначенных как раз для решения таких задач. Но мы‑то хотим получить полностью кастомизированное окружение — привычное и с набором нужных программ!
Варианта здесь два: сделать загрузочный образ ISO либо просто установить всё на флешку. В первом случае система будет в разы компактнее, во втором мы получим важную возможность ставить и удалять программы и менять настройки во время работы.
Да, флешка будет изнашиваться, но стоят они сейчас недорого, и возможность работы с полноценной ОС, на мой взгляд, гораздо важнее.
Подготовка
Все работы я буду проводить на Arch Linux для x86-64 и возьму оригинальные archiso, которые используются для создания официальных ISO-образов.
Поэтому в систему должны быть установлены следующие пакеты: archiso, arch-install-scripts, gptfdisk.
Можно как сразу установить на USB-накопитель, так и создать образ диска, который потом можно будет записать на флешку. Далее я опишу процесс создания образа диска.
Создаем пустой файл под размер флешки
Переходим в каталог, где будем создавать наш образ.
cd ~
Все дальнейшие действия будем делать с привилегиями суперпользователя.
su
Чтобы тебе было легче ориентироваться, буду показывать вывод некоторых команд.
Узнать точный размер устройства можно командой
lsblk -bo NAME,SIZE
lsblk -bo NAME,SIZE
NAME SIZE
sda4005527552
├─sda1 10485760
├─sda2 268435456
└─sda3 3725540864
mmcblk0 62226694144
├─mmcblk0p1 209715200
└─mmcblk0p2 62015930368
Она покажет все устройства, среди них тебе нужно найти свой USB-накопитель.
Узнав номер устройства, ты можешь составить команду и задать нужный размер файла. Делим размер на 4096 и получаем нужное количество блоков.
Примеры:
16 Гб: 16034824192 / 4096 = 3914752
4 Гб: 4005527552 / 4096 = 977912
4096 — это обычный размер сектора для файловой системы.
Команда для создания файла usb.
размером 4 Гбайт:
dd if=/dev/zero of=usb.img bs=4096 count=977912 status=progress
$ dd if=/dev/zero of=usb.img bs=4096 count=977912 status=progress
3651747840 байт (3,7 GB, 3,4 GiB) скопирован, 8 s, 456 MB/s
977912+0 записей получено
977912+0 записей отправлено
4005527552 байт (4,0 GB, 3,7 GiB) скопирован, 8,78378 s, 456 MB/s
Проверяем:
ls -la usb.img
$ ls -la usb.img
-rw-rw-r-- 1 root root 4005527552 апр 25 19:51 usb.img
Если файл получился больше, можно обрезать до нужной длины с помощью truncate
. Например, до 16 Гбайт:
truncate -s 16034824192 usb.img
Создаем разметку диска
Чтобы наша система могла загружаться на компьютерах и с BIOS, и с EFI, нам нужно разметить диск на три раздела:
- один — 10 Мбайт, без файловой системы, необходим для установки загрузчика GRUB в режиме BIOS;
- второй — 256 Мбайт, будет отформатирован в FAT32, здесь создадим раздел
boot
и поставим GRUB в режиме EFI; - все оставшееся место отдадим корневой файловой системе. Отформатируем ее в Ext4.
Создаем разметку GPT и делим диск на три раздела:
sgdisk -o -n 1:0:+10M -t 1:EF02 -n 2:0:+256M -t 2:EF00 -n 3:0:0 -t 3:8300 usb.img
$ sgdisk -o -n 1:0:+10M -t 1:EF02 -n 2:0:+256M -t 2:EF00 -n 3:0:0 -t 3:8300 usb.img
Creating new GPT entries in memory.
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot or after you
run partprobe(8) or kpartx(8)
The operation has completed successfully.
Монтируем в систему созданный образ
Создаем связь между файлом образа usb.
и устройством loopback. Это позволяет работать с файлом образа так, как если бы он был физическим устройством, например USB-накопителем.
losetup --show -Pf usb.img
$ losetup --show -Pf usb.img
/dev/loop0
Команда покажет имя созданного устройства, в данном случае это /
.
Проверяем.
ls /dev/loop0*
$ ls /dev/loop0*
/dev/loop0
/dev/loop0p1
/dev/loop0p2
/dev/loop0p3
У нашего образа должно быть три раздела: loop0p1
, loop0p2
, loop0p3
.
Форматируем разделы
По стандарту раздел EFI должен быть отформатирован в FAT32.
mkfs.fat -F32 /dev/loop0p2
$ mkfs.fat -F32 /dev/loop0p2
mkfs.fat 4.2 (2021-01-31)
Третий раздел будет основным, для него можно выбрать любую ФС, которую будут поддерживать и загрузчик, и ядро.
Форматируем в Ext4:
mkfs.ext4 /dev/loop0p3
$ mkfs.ext4 /dev/loop0p3
mke2fs 1.46.5 (30-Dec-2021)
...
...
Создание журнала (16384 блоков): готово
Writing superblocks and filesystem accounting information: готово
Монтируем разделы в /mnt/usb
Сначала мы смонтируем раздел /
, это будет наш основной раздел, на который установим систему. Затем на этом разделе мы создадим каталог /
, в который смонтируем раздел /
.
mkdir -p /mnt/usb
mount /dev/loop0p3 /mnt/usb
mkdir /mnt/usb/boot
mount /dev/loop0p2 /mnt/usb/boot
Копируем airootfs
Несколько слов об Archiso. Это инструмент, с помощью которого создают официальные образы Arch Linux. Он состоит из двух частей: скрипта mkarchiso
, который собирает образ, и каталога с настройками будущего образа. Нам нужен будет каталог с конфигами. В нем находятся:
- список пакетов, которые необходимо установить, они хранятся в файле
packages.
;x86_64 - каталог
airootfs
. Его структура идентична структуре Arch Linux, здесь лежат конфиги системы.
Нам три раза придется указывать путь до каталога с настройками Archiso. Чтобы было проще, вынесем путь к нему в переменную.
export ARCHISO=/usr/share/archiso/configs/releng
Копируем настройки официального образа до установки пакетов. Если при установке пакета обнаружится, что конфиг для него уже есть, файл не переписывается, а создается новый с расширением .pacnew. Во время установки пакетов будут показаны предупреждения об этом.
cp -afv $ARCHISO/airootfs/* /mnt/usb/
Перевод некоторых файлов на русский (необязательно)
В своем образе ты можешь поменять приветствие системы на какое хочешь. Файл приветствия — /
. Я сделал (ну ладно, Яндекс сделал) простой перевод исходного файла, ниже — команда, которой его можно заменить.
wget -O /mnt/usb/etc/motd https://gitflic.ru/project/ksandr/archi/blob/raw?file=airootfs/etc/motd
В установочном образе есть команда Installation_guide
, открывающая в консольном текстовом браузере страницу вики по установке системы.
Заменим в ней ссылку, чтобы она указывала на русскоязычный аналог страницы.
sed -i 's/https:\/\/wiki.archlinux.org\/title\/Installation_guide/https:\/\/wiki.archlinux.org\/title\/Installation_guide\(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)/' /mnt/usb/usr/local/bin/Installation_guide
Ставим пакеты
Список пакетов берем из настроек официального образа.
Команда установки:
pacstrap -c -G -M -C $ARCHISO/pacman.conf -- /mnt/usb
Для парсинга списка пакетов подойдет такая команда:
grep -v '^#' $ARCHISO/packages.x86_64 | tr '\n' ' ' | xargs pacstrap -c -G -M -C $ARCHISO/pacman.conf -- /mnt/usb
$ grep -v '^#' packages.x86_64 | tr '\n' ' ' | xargs pacstrap -c -G -M -C pacman.conf -- /mnt/usb
...
...
...
(14/16) Reloading system bus configuration...
Skipped: Running in chroot.
(15/16) Warn about old perl modules
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LC_MESSAGES = "ru_RU.UTF-8",
LANG = "ru_RU.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
(16/16) Updating the info directory file...
Если процесс закончился такими строками, можно идти дальше. Если нет — посмотри, верно ли выполнил каждое действие.
Докручиваем настройки
Основная часть установки совпадает с тем, что написано в официальной вики.
Но чтобы было удобнее пользоваться этой статьей, я позволю себе повторить часть действий из официального руководства.
Генерируем файл /
для нашего образа — список файловых систем, монтируемых при загрузке системы.
genfstab -U /mnt/usb > /mnt/usb/etc/fstab
Переходим в chroot. Это позволит изолировать процесс от остальной системы и создаст виртуальную среду, в которой процесс может вести себя, как будто он работает в отдельной системе.
После выполнения этой команды текущий процесс и все его дочерние процессы будут работать в изолированной среде, корневым каталогом которой будет /
.
arch-chroot /mnt/usb
Нам необходимо отредактировать файл /
.
Если на системе, с которой ты создаешь образ, используется раздел swap, то при генерации файла /
добавится запись о монтировании этого раздела.
Необходимо отключить в fstab раздел swap, если он там есть. Удали или закомментируй строку, которая за него отвечает.
vim /etc/fstab
Также рекомендую изменить параметры монтирования с realtime на noatime, это уменьшает количество операций записи на диск.
Ниже пример файла с внесенными изменениями, значения UUID в твоем файле будут другими.
$ cat /etc/fstab
$ /dev/loop0p3
UUID=d6ef477c-8db7-4b1b-9e55-a28fefbf03c1 / ext4 rw,noatime 0 1
$ /dev/loop0p2
UUID=C963-38B9/boot vfat rw,noatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro0 2
$ /dev/sda1
#UUID=8ac5fbc3-058e-4a18-a084-e68b52c1af46 none swap defaults0 0
Установи свою временную зону.
ln -sf /usr/share/zoneinfo/Europe/Moscow /etc/localtime
Файл /
содержит списки доступных локализаций системы, рекомендую оставить эти две:
en_US.UTF-8 UTF-8
ru_RU.UTF-8 UTF-8
Сгенерируй файлы локализации.
locale-gen
Установи общесистемное значение переменной LANG
.
echo LANG=ru_RU.UTF-8 > /etc/locale.conf
Установи шрифт и параметры изменения раскладки.
В файл /
запиши:
KEYMAP=ru
FONT=cyr-sun16
info
Некоторые из манипуляций, описанных в этом разделе, можно проделать сразу с каталогом archiso, тогда при установке будет меньше действий.
Ставим загрузчики
Начать надо с создания начального загрузочного диска системы.
Отредактируй файл предустановки /
.
Мы будем использовать стандартный файл настроек mkinitcpio
, так что измени строку, указывающую на конфиг.
vim /etc/mkinitcpio.d/linux.preset
$ mkinitcpio preset file for the 'linux' package on archiso
PRESETS=('archiso')
ALL_kver='/boot/vmlinuz-linux'
archiso_config='/etc/mkinitcpio.conf'
archiso_image="/boot/initramfs-linux.img"
Отредактируй файл настроек mkinitcpio
. В параметре HOOKS
необходимо убрать autodetect
.
vim /etc/mkinitcpio.conf
...
HOOKS=(base udev microcode modconf kms keyboard keymap consolefont block filesystems fsck)
...
Пересоздай образ initcpio.
info
Образ mkinitcpio в Arch Linux — это сгенерированный скриптом mkinitcpio образ, который содержит все необходимые для загрузки и инициализации системы файлы и скрипты. Этот образ используется в процессе загрузки системы, когда ядро Linux загружается, но перед тем, как полностью инициализировать систему и передать управление пользовательскому пространству.
mkinitcpio -P
$ mkinitcpio -P
==> Building image from preset: /etc/mkinitcpio.d/linux.preset: 'archiso'
...
==> Initcpio image generation successful
Устанавливаем загрузчик для систем с BIOS. Он ставится в начало диска, для этого мы и создавали первый раздел.
Обрати внимание: в команде указан диск, а не раздел диска!
grub-install --target=i386-pc --recheck /dev/loop0
$ grub-install --target=i386-pc --recheck /dev/loop0
Выполняется установка для платформы i386-pc.
Установка завершена. Ошибок нет.
Устанавливаем загрузчик для систем с EFI.
grub-install --target=x86_64-efi --efi-directory /boot --recheck --removable
$ grub-install --target=x86_64-efi --efi-directory /boot --recheck --removable
Выполняется установка для платформы x86_64-efi.
Установка завершена. Ошибок нет.
Создаем файл с настройками загрузчика.
grub-mkconfig -o /boot/grub/grub.cfg
$ grub-mkconfig -o /boot/grub/grub.cfg
Генерируется файл настройки grub …
Найден образ linux: /boot/vmlinuz-linux
Найден образ initrd: /boot/intel-ucode.img /boot/amd-ucode.img /boot/initramfs-linux.img
Предупреждение: os-prober не будет запущен для обнаружения других загрузочных разделов.
Их системы не будут добавлены в загрузочные настройки GRUB.
Прочтите документацию на параметр GRUB_DISABLE_OS_PROBER.
Добавляется элемент загрузочного меню для настроек микропрограммы UEFI …
Found memtest86+ image: /boot/memtest86+/memtest.bin
/usr/bin/grub-probe: предупреждение: неизвестный тип устройства loop0.
Found memtest86+ EFI image: /boot/memtest86+/memtest.efi
/usr/bin/grub-probe: предупреждение: неизвестный тип устройства loop0.
завершено
Как ты уже понял, мы установили два загрузчика, и оба они обращаются к одному конфигурационному файлу.
В официальном ISO-образе Arch Linux используется загрузчик Syslinux. Можно было бы использовать и его, это дело вкуса. Я выбрал более простой в настройке вариант.
Настраиваем журналирование
Чтобы уменьшить количество обращений к диску, настраиваем журналирование в оперативную память, а не на диск.
Создаем каталог:
mkdir -p /etc/systemd/journald.conf.d
Записываем настройки ниже в файл /
:
[Journal]Storage=volatileSystemMaxUse=16MRuntimeMaxUse=32M
Дополнительное действие
При создании ISO-образа диска при помощи mkarchiso часть настроек делается при помощи «хуков» (сценариев командной строки) менеджера пакетов pacman. Эти хуки удаляются при создании ISO.
Так как мы собираем образ сами, нам нужно удалить некоторые хуки вручную.
rm -v -- $(grep -Frl 'remove from airootfs' /etc/pacman.d/hooks/)
Задаем пароль рута (необязательно)
По умолчанию пароль для root отсутствует, ты можешь установить свой. При загрузке происходит автоматический вход с логином root.
SSH-доступ для root тоже открыт по умолчанию.
passwd
$ passwd
Новый пароль:
Повторите ввод нового пароля:
passwd: пароль успешно обновлён
Еще можно создать обычного пользователя.
Образ готов, демонтируем устройства
Выходим из chroot.
exit
Размонтируем разделы в обратной последовательности.
umount /mnt/usb/boot
umount /mnt/usb
Деактивируем привязку устройства loop к файлу usb.
.
losetup -D
Пишем образ на флешку
Внимание! Если до этого момента ты еще не сломал свою систему, то сейчас будет отличный шанс. Так что будь предельно осторожен.
www
Детальное описание записи образа есть в официальной вики.
Подключаем USB-носитель к системе и набираем команду
lsblk -piaf
Ищем USB-носитель в списке, запоминаем номер.
И записываем на него образ. В указанной ниже команде поменяй значение параметра of=/
(вместо X подставь букву твоего диска).
dd if=usb.img of=/dev/sdX bs=4096 status=progress && sync
Выходи из окружения root:
exit
Тестируем образ в QEMU (необязательно)
Чтобы проверить, как работает наш образ, мы можем запустить его в эмуляторе.
Далее в этом разделе предполагается, что у тебя установлены эти пакеты:
qemu-base tigervnc openbsd-netcat
Запустить виртуальную машину из созданного образа ты можешь такой командой:
qemu-system-x86_64 -drive file=usb.img,format=raw -m 1024 -enable-kvm -monitor unix:/tmp/monitor.sock,server,nowait
VNC server running on 127.0.0.1:5901
Подключиться к виртуальной машине можно, используя любой клиент VNC.
В случае с TigerVNC команда подключения будет следующей:
vncviewer 127.0.0.1:5901
TigerVNC Viewer v1.13.1
Сборка от: 2024-01-20 02:29
Copyright (C) 1999-2022, TigerVNC Team и многие другие (см. README.rst)
Информация о TigerVNC на сайте https://www.tigervnc.org
...
Для подключения к консоли управления виртуальной машины можешь использовать, например, nc.
nc -U /tmp/monitor.sock
QEMU 9.0.0 monitor - type 'help' for more information
(qemu)
Выводы
У нас есть файл с установочным образом системы, который можно записать на любые носители. Но самое главное — загрузившись с него, ты сможешь ставить в систему дополнительные пакеты и делать любые настройки, нужные для твоих задач.
Я взял флешку на 4 Гбайт, и после всех действий на ней осталось 1,2 Гбайт свободного места.
Бонус
Этот метод создания образа диска универсален, его можно использовать с разными конфигурациями Archiso. Например, с Сtlos, одной из отечественных сборок Arch Linux.
Автор Сtlos использует собственный репозиторий для некоторых пакетов, на странице проекта есть инструкция по его подключению.
В качестве альтернативы можно отредактировать файл pacman.
(из каталога с настройками), указав в нем дополнительный репозиторий и отключив проверку подписи пакетов.
Вот в качестве примера фрагмент измененного файла pacman.
:
...[ctlos_repo]SigLevel = Optional TrustAllServer = https://github.com/ctlos/$repo/raw/master/$archServer = https://osdn.net/projects/ctlos/storage/$repo/$archServer = https://cvc.keybase.pub/$repo#Include = /etc/pacman.d/ctlos-mirrorlist[ctlos-aur]SigLevel = Optional TrustAllServer = https://github.com/ctlos/$repo/raw/master/$archServer = https://osdn.net/projects/ctlos/storage/$repo/$archServer = https://cvc.keybase.pub/$repo#Include = /etc/pacman.d/ctlos-mirrorlist
Важный момент: клонировать удаленный репозиторий лучше из‑под root, поскольку все файлы в каталоге с настройками должны принадлежать руту.