воскресенье, 7 февраля 2021 г.

Ubuntu: установка на программный raid+uefi

До недавнего времени мне верой и правдой служил компьютер под управлением убунты, купленный в 2010 году и с тех пор не обновлявшийся (только HDD добавил, и память дополнительную вставил, с 2Гб до 6Гб, когда началась эта чехарда с коронавирусом и zoom-ом на удалёнке). Но время не стоит на месте, программы становятся всё требовательнее, да и менеджер пакетов убунты пару лет назад стал сбоить, в общем, пришла пора подумать о замене.

В прожорливые игры я не играю, фильмы в высоком качестве не смотрю, единственное из ресурсоёмких задач - это докер и виртуальные машины. Ну, и квартира маленькая, так что живём мы с этим оборудованием, что называется, бок о бок. Поэтому основными критериями выбора стали такие:
1) отказоустойчивость
2) малошумность
3) сносное быстродействие

Первый критерий привёл к мысли, что нужна материнская плата с RAID на борту, второй - что нужен процессор с низким тепловыделением, а третий - что диски будут SSD. Тут надо признать, что в железе я не разбираюсь совершенно. Поэтому сборка работоспособной машины превратилась в увлекательный квест.

Покопался на сайте одного известного магазина, повыбирал комплектующие на свой вкус, купил, собрал - не работает. Выяснилось, что в современном мире слова "DDR4" и "AM4" гарантируют только, что память и процессор удастся запихнуть в соответствующие слоты, а их работоспособность с данной конкретной материнской платой никто не обещал. К счастью, недостаток знаний удалось отчасти скомпенсировать финансовыми вливаниями, но изучать списки совместимости, искать и докупать на замену пришлось чуть ли не всё.

В итоге я стал счастливым обладателем материнской платы ASRock B450 Pro4, процессора Athlon 200GE, двух плашек ОЗУ A-Data XPG Gammix D10 [AX4U266638G16-SBG] (8+8 ГБ) и двух M.2 SSD A-Data XPG SX6000 Lite [ASX6000LNP-128GT-C] (128+128 ГБ) - для RAID-а. На процессор повесил здоровенный кулер DEEPCOOL REDHAT, вентилятор прицеплять не стал, машина получилась достаточно тихой, с одним вентилятором в блоке питания и непривычно пустым системным блоком в корпусе DEXP DC-101B - ни тебе дисководов, ни сидиромов, ни жестких дисков... Прогресс, однако. Осталось дело за малым - поднять RAID и установить операционную систему.

Первым делом включил raid, покопавшись в настройках материнской платы. К сожалению мануал, рассказывающий о том, как это делается, попался под руку не сразу. А всё оказалось просто - заходим в UEFI Setup Utility и там включаем пару опций:

Boot -> CSM (Compatibility Support Module) -> Disabled
Advanced -> AMD PBS -> NVMe RAID mode -> Enabled
Advanced -> Storage Configuration -> SATA Mode -> RAID
После перезагрузки в UEFI Setup Utility появится дополнительный пункт "RAIDXpert2 Configuration Utility", и там уже можно объединить два диска в массив. Правда, оказалось, что не любые два диска в этом пункте меню видны, и не зря на одном из слотов материнки была наклейка "Ultra M.2". Выяснилось, что и M.2 диски бывают разные, и в слот с этой наклейкой следует пихать тот, у которого есть опция NVMe. Второму M.2 разъёму, правда, не важно, что за диск в него подсунут, с NVMe или без, а вот первый в этом плане привередлив. Так или иначе, с этой проблемой удалось справиться, вот только это не сильно помогло: при установке убунта упорно продолжала видеть мой RAID-массив как два отдельных диска.

Пришлось изучать вопрос дальше, пока в одном из обсуждений попалась ссылка на статью, рассказывающую о разных вариантах реализации RAID. Есть Hardware RAID - когда одновременность чтения-записи на диски обеспечивается на аппаратном уровне, есть Software RAID - когда вся кухня реализована на уровне драйверов операционной системы, и есть Fake RAID - когда операционка вроде бы видит RAID, а на самом деле он реализовывается при помощи программного обеспечения, зашитого в материнскую плату. И, судя по цене материнки, мой случай именено такой. В то же время куча форумов пестрит утверждениями, что под линуксом все эти низкоуровневые RAID не нужны, а пользуйтесь лучше программными RAID-ами, граждане. Поэтому я, скрепя сердце, свой с трудом созданный массив размонтировал:

Boot -> CSM (Compatibility Support Module) -> Disabled
Advanced -> AMD PBS -> NVMe RAID mode -> Disabled
Advanced -> Storage Configuration -> SATA Mode -> AHCI
и приступил к третьей части - установке операционной системы.

Установка операционной системы меня тоже не порадовала. Выяснилось, что установщик моей любимой XUbuntu из коробки RAID не поддерживает, поэтому - либо качайте и ставьте сервер, либо делайте пару дополнительных пассов руками. Кроме того, наступило будущее, и на смену BIOS+MBR пришел UEFI+GPT. В моём случае будущее выразилось в том, что все 128 Гб превратить в RAID-1 не удастся: вышеупомянутая опция "Boot -> CSM (Compatibility Support Module) -> Disabled" приводит к тому, что при загрузке UEFI ищет не MBR, а раздел, носящий имя ESP. Этот раздел размечен fat32 и помечен флагом efi, на нём, собственно, и хранятся инструкции по дальнейшей загрузке операционной системы. При этом обнаружился приятный бонус - оказывается, современные версии линуксового загрузчика GRUB умеют поддерживать в идентичном состоянии несколько ESP, причудливо разбросанных по разным дискам. Поэтому моё первоначальное стремление сделать так:

Disk1: [RAID-1: [ESP...] [всё остальное............] ]
Disk2: [ -"- ........................................]
превратилось в:
Disk1: [ESP...] [RAID-1: [всё остальное............] ]
Disk2: [ESP...] [ -"- ...............................]
И про это самое "всё остальное" следует сказать особо.

В принципе, если массив поднят, можно запускать инсталлятор убунты, разбивать им свободное место на разделы и вообще двигаться дальше. Но под линуксом есть ещё одна полезная прослойка, которая называется LVM. Штука эта, Logical Volume Manager, очень интересная. Результат её действия таков, что логические тома, т.е., "разделы", видимые в файловой системе, на самом деле не являются привычными разделами, в виде единого целого хранящимися на диске, а являются мозаикой, элементы которой собираются из кусочков, раскиданных по разным дискам и прочим устройствам. Эти логические тома допускают, по слухам, большую гибкость в настройке, в частности, их размер можно менять как угодно, расширять за счет добавления в машину новых дисков и т.п. Поэтому итоговая структура дисков моего нового компьютера выглядит так:

Disk1: [ESP...] [RAID-1: [LVM: (Том: /.......) (Том: swap.......) (Том: /home.......) ] ]
Disk2: [ESP...] [ -"- ..................................................................]
ну, или в виде вывода команды lsblk -a:
$ lsblk -a

nvme0n1          259:0    0 119,2G  0 disk         (первый SSD A-Data XPG SX6000 Lite)
├─nvme0n1p1      259:2    0   128M  0 part             (efi раздел)
└─nvme0n1p2      259:3    0 119,1G  0 part             (раздел под всё остальное)
  └─md0            9:0    0 119,1G  0 raid1                (raid массив)
    ├─myVG-rootv 253:0    0    40G  0 lvm   /                  (логический том)
    ├─myVG-swapv 253:1    0    16G  0 lvm   [SWAP]             (логический том)
    └─myVG-homev 253:2    0  63,1G  0 lvm   /home              (логический том)

nvme1n1          259:1    0 119,2G  0 disk         (второй SSD A-Data XPG SX6000 Lite)
├─nvme1n1p1      259:4    0   128M  0 part             (efi раздел)
└─nvme1n1p2      259:5    0 119,1G  0 part             (раздел под всё остальное)
  └─md0            9:0    0 119,1G  0 raid1                (raid массив)
    ├─myVG-rootv 253:0    0    40G  0 lvm   /                  (логический том)
    ├─myVG-swapv 253:1    0    16G  0 lvm   [SWAP]             (логический том)
    └─myVG-homev 253:2    0  63,1G  0 lvm   /home              (логический том)

Теперь, наконец, опишу последовательность шагов, приведших к такому результату.

0. Создание инсталляционной флэшки

Берём понравившийся образ, например, отсюда https://mirror.yandex.ru/ubuntu-cdimage/xubuntu/releases/20.10/release/, подключаем флэшку - будем считать, что она села на /dev/sdh - и заливаем:

sudo dd if=xubuntu-20.10-desktop-amd64.iso of=/dev/sdh bs=1M

1. Подготовка к установке

Загружаемся с полученной флэшки, выбираем работать без установки и попадаем на рабочий стол. Там запускаем терминал, устанавливаем boot-repair (на всякий случай, мне, помнится, так и не понадобился):

sudo add-apt-repository -y ppa:yannubuntu/boot-repair
sudo apt update
apt install boot-repair
Устанавливаем средство для управления программными RAID массивами:
sudo apt install mdadm
Размечаем диски:
sudo fdisk /dev/nvme0n1
sudo fdisk /dev/nvme1n1
так, чтобы lsblk -a рисовал примерно такую картинку:
$ lsblk -a

nvme0n1          259:0    0 119,2G  0 disk
├─nvme0n1p1      259:2    0   128M  0 part
└─nvme0n1p2      259:3    0 119,1G  0 part
nvme1n1          259:1    0 119,2G  0 disk
├─nvme1n1p1      259:4    0   128M  0 part
└─nvme1n1p2      259:5    0 119,1G  0 part
Размечаем ESP под fat:
sudo mkfs -t fat -F 32 /dev/nvme0n1p1
sudo mkfs -t fat -F 32 /dev/nvme1n1p1
Создаём RAID:
mdadm --create /dev/md0 --metadata=0.90 --level 1 --raid-disks 2 /dev/nvme0n1p2 /dev/nvme1n1p2
этот процесс небыстрый, нужно подождать, пока диски синхронизируются, текущий статус массива можно глянуть командой cat /proc/mdstat. Когда всё закончится, настраиваем LVM. Передаём под его отвественность наш свежесозданный раздел /dev/md0:
pvcreate /dev/md0
Создаём группу томов, в которую включаем /dev/md0:
vgcreate myVG /dev/md0
Создаём логические тома:
lvcreate -L 40G myVG -n rootv
lvcreate -L 16G myVG -n swapv
lvcreate -l +100%FREE myVG -n homev
После этого конфигурация приобретёт законченный вид, и можно приступать к собственно процессу установки.

2. Процесс установки

Сама установка сложностей не представляет - запускаем процесс по ярлыку на рабочем столе, аккуратно указываем соответствие точек монтирования /, /home логическим устройствам и расположение раздела подкачки. По окончании процесса установки на перезагрузку, однако, не соглашаемся - надо на свежепоставленную систему взгромоздить mdadm, использующийся для программного RAID. Поэтому выбираем опцию "Продолжить работу" и возвращаемся в терминал.

3. Дополнительная настройка

Монтируем корень нашей новой системы и подготавливаемся к тому, чтобы в эту новую систему переключиться:

sudo mount /dev/myVG/rootv /mnt
mount -o bind /dev /mnt/dev
mount -o bind /dev/pts /mnt/dev/pts
mount -o bind /sys /mnt/sys
mount -o bind /proc /mnt/proc
cat /etc/resolv.conf >> /mnt/etc/resolv.conf
Переключаемся:
chroot /mnt
Доустанавливаем в свежеустановленную систему необходимые пакеты:
apt install mdadm
apt install grub-efi-amd64
apt remove grub-efi-amd64-signed
Включаем показ меню GRUB при запуске системы:
vi /etc/grub.d/10_linux # изменить значение quick_boot на 0
И, наконец, перезагружаемся.

4. Настройка GRUB для работы с двумя копиями ESP

Если повезло, и система загрузилась, нужно настроить GRUB. это делается командой:

dpkg-reconfigure grub-efi-amd64
там в какой-то момент конфигуратор выведет список найденных ESP и предложит отметить галочками, какие из них синхронизировать. Правда, говорят, эта опция доступна только с недавних пор - дистрибутивы, выпущенные ранее 2019 года, такой возможности не имеют. Я поставил обе галочки напротив nvme0n1p1 и nvme1n1p1. Буду надеяться, GRUB не подведёт.

Литература:

Установка Linux на software raid
Install Ubuntu 18.04 desktop with RAID 1 and LVM on machine with UEFI BIOS
How to install Ubuntu server with UEFI and RAID1 + LVM
Как установить Ubuntu на программный RAID-1
Лабораторная работа: настраиваем lvm, raid на linux