Учебники (How-To & F.A.Q)
   2002

МУЛЬТИ-УСТАНОВКА дистрибутивов Linux НА ОДИН РАЗДЕЛ в SUBVOLUME-BTRFS на примере Дистрибутива MANJARO

Статья детально описывает процесс установки со всеми пояснениями. Автор рассчитывает достучаться до начинающих пользователей тоже, поэтому, просьба сильно не критиковать подход :)


МУЛЬТИ-УСТАНОВКА дистрибутивов Linux НА ОДИН РАЗДЕЛ в SUBVOLUME-BTRFS на примере Дистрибутива MANJARO с мульти-загрузкой двух или даже многоуровнего GRUB загрузчика для каждого дистрибутива. Все мы привыкли к ситуациям, когда на одном ПК у нас стоит один Linux дистрибутив и например Windows дистрибутив. Иногда системы три, иногда четыре, но это бывает редко. В основном этот подход подразумевает под собой установку разных операционных систем или разных дистрибутивов на разные разделы ваших дисков. Но что если я сейчас вам покажу то, что различные Linux дистрибутивы или один дистрибутив с различными десктопами и для различных нужд могут уживаться на одном единственном разделе и при этом каждый будет жить своей собственной жизнью, а каталог пользователя и его подкаталоги будут объедены в один общий? Такого не может быть? Ну что же, давайте посмотрим :)

Все тесты проводились на дистрибутиве MANJARO KDE, но по сути, не имеет никакого значения какой из доступных дистрибутивов MANJARO выберете вы!

Для начала грузимся с лайв CD/USB, после чего открываем консоль, получаем постоянные root права на эту сессию через «sudo su -» и начинаем :) Нам нужно выполнить разметку диска и присвоить каждому разделу код файловой системы и название. Для этого будем последовательно использовать 2 программы, потому что в одной проще сделать разметку, а во второй присвоить коды и дать название разделам. Опытные пользователи могут выбрать свой вариант.

1. Создаем GPT метку диска утилитой «parted» — нажимаем — «p» — на экран будет выведена информация о разделах и если они есть, то удаляем их командой «rm» — где «1» это номер раздела. Команду нужно повторить для всех разделов. Их список мы смотрели на предыдущем шаге командой «p».
Теперь создаем разметку GPT, пишем «mklabel gpt» — «yes» — «q» и «ENTER»
# parted /dev/sda

2. Запускаем программу разметки диска
# cfdisk /dev/sda

2. Создаём раздел на 31МБ для будущего GRUB загрузчика. Нажимаем — «Новый» — пишем «31M» — выбираем тип файловой системы «EFI»

По этому же принципу делаем остальные разделы

3. Создаём раздел на 128МБ для будущего /BOOT раздела. Переключаемся на неразмеченную область — «Новый» — пишем «128M» — выбираем тип файловой системы «BIOS boot»

4. Создаём раздел на 50ГБ для будущего / раздела систем (у меня на виртуалке для наглядного примера это 25ГБ), переключаемся на неразмеченную область — «Новый» — пишем «50G» и «ENTER»

Дополнительные возможности
Установленных систем разных или одного дистрибутива может быть 2! на 50GB или даже 3! Тут есть один нюанс — если у вас имеется в наличии например 1SSD на 128ГБ или 256ГБ и 2SSD или HDD на 1ТБ например для /DATA файлов (по сути будущие подкаталоги /home/user/.., то можете в этом пункте отдать под этот раздел 100ГБ. Чем больше места будет в корне, тем большее кол-во разных дистрибутивов или копий одного дистрибутива вы сможете на него установить. Если конечно вам это нужно. Тут важно понимать, что /DATA (это /home/user/..) у нас будет (5) пятым разделом и места под него должно быть достаточно для ВАШИХ нужд! Например у меня на рабочей системе для этого раздела выделен отдельный HDD на 1TB и мне этого хватает для всего что мне нужно.

5. Создаём раздел на RAM+2GB (у меня на виртуалке это 4+2, вы рассчитывайте свой объём оперативной памяти и прибавляйте 2GB), переключаемся на неразмеченную область — «Новый» — пишем «размер равный вашей оперативной памяти + 2ГБ» и «ENTER» — выбираем тип файловой системы «Linux своп»

6. Создаём раздел на всё остальное место для /DATA (будущий /home/user/..), переключаемся на неразмеченную область — «Новый» — жмем «ENTER» чтобы выбрать оставшееся место на диске под будущий /DATA раздел. Нажимаем «Запись» пишем «yes» и нажимаем «ENTER» а после «Выход»

7. Запускаем программу разметки диска # gdisk /dev/sda — и далее присваиваем для каждого раздела код файловой системы и метку раздела (не путайте с меткой диска, это мы сделаем чуть позже при форматировании разделов), всё цифры и имена набираем с клавиатуры.
t - 1 - EF02 - ENTER
t - 2 - 8300 - ENTER
t - 3 - 8300 - ENTER
t - 4 - 8200 - ENTER
t - 5 - 8300 - ENTER

c - 1 - UEFI   - ENTER
c - 2 - BOOT   - ENTER
c - 3 - SYSTEM - ENTER
c - 4 - SWAP   - ENTER
c - 5 - DATA   - ENTER

Теперь нажмите p чтобы проверить всё ли вышло правильно. Должны увидеть что-то вроде этого (фото)
Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048           67583    32.0 MiB    EF02  UEFI
   2           67584         2164735   128.0 MiB    8300  BOOT
   3         2164736       107022335    50.0 GiB    8300  SYSTEM
   4       107022336       136382463     6.0 GiB    8200  SWAP
   5       136382464       500118158    18.8 GiB    8300  DATA

Не забудьте сохранить изменения и выйти, для этого нажмите «w» а после «y» и «ENTER»

8. Запускаем графический установщик. В разделе «Клавиатура» рекомендую пока выбрать «English (US)» и нажать «Далее». Второй язык сможете добавить позднее. Выбираем «Ручная разметка» после выбираем "/dev/sda3" и нажимаем «Править» — выбираем «Форматировать» — «Файловая фистема» — «Btrfs» и «Точка монтирования» — "/" чтобы система понимала, на какой раздел нужно производить установку. Потом выбираем "/dev/sda4" и нажимаем «Править» — выбираем «Форматировать» — «Файловая система» — «Область подкачки Linux» и «Точка монтирования» без изменений. После нажимаем «Ок» и «Далее» — настраиваем имена и пароли. На окно с предупреждением нажимаем «ОК» — «Далее» и у вас должно было быть сейчас что-то вроде этого. Ну всё, можем запускать графическую установку, нажимайте «Установить» и «Приступить к установке» а после завершения процесса установки не перезагружайтесь!

9. Далее переходим к настройке GRUB загрузчика, назовём его установку двухуровневой. Что это нам даёт — у каждой системы есть свой взгляд на загрузку и для того, чтобы избежать конфликтов, мы пропишем GRUB на отдельный раздел и он будет передавать управление тому GRUB загрузчику, чью систему мы будем загружать через GRUB меню при старте ПК/Ноутбука.

10. Форматирование раздела под наш загрузчик "-L BOOT" задаёт метку разделу, он же «LABEL» и "-m0" отключает резерв места для записи от пользователя
# mkfs.ext3 -L BOOT -m0 /dev/sda2

11. Создаём каталог BOOT куда будет установлен наш загрузчик
# mkdir /mnt/BOOT

12. Монтируем наш отформатированный раздел по заданной ранее при форматировании метке, то есть по «LABEL»
# mount -L BOOT /mnt/BOOT

13. Так как при установке системы она поставила свою загрузочную запись на /dev/sda, то нам нужно забрать у системного загрузчика управление назад и прописать туда наш
# grub-install --boot-directory=/mnt/BOOT/ /dev/sda

После чего вы должны получить такой ответ:
"Выполняется установка для платформы i386-pc.
Установка завершена. Ошибок нет."

14. Создадим каталог в папке /mnt/
# mkdir /mnt/SUB

15. Присвоим метку разделу, чтобы мы знали, что это системный раздел
# btrfs filesystem label /dev/sda3 SYSTEM

16. Смонтируем наш системный раздел по метке в созданный каталог для доступа к нашим /@SOBVOLUMES — он пригодится нам для будущей работы с нашими субсистемами :)
# mount -L SYSTEM /mnt/SUB

17. Для начала сделаем 2 снимка (SNAPSHOT) нашей системы установленной на /@SUBVOLUMES, она сейчас установлена в каталок "/@" — для этого выполним команду
# btrfs subvolume snapshot /mnt/SUB/@ /mnt/SUB/@MSTABLE
# btrfs subvolume snapshot /mnt/SUB/@ /mnt/SUB/@MSECOND

18. И сразу сделаем бэкап свежеустановленной системы в "/@" для того, чтобы у нас вдруг с ним не вощник конфликт делёжки GRUB конфига и заодно если что, можно будет откатиться к свежачку :)
# mv /mnt/SUB/@ /mnt/SUB/@reserved

Что представляет из себя SNAPSHOT
К слову, снимок системы, то есть SNAPSHOT по факту ничего не весит и не замимает места на вашем SSD или HDD, а так же его создание занимает, ну хорошо если 1 секунду :) Таким образом мы сейчас установили на один раздел 2 копии НЕЗАВИСИМЫХ друг от друга систем! Которые не занимают места на диске. Я думаю из названий снимков уже понятно, какая будет у нас основной, а какая второстепенной. А та система, которая была установлена при установке в "/@" пусть там и лежит. Если что-то пойдёт не так, то мы просто загрузимся с LiveCD/USB или из второй системы "@MSECOND", смонтируем нашу систему в "/mnt/SUB" командой «mount -L SYSTEM /mnt/SUB», переименуем наш SNAPSHOT "/@MSTABLE" в "/@MOLD" и сделаем ещё один снимок (SNAPSHOT) командой «btrfs subvolume snapshot /mnt/SUB/@ /mnt/SUB/@MSTABLE». И не забывайте, SNAPSHOT системы не занимает места на вашем диске, а значит вы можете делать его, например перед обновлением или установкой незнакомого софта или же просто имея желание поэкспериментировать с системой.

19. Теперь нужно прописать в загрузчик временный путь к нашему /@MSTABLE SUBVOLUME, чтобы он загрузил именно эту систему. Сделать это можно следующим образом
# nano -w /mnt/SUB/@MSTABLE/boot/grub/grub.cfg

Находим первую запись в строке с названием "### BEGIN /etc/grub.d/10_linux ###"
И заменяем в этом разделе все "/@" на "/@MSTABLE" — должно получиться вот так

### BEGIN /etc/grub.d/10_linux ###
menuentry 'Manjaro Linux' --class manjaro --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-2282e840-f7a1-4312-b6e9-912ea9f9541c' {
	load_video
	set gfxpayload=keep
	insmod gzio
	insmod part_gpt
	insmod btrfs
	set root='hd0,gpt3'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt3 --hint-efi=hd0,gpt3 --hint-baremetal=ahci0,gpt3  2282e840-f7a1-4312-b6e9-912ea9f9541c
	else
	  search --no-floppy --fs-uuid --set=root 2282e840-f7a1-4312-b6e9-912ea9f9541c
	fi
	linux	/@MSTABLE/boot/vmlinuz-5.10-x86_64 root=UUID=2282e840-f7a1-4312-b6e9-912ea9f9541c rw [email protected]  quiet apparmor=1 security=apparmor udev.log_priority=3
	initrd	/@MSTABLE/boot/intel-ucode.img /@MSTABLE/boot/initramfs-5.10-x86_64.img
}

20. Теперь проделываем всё то же самое со второй системой
# nano -w /mnt/SUB/@MSECOND/boot/grub/grub.cfg

и в конфиг GRUB копируем и вставляем следующий код
# nano -w /mnt/BOOT/grub/grub.cfg

set timeout=5
set default=0

insmod part_gpt
insmod btrfs

menuentry 'Start MANJARO STABLE'{
    configfile (hd0,gpt3)/@MSTABLE/boot/grub/grub.cfg
}
menuentry 'Start MANJARO-SECOND'{
    configfile (hd0,gpt3)/@MSECOND/boot/grub/grub.cfg
}

Естественно, если схема разбивки вашего диска иначе, то «hd0» подгоните под номер вашего диска и «gpt3» под номер раздела на диске :)

Вам нужны доказательства что эти системы не имеют общих папок, что это две абсолютно независимые друг от друга системы? Давайте в @MSTABLE и в @MSECOND создадим в /ROOT/ каталоге по одному файлу и назовём их @MSTABLE-proof и @MSECOND-proof :) а после их загрузки убедимся в том, что это две разные системы на одном разделе!
# touch /mnt/SUB/@MSTABLE/root/@MSTABLE-proof
# touch /mnt/SUB/@MSECOND/root/@MSECOND-proof

21. Теперь даём в консоли команды
# umount /mnt/SUB
# umount /mnt/BOOT
# reboot

22. Загрузились :) запускаем консоль, получаем root права через «sudo su -» и первым делом настраиваем все параметры конкретной загруженной системы под её загрузчик, потом повторяем то же самое для второй системы и перезагружаемся!
# grub-mkconfig -o /boot/grub/grub.cfg

23. Теперь отформатируем наш /DATA раздел, чтобы в последующем перенастроить пути к домашним каталогам пользователей, но для этого выйдет отдельная статья!
# mkfs.btrfs -L DATA /dev/sda5
# mkdir /mnt/BOOT
# mkdir /mnt/SUB


Я немного затупил вконце видео, не понял почему файл оставленный на Рабочем столе одной системы появился на второй ) Но у нас же они идентичные, юзер один и тот же и домашние каталоги общие :) Но это тема отдельной статьи!

На этом мы закончили и как видите, на одном "/dev/sda3" разделе может существовать бесконечное множество дистрибутивов. Сам я около 3 месяцев как перешёл на Линукс и мне посчастливилось познакомиться на канале @calculatelinux в Телеграм с замечательным и умнейшим человеком под ником @Kewol. Именно он рассказал мне о такой возможности и на пальцах показал все преимущества такого подхода, за что ему огромнейшее человеческое спасибо! Он так же написал статью на https://wiki.calculate-linux.org/ru/install_multy_distrs_to_btrfs_subvol/draft (к сожалению её пока не подтвердили, да и писал он больше для себя и для того, чтобы увидеть её, нужно пройти регистрацию). Дело в том, что по всей видимости не каждый дистрибутив умеет сразу ставить себя в /@ SUBVOLUME, но когда мы начали пробовать на MANJARO Linux, то он был очень удивлён, так как на этом дистрибутиве всё встало само собой! Очень надеюсь, что статья вызовет резонанс среди продвинутых пользователей и пригодится новичкам :)

Скоро выложу вторую часть по настройке домашних каталогов на другой раздел диска.
Видеоинструкция тут: www.youtube.com/watch?v=tQvttHujarY

Всем спасибо за внимание и всем добра!

7 комментариев

avatar
wiki.puppyrus.org/soft/arch-initrd?&mkinitcpio-overlayfs_mkinitcpio-lf-overlayfs_mkinitcpio-lf-aufs
Примерно тоже (заморозка), но на aufs(overlayfs)

А это — если надо просто несколько линуксов на одном разделе:
aur.archlinux.org/packages/mkinitcpio-dir/
aur.archlinux.org/cgit/aur.git/tree/subdir_install?h=mkinitcpio-loop-subdir
wiki.puppyrus.org/soft/arch-initrd-rootaufs2rootdir_dirname

Плохо знаком с btrfs. Не знаю где будет физически ее snapshot и что в нем будет
Можно ли слить вместе изменения…
Кто в теме — поясните
Поэтому с плюсами btrfs метода — надо разбираться
Минусы — надо переформатировать в btrfs
0
avatar
Тут по факту не несколько систем получается, а одна. Просто снапшот это ее зеркальная копия, с одним преимуществом, изменения в копии не затрагивают саму систему и фиксируются только в снапшоте.
0
avatar
Вообще оптимальное использование этого метода для тестов к примеру, это поставить только базовую систему, с нее делать снапшоты и вносить изменения.Ставить разные de к примеру. Еще одно но, раздел boot тут вынесен отдельно, то есть это означает что снапшот не содержит в себе ядро системы.И если в снапшоте заменить ядро к примеру, то ядро и поменяется в boot. Что приведет к тому что основная система скорее всего не загрузится, не найдет ядро системы.Починить конечно просто, но чуток головняк. Потому как получаются вовсе не две независимые системы, а одна с разными конфигурациями, но при этом нельзя трогать базовую систему.
Последний раз редактировалось
0
avatar
Немного упрощу опоненту старания.))
Ставим систему как обычно, любой конфигрурации.На btrfs.

После этого монтируем ее ну в mnt примеру.

sudo mount /dev/sdaX /mnt  X само собой раздел где стоит наша система.

Создаем новый subvolume.Название какое угодно.
sudo btrfs subvolume create /mnt/@test
  
Создаем два снапшота системы,можно больше сколько хочется.
sudo btrfs subvolume snapshot /mnt/@ /mnt/@test/mangaro_1
sudo btrfs subvolume snapshot /mnt/@ /mnt/@test/mangaro_2

Размонтируем
sudo umount -R /mnt

Ставим  grub-btrfs
sudo pacman -S grub-btrfs

Обновляем конфигурацию grub

sudo grub-mkconfig -o /boot/grub/grub.cfg 

В конфигурации появиться субраздел для загрузки из созданных снапшотов.

Все можно перегружаться в созданные псевдо системы и делать там что хочется, но не забываем что boot у нас отдельно.) Со всеми вытекающими.

Если home будет отдельно, то не забываем создавать новых пользователей. Для каждой псевдо системы.Ну что бы не было каши с настройками.

Р.с Пользователей нужно создавать до создания снапшота.
Последний раз редактировалось
+1
avatar
Их проще сразу создать :) А ещё наверное проще создать скрипт, который сам создаст необходимых пользователей, добавит их у нужные группы, переназначит пути к каталогам и создаст снапшот системы с названием. и добавит в автозагрузку команду, которая удалит потом целевой каталог )
0
avatar
Вопросы к grub-btrfs
1.0) Всего навсего установить grub-btrfs и сработает?
2.0) Я не совсем понял суть зачем создавать снимки?
2.1) Если у меня уже установлены 2 дистрибутива, то снимки нужны? Или можно обойтись без них?
3.0) ещё такой вопрос. В арч-репозитории grub-btrfs нету. Он же только в АУР. При потыке makepkg -si у меня случилась ошибка. Последние строки пишет;
==> Запускается package()…
install: не удалось выполнить stat для 'localisation/fr/grub-btrfs-git.mo': Нет такого файла или каталога
==> ОШИБКА: Произошел сбой в package().
Прерывание…
Дистрибутив Artix-linux

На другом дистрибутиве, voidlinux, grub-btrfs присутсвует. Но и там grub-mkconfig не находил артикс дистрибутив.
4.0) На гитхабе grub-btrfs читал про отдельнй /boot раздел или подраздел, чтобы grub-btrfs сработал.
Однако не понял отдельный /буут для всех дистрибутивов, как высше упомянуто с /BOOT? Или отдельный /буут подраздел на каждом дистрибутиве? Т.е.можно установить {/,/home, итд.} А можно {/,/boot,/home итд.}. Что нужно чтобы сработал grub-btrfs?
5.0) Ах да! Так же там упоминалось что то про отдельный бтрфс-подраздел, /var или /var/log. Мой английский не так плох. Но познания техники с англ. наверное не хватает. Т.к. не понял какие отдельные бтрфс-подразделы нужны чтобы grub-btrfs заметил дистрибутивы на других подразделах с корневой идентификацией 5.
Последний раз редактировалось
0
avatar
1.0) Всего навсего установить grub-btrfs и сработает?
да
2.0) Я не совсем понял суть зачем создавать снимки?
по сути снимок делается немного для других целей, нежели описано в мануале, но в общих чертах снапшот — это полноценная копия(даже не копия, а некая иная сущность из-за специфики файловой системы) вашей живой системы, а grub-btrfs позволяет без лишних телодвижений в нее загрузиться.
В арч-репозитории grub-btrfs нету.
есть в репах манджаро.
Но и там grub-mkconfig не находил артикс
update-grub
.
Что нужно чтобы сработал grub-btrfs?
достаточно его установить, но это не точно)
Последний раз редактировалось
?
Отправка специалистом технической поддержки ссылки на руководство по эксплуатации и другую документацию, не является отказом в предоставлении поддержки.
bash.org
+1
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.