systemd-nspawn как альтернатива chroot ... ?

Мне не нравится chroot по причине
- сложностью запуска - вопрос, конечно, спорный, но я обычно использовал его запуск по старинке и приходилось вводить кучу команд
- не удобством использования - все-таки голая консоль и проблемы с просмотром информации, всего не упомнишь и лучше скопировать/вставить, чем набирать в консоле
- ну и частенько нужен интерент - что то посмотреть, скачать и др.
И вот нашел альтернативу chroot - systemd-nspawn - эта штуковина более мощная, чем chroot, и дает намного больше возможностей, описывать нет смысла, отсылаю к Wiki, да и статей по ее использованию дополна.
Само использоание systemd-nspawn для других целей вообщем то не так и просто, нужно разбираться, а вот вместо chroot и для восстановления неработающей системы довольно просто и удобно.
Запускать можно и с archiso и с других мест, но очень удобно запускать с systemrescuecd, сделан на основе Archlinux, но главное то, что набрав startx, попадаешь в DE Xfce и получаешь намного больше возможностей, чем в простой консоле.
Опишу подробнее запуск и работу в systemd-nspawn, а для начала попорчу свою систему, ну не очень так, а слегка … просто удалю ядро
Смотрим, что имеется в /boot
ls /boot | grep linux
initramfs-linux-lts.img
initramfs-linux.img
vmlinuz-linux
vmlinuz-linux-lts
Переместим vmlinuz-linux в другое место - sudo mv /boot/vmlinuz-linux /ISO
Reboot - и разумеется не получилось - логи сообщили, что сначала загрузите ядро.
Вставляем мультизагрузочную флешку, на которой два образа archlinux-2020.08.01-x86_64.iso и systemrescuecd-amd64-6.1.5.iso и плюс папка с разными полезными файлами … Загружаемся в systemrescuecd и после загрузки в консоль набираем startx и попадаем в Xfce.
Первым делом настраиваем интернет.
Далее открываю файл-менеджер и перехожу в папку с файлами на флэшке (точно не помню, но вроде бы по пути /run/archiso/dev_img/…) и открываю файл-напоминалку по работе с systemd-nspawn.
Далее открываю терминал и копирую в него команды из открытого ранее файла
mkdir /mnt/systemd_nspawn
mount /dev/sda3 /mnt/systemd_nspawn
sudo systemd-nspawn --directory /mnt/systemd_nspawn --boot -- --unit rescue.target
Так как запускаю систему не в default mode, а в rescue mode (так удобнее), то нам предложат ввести пароль root, водим и попадаем в rescue mode
Для удобства сохранения логов, после того, как загрузился в систему, открыл новый файл ~/test_systemd-nspawn.txt и стал копировать в него все вводимые команды и выводы … в принципе и мне так удобнее - не писать самому - привожу содержание этого файла (уже из восстановленной системы) - лишнее убрал
[root@sysresccd ~]# mkdir /mnt/systemd_nspawn
[root@sysresccd ~]# mount /dev/sda3 /mnt/systemd_nspawn
[root@sysresccd ~]#  sudo systemd-nspawn --directory /mnt/systemd_nspawn --boot -- --unit rescue.target
Spawning container systemdnspawn on /mnt/systemd_nspawn.
Press ^] three times within 1s to kill container.
Detected virtualization systemd-nspawn.
Detected architecture x86-64.

Welcome to Arch Linux!
…. ……...
Queued start job for default target Rescue Mode.
…………..
[  OK  ] Started Rescue Shell.
[  OK  ] Reached target Rescue Mode.
You are in rescue mode. After logging in, type "journalctl -xb" to view
system logs, "systemctl reboot" to reboot, "systemctl default" or "exit"
to boot into default mode.
Dlya prodolzheniya vvedite parol` root
(ili nazhmite Control-D dlya prodolzheniya):
root #
и после ввода пароля root мы в rescue mode …
далее в этом же терминале смотрим, что у нас в /boot
ls /boot
grub  initramfs-linux-lts.img  initramfs-linux.img  memdisk  vmlinuz-linux-lts
ядра нет, но сначала попробуем обновиться и если все будет нормально, то установим linux

PS - напоминаю, что в любой момент можно перейти в любое приложение systemrescuecd - браузер, файловый менеджер и др., а потом снова вернутся в терминал, в нашу систему ... и можно запустить MC, что тоже очень удобно.

Пробуем обновиться
root # pacman -Syu
:: Обновление баз данных пакетов...
 core не устарел
 extra                 1637,0 KiB   930 KiB/s 00:02 [###########################] 100%
 community                5,3 MiB   964 KiB/s 00:06 [###########################] 100%
 multilib не устарел
ошибка: не удалось получить файл 'archlinuxcn.db' из cdn.repo.archlinuxcn.org : Resolving timed out after 10000 milliseconds
ошибка: не удалось обновить archlinuxcn (ошибка в библиотеке загрузки)
ошибка: failed to synchronize all databases
Затык с repo archlinuxcn - иногда с ним такое бывает - я обычно запускаю снова
root # pacman -Syu
:: Обновление баз данных пакетов...
 core не устарел
 extra не устарел
 community не устарел
 multilib не устарел
 archlinuxcn           1432,4 KiB  1031 KiB/s 00:01 [###########################] 100%
:: Запускается полное обновление системы...
……………...
Пакеты (1) imagemagick-7.0.10.45-1
Будет загружено:  2,54 MiB
Будет установлено:  9,85 MiB
:: Приступить к установке? [Y/n] y
Вроде все работает … и далее ставим пакет linux
root # pacman -S linux
предупреждение: linux-5.9.11.arch2-1 не устарел -- переустанавливается
разрешение зависимостей...
проверка конфликтов...
Пакеты (1) linux-5.9.11.arch2-1
Будет загружено:  73,85 MiB
Будет установлено:  79,08 MiB
Изменение размера:   0,00 MiB
:: Приступить к установке? [Y/n] y
………...
==> finished: 1 packages removed (disk space saved: 73.85 MiB)
На этом закончим … самое главное: ВЫХОД - не забываем завершить работу контейнера и размонтировать раздел
1. poweroff … или как написано в логе - Press ^] three times within 1s to kill containe, но надежнее poweroff
[  OK  ] Stopped target Rescue Mode.
...................................
[  OK  ] Finished Power-Off.
[  OK  ] Reached target Power-Off.
exit
Container systemdnspawn has been shut down.
[root@sysresccd ~]#
и видим, что попадаем в окружение sysresccd
2. umont /dev/sda3

Далее перегружаемся и пробуем загрузиться в систему ... все нормально … проверяемся
sudo pacman -Syu
:: Обновление баз данных пакетов...
 core не устарел
 extra не устарел
 community не устарел
 multilib не устарел
 archlinuxcn не устарел
:: Запускается полное обновление системы...
предупреждение: firefox: пропуск обновления пакета (56.0.2-1 => 83.0-2)
 делать больше нечего

Специально описал подробно, чтобы было нагляднее ... ничего доустанавливать не нужно ...
Может кому то удобнее и chroot, а кому то будет удобнее systemd-nspawn … выбор за Вами
Ошибки не исчезают с опытом - они просто умнеют
vasek
приходилось вводить кучу команд
Дык они уже вводятся на уровне рефлексов.
Но для ленивых есть arch-chroot (arch-install-scripts).
Aivar
Дык они уже вводятся на уровне рефлексов.
Но для ленивых есть arch-chroot (arch-install-scripts).
У меня уже и рефлексов то нет - все забывается и даже нет желания работать с Live USB … для меня намного удобнее иметь нормальную Linux систему вместо этого Live USB … что я и делаю - имеется backup системы Arch (практически не обновляется), которую намного проще использовать для этих целей
lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT,LABEL,UUID
├─sda2  75,3G ext4              Archlinux_backup   dfd6597d-d346-4e7d-8393-52b614083b1f
├─sda3  70,3G ext4   /          ArchLinux               e4a612f9-f62c-4303-b81e-190d29d40f75
Ошибки не исчезают с опытом - они просто умнеют
Aivar
arch-chroot
+
Хотя наверно не всегда арч ремонтируется.
А вот с загрузкой из бекапа, по удобству имхо ничего не сравнится, уже все настроено так как нравится и привычно.
А 20 - 50гиг при нынешних дисках, флешках это не проблема. Вот только на разных дисках хранить при возможности.
vs220
наверно не всегда арч ремонтируется
да вообщем то он сам практически и не ломается ... но приходится частенько насиловать систему самому (разного рода эксперименты) - а с этим chroot и Live USB одна морока - намного проще зайти в другую систему, в ту же backup, и из нее просто переместить нужные файла в нужное место, а если для этого нужны операции, связанные с интеренетом и др., то прямо из этой же системы backup очень быстро, используя systemd-nswap, попадаешь прямо в нужную систему.
Ошибки не исчезают с опытом - они просто умнеют
vasek
а если для этого нужны операции, связанные с интеренетом и др., то прямо из этой же системы backup очень быстро, используя systemd-nswap, попадаешь прямо в нужную систему.
ничего не понял,чем удобнее.
загружаешся с любой,хоть с жесткого диска,хоть с systemrescuecd системы,через chroot подключаешь раздел с Arch и делай что хочешь,копируй,обновляй,устанавливай и удаляй пакеты без всякого systemd-nspawn,и интернет при этом есть.
я когда неохота перезагружаться прямо из Debian спокойно обновляю Arch на другом разделе,и наоборот,и вообще все что угодно сделаю с другой системой.мне кажется все намного проще и удобней чем с systemd-nswap.
Linux Forever!
Vadim
мне кажется все намного проще и удобней чем с systemd-nswap.
Это дело вкуса - уже отмечал, что делаю chroot по-старинке и скриптов не использую (даже не установлены)
И у меня переход из одной системы в другую выглядит так
1. chroot из системы в другую систему
Вход
sudo mkdir /mnt/arch
sudo mount /dev/sda2 /mnt/arch
cd /mnt/arch
sudo mount -t proc proc proc/
sudo mount -t sysfs sys sys/
sudo mount -o bind /dev dev/
sudo chroot /mnt/arch bin/bash
Выход
exit
cd ~
sudo umount --recursive /mnt/arch

2. systemd-nspawn из системы в другую систему
Вход
sudo mkdir /mnt/arch
sudo mount /dev/sda2 /mnt/arch
sudo systemd-nspawn --directory /mnt/arch --boot -- --unit rescue.target
Выход
poweroff
sudo umount /mnt/arch
и для меня проще 2-ой вариант ... это не говоря о безопасности и возможностях.

EDIT 1 - еще одна из причин, по которой открыл этот топик - неоднократно замечал, что многие новички не очень хорошо справляются с chroot и боятся его выполнять.
Ошибки не исчезают с опытом - они просто умнеют
vasek
2. systemd-nspawn из системы в другую систему

[anode@TM-8481 ~]$ su -
Пароль:
[root@TM-8481 ~]# mount /dev/sda7 /mnt
[root@TM-8481 ~]# ls /mnt
bin   crux  etc   lib    lib64       mnt  proc  run   seven  tmp  var
boot  dev   home  lib32  lost+found  opt  root  sbin  sys    usr
[root@TM-8481 ~]# systemd-nspawn --directory /mnt --boot -- --unit rescue.target
Directory /mnt doesn't look like an OS root directory (os-release file is missing). Refusing.
[root@TM-8481 ~]#
[root@TM-8481 ~]# systemd-nspawn --directory /mnt
Spawning container mnt on /mnt.
Press ^] three times within 1s to kill container.
-bash-5.0# blkid
-bash-5.0# ls -l /dev | grep sda
-bash-5.0# ls /dev
char     core  full    net   ptmx  random  stderr  stdout  urandom
console  fd    mqueue  null  pts   shm     stdin   tty     zero
Т.е. швейцарский нож не такой уж и универсальный? Или я что-то не так делаю?
Дедовский метод.

[root@TM-8481 ~]# arch-chroot /mnt
bash-5.0# blkid
bash: blkid: command not found
bash-5.0# /sbin/blk
blkdeactivate  blkdiscard     blkid          blkzone
bash-5.0# /sbin/blkid
/dev/sda1: LABEL="CRUX32" UUID="2c67c694-bc2e-4eef-af06-cd5d52aebb81" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="01e83624-01"
/dev/sda2: BLOCK_SIZE="512" UUID="360E92E90E92A183" TYPE="ntfs" PARTUUID="01e83624-02"
/dev/sda3: LABEL="SWAP" UUID="767329c9-83c1-4b06-8bbd-f76e337b69a2" TYPE="swap" PARTUUID="01e83624-03"
/dev/sda5: LABEL="ARCH" UUID="10bf8759-a8b3-4a8e-90aa-a000007d7a73" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="01e83624-05"
/dev/sda6: LABEL="HOME" UUID="d7d7593e-81cc-48ae-8fe0-78f5e5c55df0" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="01e83624-06"
/dev/sda7: LABEL="CRUX64" UUID="ce28283b-8ca9-4ee3-92be-02922b27a10c" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="01e83624-07"
/dev/mmcblk0p1: SEC_TYPE="msdos" LABEL="SD1G" UUID="5859-D7EE" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="ff989d1d-01"
bash-5.0#
anode, почему не получается, точно сказать не могу - не нравится os-release, а уж почему не нравится, нужно смотреть конкретно.
Может что то с файлами /usr/lib/os-release, /etc/os-release - возможно в CRUX64 они другие или это симлинки и др.
И еще не соображу, сейчас этот дистр без systemd? - правда даже и не знаю, важно ли это.

PS - лучше su не использовать ...

PSS - насколько я понял, многим больше нравится chroot, хотя это и понятно - все новое внедряется не сразу ...

EDIT 1 - я экспериментировал только с Arch, просто других систем сейчас не стоит - наигрался и все снес, взамен поставил backup Arch.
Вот с чем бы поигрался, так это с микроядерной ОС, но пока достойной нет.

EDIT 2 - ... вот что прописано в man в части os-release
As a safety check systemd-nspawn will verify the existence of /usr/lib/os-release or /etc/os-release in the container tree before starting the container (see os-release(5)). It might be necessary to add this file to the container tree manually if the OS of the container is too old to contain this file out-of-the-box.
Ошибки не исчезают с опытом - они просто умнеют
vasek
лучше su не использовать …
аргументы?

vasek
этот дистр без systemd? - правда даже и не знаю, важно ли это.
Не просто важно, а как говАривал дедушка Лёнарт: Архи важно! Всех, кто не использует СистемДЭ к стенке! )))
ЗЫ. А особенно меня пугает, что сиськадэ - это уже не система инициализации, а:
suite of basic building blocks for a Linux system
 
Зарегистрироваться или войдите чтобы оставить сообщение.