LINUX.ORG.RU

Не загружается ядро Gentoo с grub2 + dm-crypt + кривые руки

 , , , ,


0

1

Есть 2 раздела:

/dev/sda1 - boot (ext2)
/dev/sda2 - root (crypto_LUKS)

Ставлю grub2 первый раз, так что не знаю что там должно быть на выходе, делал так:

1. Попробовал просто выполнить grub2-mkconfig -o /boot/grub2/grub.cfg, получил это:

Generating grub.cfg ...
   No volume groups found
done
На этой стадии, я вроде как должен был увидеть обнаруженные ядра, но ничего нет (os-prober установлен) а в /boot, который находится на /dev/sda1 лежит мое ядро gentoo-3.10.9-amd64

2. Пробовал вручную описать свое ядро в файле /etc/grub.d/40_custom так:

menuentry "Gentoo Linux 3.10.9" {
set root=(hd0,0)
linux /boot/gentoo-3.10.9-amd64 crypt_root=/dev/sda2
}
В итоге в grub'е появился раздел, но при нажатии я получал ошибку:
error: no such partition.

Что я делаю не так?

Сперва поставь grub2

grub2-install /dev/sda

Покажи, что у тебя в /boot (коммандой ls)

Chaser_Andrey ★★★★★
()

ещё у тебя должен быть initramfs, без него ты не запустишь систему на зашифрованном руте.

menuentry "Gentoo Linux 3.10.9" {
set root=(hd0,0)
linux /boot/gentoo-3.10.9-amd64 crypt_root=/dev/sda2
}

Здесь я не вижу initrd/initramfs

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

ls -l /boot:

-rw-r--r-- 1 root root 6003296 Aug 30 19:11 gentoo-3.10.9-amd64
drwxr-xr-x 4 root root    1024 Aug 30 19:46 grub2

initrd/initramfs, нет, думал без них обойдусь. Как проще всего сделать initramfs, не используя genkernel, который описанв gentoo хендбуке?

Спасибо.

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

Используй genkernel, а если не хочешь — есть mkinitramfs или, что поновее, dracut, но его Я так и не завел.

zunkree
()
Ответ на: комментарий от Glaciuse

Да, забыл, genkernel умеет просто генерить initramfs без сборки ядра. Только скажи ему что у Тебя криптование.

zunkree
()
Ответ на: комментарий от Chaser_Andrey

fdisk -l /dev/sda:

Disk /dev/sda: 120 GB, 120034123776 bytes, 234441648 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00c13af

   Device  Boot    Start         End     Blocks    Id    System
/dev/sda1  *          63      160649      80293+   83    Linux
/dev/sda2         160650   234441647  117140499    83    Linux

mount:

...
/dev/mapper/dist_root on /mnt/gentoo type ext4 (rw,relatime,data=ordered)
/dev/sda1 on /mnt/gentoo/boot type ext2 (rw,relatime,errors=continue,user_xattr,acl)
...

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

fstab:

/dev/mapper/disk_root   /      ext4   noatime           0 1
/dev/sda1               /boot  ext2   defaults,noatime  0 2

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

С помощью genkernel можно сгенерить только initramfs, не трогая ядро, например, так:

genkernel --kernel-config=/usr/src/linux/.config --lvm  --disklabel initramfs

Тебе lvm не нужен, но нужен crypt, вроде, глянь на вики в генте.

Ещё я пробовал dracut, у меня завёлся. Только собери с нужными опциями.

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

А как будет выглядеть строки запуска ядра? Как-то так:

menuentry "Gentoo Linux 3.10.9" {
set root=(hd0,0)
linux /boot/gentoo-3.10.9-amd64 crypt_root=/dev/sda2 real_root=/dev/mapper/disk_root root=/dev/ram0
initrd /boot/initramfs-gentoo-3.10.9-amd64
}
?

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

Спасибо всем, пойду ковыряться дальше )

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

initrd/initramfs, нет, думал без них обойдусь

Ядро не может самостоятельно расшифровать, создать ноду в /dev/mapper и примонтировать рутовый раздел, это делают юзерспейсные утилиты, а они находятся на руте, и к ним ядро не имеет доступа, пока не раздел не будет расшифрован (точнее, открыт криптоконтейнер). Вот такое замкнутое кольцо.

Поэтому используют initramfs, который содержит в себе нужные тулзы. Ядро при загрузке устанавливает рутом файловую систему из initramfs, запускается процесс init из initramfs, который в своб очередь запускает скрипты/тулзы для проведения манипуляций с дисками и остальным. Когда всё готово — делается pivot_root и рутовая система сменяется на «настоящую», а память, выделенная для initramfs — освобождается.

На самом деле можно обойтись без initramfs, но всё равно где-то должна быть / с нужными утилитами для bootstrap (ещё на одном разделе, на флешке, да где угодно, лишь бы grub смог примонтировать её), и оттуда, после открытия криптоконтейнера, сделать pivot_root в зашифрованный рут.

pivot_root можно делать и на запущенной системе, но для этого нужно сделать много финтов ушами. Зато возможно почти на лету поменять рут с одного диска на другой без lvm (без ребута).

Пусть меня поправят, если я ошибаюсь.

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

может, тебе надо добавить модуль для поддержки ext2? Типа так:

menuentry "Gentoo Linux 3.10.9" {
insmod ext2
set root=(hd0,0)
linux /boot/gentoo-3.10.9-amd64 crypt_root=/dev/sda2 real_root=/dev/mapper/disk_root root=/dev/ram0
initrd /boot/initramfs-gentoo-3.10.9-amd64
}

На счёт конкретных опций к ядру я не подскажу, так как luks делал в связке с dracut, там по-другому.

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

Спасибо за разъяснение, по поводу модулю ext2, я включил его поддержку в ядре как «*», так что должно заработать. Мои USE: «bindist mmx sse sse2 sse3 alsa», grub'у ничего не говорил с какими лично ему флагами собираться, так что собрался он с теми что ему нужны для корректной работы по-умолчанию.

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

grub2-mkconfig до сих пор не работает?

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

Собрал образ initramfs, но теперь на нем (initrd /boot/образ) все падает и комп перезагружается. А на строке linux /boot/ядро параметры (в точности как описано выше) так и вылезает сообщение:

error: no such partition.
Почему же он раздел найти не может?

добавь в make.conf:
GRUB_PLATFORMS="pc"

Это добавил, ничего не изменилось.

grub2-mkconfig до сих пор не работает?

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

Generating grub.cfg ...
   No volume groups found
done

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

lsblk:

NAME                  MAJ:MIN  RM    SIZE  RO  TYPE  MOUNTPOINT
sda                     8:0    0   111.8G   0  disk
|-sda1                  8:1    0    78.4M   0  part  /mnt/gentoo/boot
`-sda2                  8:2    0   111.7G   0  part
  `-crypt_root (dm-0) 253:0    0   111.7G   0  crypt

blkid:

/dev/sda2: UUID="97668a14-5f03-43b4-97ea-f51bbfc02dbe" TYPE="crypto_LUKS"
/dev/loop0: TYPE="squashfs"
/dev/sda1: UUID="a15e4e4f-5083-3cc1-bfe6-a8356070f3f4" TYPE="ext2"
/dev/mapper/crypt_root: LABEL="OCZ-SSD" UUID="01c50826-80c0-4df11-b00a-ae7470da52e1" TYPE="ext4"

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

Странно, я думал что sda1 это (hd0,0), а sda2 это (hd0,1), но grub говорит следующее:

grub> ls
(hd0) (hd0,msdos2) (hd0,msdos1)

grub> ls (hd0,0)
error: no such partition. <- тут вроде как должен быть sda1

grub> ls (hd0,1) 
Partition hd0,1: Filesystem type ext* blabla Total size 80293.5 KiB <- это как раз sda1

grub> ls (hd0,2) 
Partition hd0,2: No known filesystem detected blabla Total size 117140499 KiB <- это уже зашифрованный sda2

Что, теперь grub с 1 нумерацию начинает?
И откуда там msdos взялся?

В итоге сделал в /etc/grub.d/40_custom вот так:

menuentry "Gentoo Linux 3.10.9" {
#set root=(hd0,0)
linux (hd0,1)/gentoo-3.10.9-amd64 crypt_root=/dev/sda2 real_root=/dev/mapper/crypt_root root=/dev/ram0
initrd (hd0,1)/initramfs-gentoo-3.10.9-amd64
}

Так ядро начинает грузится и даже доходит до пункта

Enter passphrase for /dev/sda2: 
Но после ввода правильного или неправильного пароля вываливается следующее:
device-mapper: remove ioctl on temporary-ctypsetup-2318 failed: No such device or address
device-mapper: reload ioctl on temporary-ctypsetup-2318 failed: No such device or address
device-mapper: remove ioctl on temporary-ctypsetup-2318 failed: No such device or address
device-mapper: remove ioctl on temporary-ctypsetup-2318 failed: No such device or address
device-mapper: remove ioctl on temporary-ctypsetup-2318 failed: No such device or address
device-mapper: remove ioctl on temporary-ctypsetup-2318 failed: No such device or address

!! Failed to open LUKS device /dev/sda2
!! Please file a bug report with this message
Дальше идет попытка убить процесс init и kernel panic

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

В ядре dm_crypt CONFIG_DM_CRYPT включено?

P.S. msdos в данном случае это тип таблицы разделов, а считает grub разделы с 1 насколько Я помню.

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

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

Мой диск разбит так:
/dev/sda1 - boot, в grub2 это (hd0,1)
/dev/sda2 - зашифрованный root

/etc/grub.d/40_custom:

menuentry "Gentoo Linux 3.11.0" {
    set root=(hd0,1)
    linux /gentoo-3.11.0-amd64 crypt_root=/dev/sda2 real_root=/dev/mapper/root root=/dev/ram0 quiet
    initrd /initramfs-genkernel-x86_64-3.11.0-gentoo
}

В ядре включено следующее:

Cryptographic API ->
   -*- Cryptographic algorithm manager
   <*> Userspase cryptographic algorithm configuration
   [*] Disable run-time self tests
   -*- Software async crypto daemon
   -*- Authenc support
   -*- Sequence Number IV Generator
   -*- CBC support
   <*> CTR support
   <*> CTS support
   <*> ECB support
   -*- LRW support
   <*> PCBC support
   -*- XTS support
   -*- HMAC support
   -*- CRC32c CRC algotithm
   <*> CRC32c INTEL hardware acceleration
   <*> CRC32 CRC algorithm
   <*> MD4 digest algorithm
   -*- MD5 digest algorithm
   -*- SHA1 digest algorithm
   <*> SHA256 digest algorithm (SSSE3/AVX/AVX2)
   <*> SHA512 digest algorithm (SSSE3/AVX/AVX2)
   -*- SHA224 and SHA256 digest algorithm
   -*- SHA384 and SHA512 digest algorithms
   -*- AES cipher algorithms
   -*- AES cipher algorithms (x86_64)
   <*> AES cipher algorithms (AES-NI)
   -*- ARC4 cipher algorithm
   -*- DES and Triple DES EDE cipher algorithms
   <*> User-space interface for hash algorithms
   <*> User-space interface for symmetric key cipher algorithms
File systems ->
   Включена поддержка ext2/ext3/ext4
General setup ->
   [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
Device Drivers ->
   Multiple device driver support (RAID and LVM) ->
       <*> Device mapper support
       <*> Crypt target support
       <*> Mirror target
       <*> Zero target

Сбока initrams:

genkernel --kernel-config=/usr/src/linux/.config --luks iniramfs

/etc/conf.d/dmcrypt:

source='/dev/sda2'
target='root'

#Первый раз запустилось со слипом ниже, но потом все и без него работает хорошо
#post_mount='/dev/mapper/root/usr/bin/sleep 1'

/etc/fstab:

/dev/mapper/root      /       ext4     noatime     0 1
/dev/sda1             /boot   ext2     noatime     1 2

/etc/portage/make.conf:

GRUB_PLATFORMS="pc"

После того как ядро и initramfs появились в /boot:

grub2-mkconfig -o /boot/grub2/grub.cfg
После этого все заработало.
Всем спасибо.

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

Дополню: обновился grub и теперь конфиг следует сохранять так:

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

Glaciuse
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.