LINUX.ORG.RU
решено ФорумAdmin

Перенести Alpine Linux на другой диск с LVM

 , , ,


0

1

Всем привет!

Имеется установленный Alpine Linux на сервер со следующей конфигурацией дисков:

hypervisor:~$ lsblk
NAME                                  MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda                                     8:0    0 838.3G  0 disk 
├─lxd--vg-lxd_pool_tmeta              253:4    0   108M  0 lvm  
│ └─lxd--vg-lxd_pool-tpool            253:6    0 838.1G  0 lvm  
│   ├─lxd--vg-lxd_pool                253:7    0 838.1G  1 lvm  
│   ├─lxd--vg-containers_tst    253:8    0 407.3G  0 lvm  /var/lib/lxd/storage-pools/lxd_pool/containers/tst
│   ├─lxd--vg-containers_test         253:9    0   9.3G  0 lvm  /var/lib/lxd/storage-pools/lxd_pool/containers/test
│   └─lxd--vg-containers_web----proxy 253:10   0   9.3G  0 lvm  /var/lib/lxd/storage-pools/lxd_pool/containers/web-proxy
└─lxd--vg-lxd_pool_tdata              253:5    0 838.1G  0 lvm  
  └─lxd--vg-lxd_pool-tpool            253:6    0 838.1G  0 lvm  
    ├─lxd--vg-lxd_pool                253:7    0 838.1G  1 lvm  
    ├─lxd--vg-containers_tst    253:8    0 407.3G  0 lvm  /var/lib/lxd/storage-pools/lxd_pool/containers/tst
    ├─lxd--vg-containers_test         253:9    0   9.3G  0 lvm  /var/lib/lxd/storage-pools/lxd_pool/containers/test
    └─lxd--vg-containers_web----proxy 253:10   0   9.3G  0 lvm  /var/lib/lxd/storage-pools/lxd_pool/containers/web-proxy
sdb                                     8:16   0 558.9G  0 disk 
├─kvm--vg-alpine--router              253:0    0     2G  0 lvm  
├─kvm--vg-alpine--router--clone       253:1    0     2G  0 lvm  
├─kvm--vg-debian12--test              253:2    0    20G  0 lvm  
└─kvm--vg-test--vm                    253:3    0    20G  0 lvm  
sdc                                     8:32   1  29.1G  0 disk 
├─sdc1                                  8:33   1   300M  0 part /boot
├─sdc2                                  8:34   1     4G  0 part [SWAP]
└─sdc3                                  8:35   1  24.8G  0 part /var/hdd.log
                                                                /
sr0                                    11:0    1  1024M  0 rom  
zram0                                 252:0    0  1000M  0 disk /var/log

ОС стоит на диске sdc (это SD-карта).

Задача перенести ОС на диск sda или sdb.

Какой план у меня вырисовывается:

  1. Временно смигрировать lv-разделы, например, с диска sdb на диск sda;
  2. Всё на диске sdb уничтожить;
  3. Создать boot-раздел, создать pv, vg под коревой раздел;
  4. Как-то перенести ОС;
  5. Создать VG для перенесенных в п.1 разделов и мигрировать их обратно.

Вопрос: куда копать, чтобы выполнить п.4 - перенести ОС с SDкарты на другой диск в описанной выше конфигурации?


Зачем такие извращения? Можешь просто создать на целевом диске LVM, разбить на кусочки, а потом поблочно скопировать через dd или ddrescue (польза в том что можно начать с того же места если придётся прерваться)

Xenius ★★★★★
()
Ответ на: комментарий от Xenius

Это всё укладывается в п.1-3, меня интересует п.4.

Я так понимаю, самое критичное - это boot раздел перенести, чтобы bios сервера подхватил загрузучную запись (и в самом биос указать, что надо грузиться с определённого диска), а корень как нибудь скопирую.

santic
() автор топика
Ответ на: комментарий от santic

А, понятно, твоя проблема в том что у тебя LVM занимает самое начало диска. В таком случае ты можешь использовать lilo в качестве загрузчика. Насколько я помню, в LVM самое начало пустое как раз для загрузчика и lilo там поместится, в этом случае тебе не нужен будет раздел /boot, достаточно будет только корневого раздела.

На всякий случай сделай hexdump -C /dev/sda | head и аналогично для sdb чтобы посмотреть сколько места в начале допустимо взять под загрузчик.

Xenius ★★★★★
()
Последнее исправление: Xenius (всего исправлений: 1)

План хороший и всё, кроме пункта 4 можно выполнять на живой системе.

Пункт 4 выполняется при помощи rsync -aHAXDSx --del --stats /oldroot/ /newroot/ правки /newroot/etc/fstab и настройкой grub. Честно говоря, хз как на alpine настраивается grub, в федоре я в своё время вызывал grub2-mkconfig -o /boot/grub2/grub.cfg из однопользовательского режима.

PS Возможность ошибиться и нужность бекапов никто не отменял.

PPS ах, да, grub-install нужен, чтобы создать загрузочную запись

legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 2)
Ответ на: комментарий от Xenius

Честно говоря, с hexdump не работал.

hypervisor:~# hexdump -C /dev/sda | head 
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000200  4c 41 42 45 4c 4f 4e 45  01 00 00 00 00 00 00 00  |LABELONE........|
00000210  8a 06 eb 4c 20 00 00 00  4c 56 4d 32 20 30 30 31  |...L ...LVM2 001|
00000220  64 48 47 50 71 4f 34 54  46 35 6e 67 70 68 37 39  |dHGPqO4TF5ngph79|
00000230  33 77 4d 65 52 56 58 55  79 4f 4d 57 35 68 75 6c  |3wMeRVXUyOMW5hul|
00000240  00 60 3c 95 d1 00 00 00  00 00 10 00 00 00 00 00  |.`<.............|
00000250  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000260  00 00 00 00 00 00 00 00  00 10 00 00 00 00 00 00  |................|
00000270  00 f0 0f 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
hypervisor:~# hexdump -C /dev/sdb | head 
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000200  4c 41 42 45 4c 4f 4e 45  01 00 00 00 00 00 00 00  |LABELONE........|
00000210  c0 05 7d 73 20 00 00 00  4c 56 4d 32 20 30 30 31  |..}s ...LVM2 001|
00000220  39 77 4d 43 79 62 4e 32  4a 52 4c 7a 48 48 56 34  |9wMCybN2JRLzHHV4|
00000230  56 77 69 69 62 6d 33 46  4e 50 48 7a 6c 35 31 41  |Vwiibm3FNPHzl51A|
00000240  00 60 5f b8 8b 00 00 00  00 00 10 00 00 00 00 00  |.`_.............|
00000250  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000260  00 00 00 00 00 00 00 00  00 10 00 00 00 00 00 00  |................|
00000270  00 f0 0f 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|

hypervisor:~# pvs -o +pe_start
  PV         VG     Fmt  Attr PSize    PFree    1st PE 
  /dev/sda   lxd-vg lvm2 a--  <838.33g       0    1.00m
  /dev/sdb   kvm-vg lvm2 a--  <558.88g <514.88g   1.00m

И у меня нет уверенности, что Alpine поддерживает lilo… Хотя при попытке поискать lilo, пакетный менеджер выдаёт syslinux…

santic
() автор топика

Так, судя по статье в вики и по топику в арчёвом форуме - это всё провернуть можно будет, при том boot раздел можно в lvm завернуть, но всё-равно придётся на диске всё уничтожать и делать «partition table». Наверно поэксперементирую в виртуальной среде.

santic
() автор топика
Ответ на: комментарий от santic

А тебе не пофиг, поддерживает или нет? Поставить ты можешь в любом случае.

У тебя 0x200 = 512 байт в начале диска свободно, значит lilo влезет, я так понимаю. Таблица разделов MBR кстати тоже влезет без уничтожения lvm.

Xenius ★★★★★
()
Последнее исправление: Xenius (всего исправлений: 2)
Ответ на: комментарий от santic

syslinux тебе не подойдёт, разве что ты сможешь освободить место в конце диска, не знаю поддерживает ли lvm уменьшение физического тома.

Теоретическая возможность использовать syslinux или grub у тебя есть, но это сложно. Поэтому тебе стоит поставить lilo, если я правильно понимаю, то он будет сразу работать как надо без особых усилий.

Xenius ★★★★★
()
Ответ на: комментарий от santic

Вот про создание таблицу разделов MBR без уничтожения lvm подробнее…Как можно провернуть?

Просто через fdisk можно или другую программу, главное тип таблицы должен быть DOS / MBR и нужно отказаться от стирания метки LVM

fdisk -t dos -w never -W never /dev/sda

Примерно такой командой сделать можно, чтобы он даже не предлагал стереть ничего. Ну и если не указать -t dos то нужно проследить, чтобы по дефолту создалась таблица dos.

Другой вопрос, что тебе ещё как-то надо уменьшить раздел физического тома, чтобы конец диска был свободным, но я в LVM слабо разбираюсь. Ну и первый раздел должен начинаться с нулевого сектора, если ты хочешь lvm оформить как раздел, но тогда нужна какая-нибудь программа, которая позволит это сделать. Может fdisk от BSD или busybox?

Xenius ★★★★★
()
Ответ на: комментарий от Xenius

В целом, @Xenius спасибо за помощь и наводки.

Пока картина следующая:

  1. Как я понял, всё же самый оптимальный вариант - это по быстрому смигрировать тома LVM и создать загрузочный раздел + LVM. В бут раздел руками загрузчик вкорячить, а корень rsycn’ом скатать.
  2. Решение с LILO не может подойти, потому что в дистре его нет, собрать из сорцов навряд ли получится (в Alpine MUSL вместо GLIB), больше мороки будет.
  3. Остальное потихоньку буду тестить пока на виртуальном стенде.
santic
() автор топика
Ответ на: комментарий от futurama

Вариант хороший, да и первым делом на него смотрел, однако не подходит он. Дело не в том что жалко, а в том, что хранить что-то загрузочное на SDкарте, в целом не удачное решение. Я этот топик и начал, потому что сервер с SD карты после потери питания только раза с третьего загрузился.

santic
() автор топика
Последнее исправление: santic (всего исправлений: 2)
Ответ на: комментарий от santic

У тебя sdb почти пустой, перекинь, в качестве резервной копии, при помощи dd на sda те LV по 2/20ГБ, потом создай на нем MBR/GPT, раздел /boot и далее воссоздай разметку LVM

futurama ★★★★★
()
Последнее исправление: futurama (всего исправлений: 1)
Ответ на: комментарий от futurama

dd LV

Нахрена? pvmove же.

А если уж хочется оффлайн-инструменты, но загрузить gparted live и мышкой подвинуть все разделы. Он может двигать LVM PV.

legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 1)
Ответ на: комментарий от legolegs

Если бы хотелось заморочиться можно было бы создать файл на sda, его через losetup и pvcreate завести в VG который на sdb, потом pvmove’ом освободить sdb, перенеся все на файл(sda), форматнуть sdb и обратно pvmove

futurama ★★★★★
()
Ответ на: комментарий от santic

Решение с LILO не может подойти, потому что в дистре его нет, собрать из сорцов навряд ли получится (в Alpine MUSL вместо GLIB), больше мороки будет.

Почему бы не собрать его статически на другом компе и перенести готовый бинарник тогда уж?

Ну или вот, я попробовал установить на виртуалку CorePure который работает по схожему принципу с Alpine и получилось. Вот такие файлы:

# find . -type f
./vmlinuz64
./corepure64.gz
./syslinux/boot.msg
./syslinux/f2
./syslinux/f3
./syslinux/f4
./syslinux/syslinux.cfg
./lilo/lib64/libc.so.6
./lilo/lib64/libdevmapper.so.1.02
./lilo/lib64/libm.so.6
./lilo/lib64/libpthread.so.0
./lilo/lib64/libudev.so.1
./lilo/lib64/ld-linux-x86-64.so.2
./lilo/lib64/libtinfo.so.6
./lilo/lib64/libdl.so.2
./lilo/etc/lilo.conf
./lilo/boot/boot.0800
./lilo/boot/map
./lilo/vmlinuz64
./lilo/corepure64.gz
./lilo/bin/lilo
./lilo/bin/liloconfig
./lilo/bin/sh
./lilo/bin/bash
./lilo/bin/busybox

Причём

  • busybox оказался ненужен, да и всё равно не работал,
  • bash и sh - хардлинки,
  • liloconfig - скрипт, не нужен,
  • ./lilo/vmlinuz64 ./lilo/corepure64.gz - хардлинки на одноимённые файлы
  • boot.0800 и map — созданы lilo при установке
  • syslinux - не нужен, скопировал на случай если нужно опции подглядеть
  • libtinfo.so.6 libdl.so.2 — нужны только для bash/sh

Зато нужны были пустые каталоги lilo/dev и lilo/proc

Содержимое lilo.conf:

lba32
boot = /dev/sda
root = /dev/sda1
map = /boot/map
install = text
prompt
image = /vmlinuz64
	label = TinyCore
	initrd = corepure64.gz

Наверное стоит ещё опцию compact добавить для ускорения загрузки.

В общем суть эксперимента:

Создал образ диска во временном каталоге, затем загрузился с образа командой

qemu-system-x86_64 -m 1G -hda lilo-test.img -cdrom CorePure64-13.1.iso -boot d

Затем с помощью fdisk создал раздел 64 мегабайта (занято оказалось 27 в итоге), на нём mkfs.ext2.

С помощью ldd выяснил какие нужны либы для запуска bash и lilo, скопировал их из основной системы (Slackware64), вначале пытался через LD_LIBRARY_PATH и LD_PRELOAD, но так почем-то не работало, поэтому сделал chroot с самым минимумом — шелл и lilo, пожалуй можно было обойтись без шелла, если команде chroot выдавать lilo сразу.

Затем нужно было ещё сделать mount --bind /dev lilo/dev и аналогично с /proc и после этого lilo сработал.

В общем если тебе лень собирать lilo, возьми все нужные файлы из пакетов от любого дистрибутива, где он есть, например Slackware.

fdisk всё-таки умеет создавать таблицу разделов, начинающуюся с нулевого сектора, нужно взять команду b из режима x. Но тебе это вроде и не нужно.

Xenius ★★★★★
()
Последнее исправление: Xenius (всего исправлений: 1)
Ответ на: комментарий от Xenius

Второй эксперимент, теперь более приближено к твоему случаю.

Для начала на хостовой системе

# Создаём файл для опытов
truncate -s 128M lvm.img
# lvm не хочет работать с файлами, поэтому
losetup -f lvm.img
# Как оказалось, первая команда не обязательна, можно сразу со второй
pvcreate /dev/loop0
vgcreate lilo-test /dev/loop0
# Создаём логический том на всё место:
lvcreate -l 100%VG lilo-test root-lv
# Создаём в ней файловую систему:
mkfs.ext2 /dev/lilo-test/root-lv
# Монтируем это всё в предварительно созданный каталог
mount /dev/lilo-test/root-lv /loop
# Качаем lilo и зависимости:
wget https://mirrors.slackware.com/slackware/slackware-15.0/slackware/a/aaa_glibc-solibs-2.33-i586-5.txz https://mirrors.slackware.com/slackware/slackware-15.0/slackware/a/aaa_libraries-15.0-i586-19.txz https://mirrors.slackware.com/slackware/slackware-15.0/slackware/a/lilo-24.2-i586-12.txz
# Качаем какой-нибудь набор из ядра и инитрд, можно тот же, можно этот:
wget http://tinycorelinux.net/15.x/x86_64/release/distribution_files/vmlinuz64 http://tinycorelinux.net/15.x/x86_64/release/distribution_files/corepure64.gz
# Всё отключаем
umount /loop; vgchange -an; losetup -D

Теперь, в хостовой системе должны быть скачаны файлы huge.s с ядром и initrd.img с инсталлятором, найти их можно тут: https://mirrors.slackware.com/slackware/slackware64-15.0/EFI/BOOT/

# Запускаем ОС
qemu-system-x86_64 -m 1G -hda /tmp/disk/lvm.img -kernel huge.s -initrd initrd.img -append console=ttyS0,earlycon=ttyS0 -serial mon:stdio
# Ждём прогрузки, далее команды в инсталляторе

root@slackware:/# lsblk 
NAME                  MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
fd0                     2:0    1    4K  0 disk 
sda                     8:0    0  128M  0 disk 
`-lilo--test-root--lv 252:0    0  124M  0 lvm  
sr0                    11:0    1 1024M  0 rom  
root@slackware:/# mkdir /disk
root@slackware:/# mount /dev/lilo-test/root-lv /disk
root@slackware:/# installpkg --root /disk /disk/pkgs/*
Verifying package aaa_glibc-solibs-2.33-i586-5.txz.
Installing package aaa_glibc-solibs-2.33-i586-5.txz:
PACKAGE DESCRIPTION:
# aaa_glibc-solibs (shared GNU C libraries)
#
# This package contains the shared libraries, binaries, and support
# files required to run most Linux applications linked with glibc.
#
Executing install script for aaa_glibc-solibs-2.33-i586-5.txz.
Package aaa_glibc-solibs-2.33-i586-5.txz installed.
Verifying package aaa_libraries-15.0-i586-19.txz.
Installing package aaa_libraries-15.0-i586-19.txz:
PACKAGE DESCRIPTION:
# aaa_libraries (shared libraries needed by many programs)
#
# This is a collection of shared libraries needed to run Linux programs.
# These libraries are gathered from other Slackware packages and are
# intended to give a minimal initial set of libraries.
#
Package aaa_libraries-15.0-i586-19.txz installed.
Verifying package lilo-24.2-i586-12.txz.
Installing package lilo-24.2-i586-12.txz:
PACKAGE DESCRIPTION:
# lilo (Linux Loader)
#
# Generic Boot Loader for Linux ('LInux LOader') by Werner Almesberger.
# LILO boots Linux from your hard drive. It can also boot other
# operating systems such as Windows and OS X, and can even boot DOS from
# the second hard drive. LILO comes with utilities and documentation
# that make it easier to install, such as 'liloconfig' and 'QuickStart'.
# NOTE: Installing boot loaders is inherently dangerous. Be sure to have
# some means to boot your system from a different media if you install
# LILO on your hard disk.
#
Package lilo-24.2-i586-12.txz installed.
root@slackware:/# mkdir /disk/{dev,proc}
root@slackware:/# mount --bind /dev /disk/dev 
root@slackware:/# mount --bind /proc /disk/proc 
root@slackware:/# chroot /disk lilo
lilo: error while loading shared libraries: libudev.so.1: cannot open shared object file: No such file 
or directory
root@slackware:/# cd /disk/lib/
root@slackware:/disk/lib# ln -s libudev.so.1{.6.3,}  
root@slackware:/# cat > /disk/etc/lilo.conf
lba32
boot = /dev/sda
map = /boot/map
install = text
compact
image = /boot/vmlinuz64
initrd = /boot/corepure64.gz
root@slackware:/# chroot /disk/ lilo
Added vmlinuz64  +  *

После этого виртуалку можно выключить и затем загрузить уже без всяких опций:

$ qemu-system-x86_64 -m 1G -hda /tmp/disk/lv
m.img 
WARNING: Image format was not specified for '/tmp/disk/lvm.img' and probing guessed raw.
         Automatically detecting the format is dangerous for raw images, write operations on block 0 wi
ll be restricted.
         Specify the 'raw' format explicitly to remove the restrictions.

Всё работает. Разве что, TinyCore не поддерживает lvm изкоробки, в отличии от инсталлятора слаквари.

Xenius ★★★★★
()
Ответ на: комментарий от santic

Так, на тестовом стенде удалось воспроизвести мой вариант миграции на примере Alpine Linux с конфигурацией дисков на существующем сервере. Пришлось немного поразобираться с syslinux, но вариант оказался рабочий и опробованный два раза.

Попробую посмотреть что можно сделать с вариантом от товарища @Xenius.

Вот небольшая интсрукция для истории:

Почитать:

Подготовить стенд (загружаемся с live ISO Alpine Linux):

Создать скрипт

vi ~/prep.sh
#/bin/sh

cat <<EOT > /etc/network/interfaces
auto eth0
 iface eth0 inet dhcp
EOT

/sbin/rc-service networking restart

/sbin/setup-apkrepos -cf

/sbin/apk add vim lsblk lvm2 openssh e2fsprogs lvm2-dmeventd cfdisk rsync syslinux gptfdisk sgdisk

echo -e "123\n123" | passwd

/bin/sed -i '/PermitRootLogin/c\PermitRootLogin yes' /etc/ssh/sshd_config

/sbin/rc-service sshd restart

Запустить

chmod +x ~/prep.sh
sh ~/prep.sh

Проверить что имеется

lsblk -f
mount
pvscan
lvm vgscan
lvdisplay
ls -l /dev/mapper

Если с нуля, то создать примеры

pvcreate  /dev/sdb /dev/sdc
vgcreate vg0 /dev/sdb
vgcreate vg1 /dev/sdc
lvcreate -n test1 -L 1G vg0
lvcreate -n test2 -L 1G vg0

Активировать нужный vg

vgchange -ay vg0
ls -l /dev/mapper

Если в lv нет FS:

mkfs.ext4 /dev/mapper/vg0-test2

Примонтировать lv и создать файл

mount /dev/mapper/vg0-test1 /mnt
cd /mnt
dd if=/dev/zero of=output1.dat  bs=240M  count=1

Произвести миграцию lv

# Снапшотим оригинальный lv
lvcreate --snapshot --name t1-snap -L 1G /dev/vg0/test1
# Создаём lv на другом vg, аналогичный lv оригиналу
lvcreate -L 1G  --name test1 vg1
# Копируем lv из vg0 в vg1
dd if=/dev/vg0/t1-snap  of=/dev/vg1/test1

или

# Узнаём точный размер исходного lv
lvdisplay /dev/vg0/test2 --units b
# Исходя из предыдущей команды создаём новый lv
lvcreate -L 1073741824b -n test2 vg1
# Копируем lv
dd if=/dev/vg0/test2 of=/dev/vg1/test2 bs=1024K conv=noerror

Уничтожить lvm на целевом диске

lvremove /dev/vg0/*
vgremove vg0
pvremove /dev/sdb
# Дополнительно можно сделать
wipefs -a /dev/sda

Разметить диск

gdisk /dev/sdb
Number  Start (sector)    End (sector)  Size Name
     1            2048         1050623  512M
     2         1050624         7342079 3072M
     3         7342080        16775167 4606M

!!! Обязательно на бут разделе поставить аттрибут загрузочного.

!!! Нажать «o» для создания GPT разметки.

  • №1 под раздел boot
  • №2 под корневой раздел
  • №3 под другой vg

Наделать ФС

mkfs.ext4 /dev/sdb1

Создать lvm разметку

pvcreate /dev/sdb2 /dev/sdb3
vgcreate vg_alp /dev/sdb2
vgcreate vg0 /dev/sdb3
lvcreate -l 100%FREE -n alp_root vg_alp
lvdisplay /dev/vg1/test1 --units b
lvcreate -L 1073741824b -n test1 vg0
dd if=/dev/vg1/test1 of=/dev/vg0/test1 bs=1024K conv=noerror
vdisplay /dev/vg1/test2 --units b
lvcreate -L 1073741824b -n test2 vg0
dd if=/dev/vg1/test2 of=/dev/vg0/test2 bs=1024K conv=noerror

Проверяем lvm разметку и удаляем лишнее

mkdir /mnt/t1
mkdir /mnt/t2
mount /dev/vg0/test1 /mnt/t1
mount /dev/vg0/test2 /mnt/t2
umount /mnt/t1
umount /mnt/t2
lvremove /dev/vg1/test1
lvremove /dev/vg1/test2

Копируем корневой раздел

mkfs.ext4 /dev/vg_alp/alp_root
mkdir /mnt/src /mnt/dst
mount /dev/sda3 /mnt/src/
mount /dev/vg_alp/alp_root /mnt/dst/
rsync -axHAWXS --numeric-ids --info=progress2 /mnt/src/ /mnt/dst/
umount /mnt/src/ /mnt/dst/

Пытаемся восстановить boot

mount /dev/sdb1 /mnt/dst/
mount /dev/sda1 /mnt/src/
cp -v /mnt/src/vmlinuz-lts /mnt/dst/
cp -v /mnt/src/initramfs-lts /mnt/dst/
umount /mnt/src/ /mnt/dst/
rm -rf /mnt/*
mount /dev/vg_alp/alp_root /mnt
mount /dev/sdb1 /mnt/boot/
for i in /sys /proc /run /dev /dev/pts; do mount --bind "$i" "/mnt$i"; done
chroot /mnt

Вправляем /etc/fstab:

/dev/vg_alp/alp_root                            /       ext4    rw,relatime 0 1

Вправляем initramfs (/etc/mkinitfs/mkinitfs.conf):

# Добавим lvm в конфиге
features="ata base ide scsi usb virtio ext4 lvm"

Пересобираем:

# проверим какое ядро
ls /lib/modules/
# пересобираем
mkinitfs -c /etc/mkinitfs/mkinitfs.conf -b / 6.6.24-0-lts

Производим действия с загрузчиком:

extlinux --install /boot
update-extlinux

Меняем root

vim /boot/extlinux.conf
APPEND root=/dev/vg_alp/alp_root modules=sd-mod,usb-storage,ext4 quiet rootfstype=ext4

Установка загрузчика в MBR

dd bs=440 conv=notrunc count=1 if=/usr/share/syslinux/gptmbr.bin of=/dev/sdb
santic
() автор топика
Последнее исправление: santic (всего исправлений: 2)
Ответ на: комментарий от Xenius

С lilo + LVM получилось в итоге.

alpine-test:~# lsblk -f
NAME               FSTYPE      FSVER LABEL                    UUID                                   FSAVAIL FSUSE% MOUNTPOINTS
sda                LVM2_member                                sMYPBX-GxB4-aYj0-e1I0-QvEd-yAJ5-cwYw53                
├─vg--kvm-test1    ext4                                       8520f355-14dd-4986-b414-3cfbb18b6ddf                  
├─vg--kvm-test2    ext4                                       6d3a76a6-f15d-410a-8b44-5e798f129281                  
└─vg--kvm-alp_root ext4                                       d0bae45a-4420-4d75-85d8-df38468d7632      5.3G     4% /
sr0                iso9660           alpine-std 3.19.1 x86_64 2023-12-27-12-33-10-00                                
alpine-test:~# 
alpine-test:~# ls -lR /boot
/boot:
total 29508
-rw-------    1 root     root      18307814 Apr 29 13:11 initramfs-lts
drwxr-xr-x    3 root     root          4096 Apr 29 13:12 lilo
-rw-r--r--    1 root     root      11899904 Apr 29 10:27 vmlinuz-lts

/boot/lilo:
total 64
-rw-r--r--    1 root     root           512 Apr 29 10:46 boot.0810
drwxr-xr-x    2 root     root          4096 Apr 29 10:34 gfx
-rw-------    1 root     root         53760 Apr 29 13:11 map

/boot/lilo/gfx:
total 288
-rw-r--r--    1 root     root        113162 Nov 12 12:12 coffee.bmp
-rw-r--r--    1 root     root           426 Nov 12 12:12 coffee.dat
-rw-r--r--    1 root     root         22560 Nov 12 12:12 debian-de.bmp
-rw-r--r--    1 root     root           426 Nov 12 12:12 debian-de.dat
-rw-r--r--    1 root     root         22466 Nov 12 12:12 debian.bmp
-rw-r--r--    1 root     root           423 Nov 12 12:12 debian.dat
-rw-r--r--    1 root     root         31628 Nov 12 12:12 debianlilo.bmp
-rw-r--r--    1 root     root           435 Nov 12 12:12 debianlilo.dat
-rw-r--r--    1 root     root         22578 Nov 12 12:12 inside.bmp
-rw-r--r--    1 root     root           432 Nov 12 12:12 inside.dat
-rw-r--r--    1 root     root          6878 Nov 12 12:12 onlyblue.bmp
-rw-r--r--    1 root     root           424 Nov 12 12:12 onlyblue.dat
-rw-r--r--    1 root     root         33192 Nov 12 12:12 tuxlogo.bmp
-rw-r--r--    1 root     root           423 Nov 12 12:12 tuxlogo.dat
alpine-test:~# 

santic
() автор топика
Ответ на: комментарий от santic

В начале загрузчик должен умен смочь прочитать ядро в с LVM тома, а в initramfs должны быть скрипты, умеющие инициализировать LVM. Но современные ядра умеют инициализировать LVM сами. Поэтому в initramfs должны быть модули LVM.

anonymous
()
Ответ на: комментарий от santic

А где сам бинарник lilo и соответствующие библиотеки? Как погляжу лило из дебиана и там какие-то картинки ещё которые для загрузки системы не нужны.

Главный плюс lilo в том что пофиг на все слои абстракции, ядро и инитрд загрузится откуда угодно если оно не зашифровано, правда вроде как с btrfs могут быть проблемы так как оно может переместить существующий файл в другие секторы, но тут я не уверен.

Xenius ★★★★★
()
Ответ на: комментарий от Xenius

Я, внезапно, нашёл apk пакет от незнакомого мне дистра (вот тут). Пробовал собирать, но это дело неблагодарное, да и времени не много разбираться. Бинарник загрузчика из пакета ставится в /sbin/, библиотеки загрузчик не просит.

santic
() автор топика
Последнее исправление: santic (всего исправлений: 1)
Ответ на: комментарий от anonymous

Если limine сможет прочитать ядро с LVM-тома, то могу поэксперементировать. Тогда это будет третий вариант решения проблемы. И, похоже, это будет оптимальным вариантом, т.к. этот загрузчик есть в репах:

alpine-test:~# apk search limine
limine-5.20231207.1-r0
limine-aarch64-5.20231207.1-r0
limine-cd-5.20231207.1-r0
limine-dev-5.20231207.1-r0
limine-doc-5.20231207.1-r0
limine-efi-updater-5.20231207.1-r0
limine-pxe-5.20231207.1-r0
limine-riscv64-5.20231207.1-r0
limine-sys-5.20231207.1-r0
limine-x86_32-5.20231207.1-r0
limine-x86_64-5.20231207.1-r0

santic
() автор топика

Инструкция миграции ОС с LILO и LVM для истории:

Подготовить стенд (загружаемся с live ISO Alpine Linux):

Создать скрипт

vi ~/prep.sh
#/bin/sh

cat <<EOT > /etc/network/interfaces
auto eth0
 iface eth0 inet dhcp
EOT

/sbin/rc-service networking restart

cat <<EOT > /etc/apk/repositories
http://mirror.hyperdedic.ru/alpinelinux/v3.19/main
EOT

/sbin/apk update

/sbin/apk add vim lsblk lvm2 openssh e2fsprogs lvm2-dmeventd cfdisk rsync syslinux gptfdisk sgdisk

echo -e "123\n123" | passwd

/bin/sed -i '/PermitRootLogin/c\PermitRootLogin yes' /etc/ssh/sshd_config

/sbin/rc-service sshd restart

Запустить

chmod +x ~/prep.sh
sh ~/prep.sh

Переход на LILO без LVM

Chrooting

mount /dev/sda3 /mnt ; \
mount /dev/sda1 /mnt/boot ; \
for i in /sys /proc /run /dev /dev/pts; do mount --bind "$i" "/mnt$i"; done ; \
chroot /mnt

Install lilo pkg

cd ~
wget https://distfiles.adelielinux.org/adelie/1.0/user/x86_64/lilo-24.2-r1.apk
apk del syslinux
apk add lilo-24.2-r1.apk --allow-untrusted

Готовим конфиг LILO:

cd /etc/lilo/
cp lilo.conf.template lilo.conf

Сам конфиг:

# /etc/lilo/lilo.conf                                                                                                               
### LILO global section ###
# Good assumptions for a modern (post-1998) system                                                                            
compact          
large-memory
lba32                   

# Menu configuration
install = bmp
bitmap = /boot/lilo/gfx/tuxlogo.bmp

# Boot the first entry automatically in 10 seconds
prompt
timeout = 100

# These will be configured automatically by liloconfig(8)
boot = "/dev/sda"

### LILO per-image section ###
image = /boot/vmlinuz-lts
        label = "Alpine Linux"
        append = "root=/dev/sda3 modules=sd-mod,usb-storage,ext4 quiet rootfstype=ext4"
        initrd = /boot/initramfs-lts
        read-write

запускаем lilo

lilo

Переход на LILO с LVM

Готовим стенд в контексте дисков

pvcreate /dev/sdb
vgcreate vg-kvm /dev/sdb
lvcreate -L 1G  --name test1 vg-kvm
lvcreate -L 1G  --name test2 vg-kvm
mkfs.ext4 /dev/vg-kvm/test1
mkfs.ext4 /dev/vg-kvm/test2
mkdir /mnt/t1 /mnt/t2
mount /dev/vg-kvm/test1 /mnt/t1
mount /dev/vg-kvm/test2 /mnt/t2
dd if=/dev/zero of=/mnt/t2/output1.dat  bs=340M  count=1
dd if=/dev/zero of=/mnt/t2/output2.dat  bs=34M  count=10
ls -lhR /mnt
umount /mnt/t1 /mnt/t2
rm -rf /mnt/*
# Создаём lv под корень + boot
lvcreate -l 100%FREE -n alp_root vg-kvm

Мигрируем ОС (в том числе и ядро)

vgchange -ay vg-kvm
mkfs.ext4 /dev/vg-kvm/alp_root
mkdir /mnt/src /mnt/dst
mount /dev/sda3 /mnt/src/
mount /dev/vg-kvm/alp_root /mnt/dst/
rsync -axHAWXS --numeric-ids --info=progress2 /mnt/src/ /mnt/dst/
mount /dev/sda1 /mnt/src/boot
cp -v /mnt/src/boot/vmlinuz-lts /mnt/dst/boot/
cp -v /mnt/src/boot/initramfs-lts /mnt/dst/boot/
umount /mnt/src/boot/
umount /mnt/src/
umount /mnt/dst/
rm -rf /mnt/*

Chrooting

mount /dev/vg-kvm/alp_root /mnt ; \
for i in /sys /proc /run /dev /dev/pts; do mount --bind "$i" "/mnt$i"; done ; \
chroot /mnt

Install lilo pkg

cd ~
wget https://distfiles.adelielinux.org/adelie/1.0/user/x86_64/lilo-24.2-r1.apk
apk del syslinux
apk add lilo-24.2-r1.apk --allow-untrusted

Готовим конфиг LILO:

cd /etc/lilo/
cp lilo.conf.template lilo.conf

Сам конфиг:

# /etc/lilo/lilo.conf                                                                                                               
### LILO global section ###
# Good assumptions for a modern (post-1998) system                                                                            
compact          
large-memory
lba32                   

# Menu configuration
install = bmp
bitmap = /boot/lilo/gfx/tuxlogo.bmp

# Boot the first entry automatically in 10 seconds
prompt
timeout = 100

# These will be configured automatically by liloconfig(8)
boot = "/dev/sdb"
map = /boot/lilo/map

### LILO per-image section ###
image = /boot/vmlinuz-lts
        label = "Alpine Linux"
        append = "root=/dev/vg-kvm/alp_root modules=sd-mod,usb-storage,ext4 quiet rootfstype=ext4"
        initrd = /boot/initramfs-lts
        read-write

Устанавливаем LILO

lilo

Вправляем /etc/fstab:

# Оставляем только корень
/dev/vg-kvm/alp_root                            /       ext4    rw,relatime 0 1

Вправляем initramfs (/etc/mkinitfs/mkinitfs.conf):

# Добавим lvm в конфиге
features="ata base ide scsi usb virtio ext4 lvm"

Пересобираем:

# проверим какое ядро
ls /lib/modules/
# пересобираем
mkinitfs -c /etc/mkinitfs/mkinitfs.conf -b / 6.6.24-0-lts

P.S.

После обновления ядра обязательно запустить установку lilo:

lilo
santic
() автор топика
Последнее исправление: santic (всего исправлений: 1)
Ответ на: комментарий от anonymous

Попробовал подружить LIMINE и LVM - не получилось. Сам загрузчик не может прочитать с LVM-тома необходимый ему sys файл: https://ibb.co/2WMV8Lv

Остаётся только LILO из самого быстрого и рабочего варианта .

santic
() автор топика
Последнее исправление: santic (всего исправлений: 1)
Ответ на: комментарий от santic

В итоге перенос ОС на LVM-диск состоялся. Выбран вариант с загрузкой ядра с помощью LILO. На реальном железе всплыли нюансы (выбор диска для загрузки, не работающее монтирование и т.д.).

Всем спасибо за помощь! @Xenius благодарю в особенности. Вариант с LILO оказался вполне жизнеспособный.

santic
() автор топика
Последнее исправление: santic (всего исправлений: 1)