ວິທີແກ້ໄຂຂໍ້ຜິດພາດຂອງ Dracut

Caleb McKee, Héctor Louzao, Frank Sträter Version all Last review: 2023-12-06

ຄຳນຳ

ຫາກທ່ານພົບບັນຫາກ່ຽວກັບການເລີ່ມຕົ້ນລະບົບເນື່ອງຈາກ Dracut, ກະລຸນາເບິ່ງເອກະສານ ບັນຫາທົ່ວໄປ (common bugs) ກ່ອນທີ່ຈະແຈ້ງບັກ (bug). ການປັບແຕ່ງການຕັ້ງຄ່າບາງຢ່າງທີ່ງ່າຍດາຍອາດຈະຊ່ວຍແກ້ໄຂບັນຫາໄດ້ຫຼາຍຢ່າງ. ຫາກບັນຫາທີ່ທ່ານພົບບໍ່ມີຢູ່ໃນລາຍຊື່ນັ້ນ ຫຼື ວິທີການແກ້ໄຂເບື້ອງຕົ້ນບໍ່ຊ່ວຍໄດ້, ກະລຸນາພິຈາລະນາແຈ້ງບັກເພື່ອຊ່ວຍໃຫ້ພວກເຮົາເຮັດໃຫ້ Fedora ເຮັດວຽກໄດ້ດີຂຶ້ນໃນຮາດແວຂອງທ່ານ.

ກະລຸນາກຽມຂໍ້ມູນ (ບັນທຶກ/logs) ກ່ຽວກັບລະບົບຂອງທ່ານນຳ. ຂໍ້ມູນເຫຼົ່ານີ້ຄວນຈະສົມບູນ (ບໍ່ຄວນຕັດມາພຽງບາງສ່ວນ), ບໍ່ຄວນຢູ່ໃນຮູບແບບໄຟລ໌ບີບອັດ, ແລະ ຕັ້ງຄ່າ MIME type ເປັນ text/plain.

ການລະບຸພື້ນທີ່ຂອງບັນຫາ

  1. ລຶບ rhgb ແລະ quiet ອອກຈາກແຖວຄຳສັ່ງເຄີເນິລ (kernel command line)

  2. ເພີ່ມ rd.shell ເຂົ້າໃນແຖວຄຳສັ່ງເຄີເນິລ. ນີ້ຈະສະແດງເຊລ (shell) ໃນກໍລະນີທີ່ dracut ບໍ່ສາມາດຊອກຫາອຸປະກອນຮາກ (root device) ຂອງທ່ານພົບ

  3. ເພີ່ມ rd.shell rd.debug log_buf_len=1M ເຂົ້າໃນແຖວຄຳສັ່ງເຄີເນິລ ເພື່ອ ໃຫ້ຄຳສັ່ງເຊລຂອງ dracut ສະແດງຜົນອອກມາວ່າຍັງເຮັດວຽກຫຍັງແດ່ໃນຂະນະທີ່ມັນຖືກປະຕິບັດ

  4. ກວດສອບບັນທຶກ (logs) ຂອງລະບົບ:

$ sudo less /run/initramfs/rdsosreport.txt
$ sudo journalctl -a
$ sudo dmesg
$ sudo less /run/initramfs/init.log

ຂໍ້ມູນທີ່ຄວນລະບຸໃນລາຍງານຂອງທ່ານ

ລາຍງານບັກທັງໝົດ

ໃນທຸກກໍລະນີ, ຄວນລະບຸ ແລະ ແນບຂໍ້ມູນຕໍ່ໄປນີ້ໄປກັບລາຍງານບັກຂອງທ່ານ:

  • ແຖວຄຳສັ່ງເຄີເນິລ (kernel command-line) ທີ່ໃຊ້. ໂດຍປົກກະຕິແມ່ນມາຈາກໄຟລ໌ຕັ້ງຄ່າ bootloader (ເຊັ່ນ: /etc/grub.conf) ຫຼື ຈາກ /proc/cmdline

  • ສຳເນົາຂໍ້ມູນພາກສ່ວນດິສກ໌ (disk partition) ຈາກ /etc/fstab

  • ລາຍຊື່ອຸປະກອນຈາກ device-mapper. ສາມາດເອົາໄດ້ໂດຍການໃຊ້ຄຳສັ່ງ dmsetup ls — tree

  • ລາຍຊື່ຄຸນລັກສະນະຂອງບລັອກອຸປະກອນ (block device) ລວມທັງໂໝດທີ່ເຂົ້າກັນໄດ້ກັບ vol_id. ສາມາດເອົາໄດ້ໂດຍການໃຊ້ຄຳສັ່ງ blkid ແລະ blkid -o udev

  • ເປີດການໃຊ້ງານ dracut debugging (ເບິ່ງ ພາກສ່ວນ 'debugging dracut'), ແລະ ແນບຂໍ້ມູນທີ່ກ່ຽວຂ້ອງທັງໝົດຈາກ boot log. ສາມາດເອົາໄດ້ໂດຍການໃຊ້ຄຳສັ່ງ dmesg|grep dracut

  • ຫາກທ່ານໃຊ້ໄຟລ໌ຕັ້ງຄ່າ dracut, ກະລຸນາແນບ /etc/dracut.conf ມານຳ

ນອກຈາກຂໍ້ມູນໃນ ພາກສ່ວນ 'ລາຍງານບັກທັງໝົດ' ແລ້ວ, ໃຫ້ລະບຸຂໍ້ມູນຕໍ່ໄປນີ້ມານຳ:

  • ລະບຸຂໍ້ມູນ physical volume ໂດຍການໃຊ້ຄຳສັ່ງ: lvm pvdisplay

  • ລະບຸຂໍ້ມູນ volume group ໂດຍການໃຊ້ຄຳສັ່ງ: lvm vgdisplay

  • ລະບຸຂໍ້ມູນ logical volume ໂດຍການໃຊ້ຄຳສັ່ງ: lvm lvdisplay

ນອກຈາກຂໍ້ມູນໃນ ພາກສ່ວນ 'ລາຍງານບັກທັງໝົດ' ແລ້ວ, ໃຫ້ລະບຸຂໍ້ມູນຕໍ່ໄປນີ້ມານຳ:

  • ຫາກໃຊ້ພາກສ່ວນດິສກ໌ແບບ software RAID, ກະລຸນາແນບຜົນທີ່ໄດ້ຈາກ /proc/mdstat ມານຳ

ພາກສ່ວນນີ້ອະທິບາຍລາຍລະອຽດຂໍ້ມູນທີ່ຄວນລະບຸເມື່ອພົບບັນຫາໃນລະບົບທີ່ອຸປະກອນຮາກ (root device) ຕັ້ງຢູ່ເທິງເຄືອຂ່າຍ (ເຊັ່ນ: iSCSI, NFS ຫຼື NBD). ນອກຈາກຂໍ້ມູນໃນ ພາກສ່ວນ 'ລາຍງານບັກທັງໝົດ' ແລ້ວ, ໃຫ້ລະບຸຂໍ້ມູນຕໍ່ໄປນີ້ມານຳ:

  • ກະລຸນາແນບຜົນທີ່ໄດ້ຈາກ

ການດີບັກ (Debugging) dracut

ການຕັ້ງຄ່າ serial console

ການດີບັກ dracut ໃຫ້ປະສົບຜົນສຳເລັດນັ້ນຈຳເປັນຕ້ອງມີການບັນທຶກຄອນໂຊລ (console logging) ໃນລະຫວ່າງການບູດລະບົບ. ພາກສ່ວນນີ້ຈະແນະນຳການຕັ້ງຄ່າການເຊື່ອມຕໍ່ serial console ເພື່ອບັນທຶກຂໍ້ຄວາມການບູດ. ເພື່ອເປີດໃຊ້ການສະແດງຜົນ serial console ສຳລັບທັງເຄີເນິລ ແລະ bootloader, ໃຫ້ປະຕິບັດຕາມຂັ້ນຕອນລຸ່ມນີ້.

  1. ເປີດໄຟລ໌ /etc/grub.conf ເພື່ອແກ້ໄຂ. ຢູ່ລຸ່ມແຖວ timeout=5, ໃຫ້ເພີ່ມຂໍ້ຄວາມຕໍ່ໄປນີ້:

    serial --unit=0 --speed=9600
    terminal --timeout=5 serial console
  2. ນອກຈາກນັ້ນໃນ /etc/grub.conf, ໃຫ້ເພີ່ມ boot arguments ຕໍ່ໄປນີ້ເຂົ້າໃນແຖວ kernel:

    console=tty0 console=ttyS0,9600
  3. ເມື່ອສຳເລັດແລ້ວ, /etc/grub.conf ຄວນຈະມີລັກສະນະຄ້າຍຄືກັບຕົວຢ່າງລຸ່ມນີ້:

    default=0
    timeout=5
    serial --unit=0 --speed=9600
    terminal --timeout=5 serial console
    title Fedora (2.6.29.5-191.fc11.x86_64)
       root (hd0,0)
       kernel /vmlinuz-2.6.29.5-191.fc11.x86_64 ro root=/dev/mapper/vg_uc1-lv_root console=tty0 console=ttyS0,9600
       initrd /dracut-2.6.29.5-191.fc11.x86_64.img

ສາມາດເບິ່ງຂໍ້ມູນລະອຽດເພີ່ມເຕີມກ່ຽວກັບວິທີຕັ້ງຄ່າເຄີເນິລສຳລັບການສະແດງຜົນທາງຄອນໂຊລໄດ້ທີ່ 1.

ການໃຊ້ dracut shell

Dracut ມີເຊລ (shell) ສຳລັບການດີບັກແບບໂຕ້ຕອບໃນກໍລະນີທີ່ dracut ບໍ່ສາມາດຊອກຫາລະບົບໄຟລ໌ຮາກ (root filesystem) ຂອງທ່ານພົບ. ເພື່ອເປີດໃຊ້ເຊລ:

  1. ເພີ່ມພາມາມິເຕີການບູດ rd.shell ເຂົ້າໃນໄຟລ໌ຕັ້ງຄ່າ bootloader ຂອງທ່ານ (ເຊັ່ນ: /etc/grub/conf)

  2. ລຶບ boot arguments rhgb ແລະ quiet ອອກ

ຕົວຢ່າງໄຟລ໌ຕັ້ງຄ່າ bootloader /etc/grub.conf ແມ່ນຢູ່ລຸ່ມນີ້:

default=0
timeout=5
serial --unit=0 --speed=9600
terminal --timeout=5 serial console
title Fedora (2.6.29.5-191.fc11.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.29.5-191.fc11.x86_64 ro root=/dev/mapper/vg_uc1-lv_root console=tty0 rd.shell
        initrd /dracut-2.6.29.5-191.fc11.x86_64.img

ຫາກການບູດລະບົບຫຼົ້ມເຫຼວ, ທ່ານຈະຖືກພາເຂົ້າສູ່ເຊລ (shell) ດັ່ງທີ່ເຫັນໃນຕົວຢ່າງລຸ່ມນີ້:

No root device found
Dropping to debug shell.

sh: can't access tty; job control turned off
#

ໃຊ້ເຊລນີ້ເພື່ອຮວບຮວມຂໍ້ມູນທີ່ຕ້ອງການຕາມທີ່ໄດ້ລະບຸໄວ້ຂ້າງເທິງ (ເບິ່ງ ພາກສ່ວນ 'ລາຍງານບັກທັງໝົດ').

ການເຂົ້າເຖິງ root volume ຈາກ dracut shell

ຈາກ dracut debug shell, ທ່ານສາມາດຄົ້ນຫາ ແລະ ກຽມ root volume ສຳລັບການບູດດ້ວຍຕົນເອງໄດ້. ຂັ້ນຕອນທີ່ຈຳເປັນຈະຂຶ້ນຢູ່ກັບວ່າ root volume ຂອງທ່ານຖືກຕັ້ງຄ່າໄວ້ແນວໃດ. ສະຖານະການທົ່ວໄປປະກອບມີ:

  • ບລັອກອຸປະກອນ (block device) (ເຊັ່ນ: /dev/sda7)

  • LVM logical volume (ເຊັ່ນ: /dev/VolGroup00/LogVol00)

  • ອຸປະກອນທີ່ຖືກເຂົ້າລະຫັດ (ເຊັ່ນ: /dev/mapper/luks-4d5972ea-901c-4584-bd75-1da802417d83)

  • ອຸປະກອນທີ່ເຊື່ອມຕໍ່ຜ່ານເຄືອຂ່າຍ (ເຊັ່ນ: netroot=iscsi:@192.168.0.4::3260::iqn.2009-02.org.fedoraproject:for.all)

ວິທີການທີ່ແນ່ນອນໃນການຄົ້ນຫາ ແລະ ກຽມການຈະແຕກຕ່າງກັນໄປ. ຢ່າງໃດກໍຕາມ, ເພື່ອໃຫ້ສາມາດບູດຕໍ່ໄດ້ສຳເລັດ, ເປົ້າໝາຍແມ່ນເພື່ອຄົ້ນຫາ root volume ຂອງທ່ານ ແລະ ສ້າງລິ້ງສັນຍະລັກ (symlink) /dev/root ທີ່ຊີ້ໄປຫາລະບົບໄຟລ໌ນັ້ນ. ຕົວຢ່າງຕໍ່ໄປນີ້ຈະສະແດງການເຂົ້າເຖິງ ແລະ ບູດ root volume ທີ່ເປັນ LVM Logical volume ທີ່ຖືກເຂົ້າລະຫັດ.

  1. ກວດສອບພາກສ່ວນດິສກ໌ (partitions) ຂອງທ່ານດ້ວຍ parted:

    $ sudo parted /dev/sda -s p
    Model: ATA HTS541060G9AT00 (scsi)
    Disk /dev/sda: 60.0GB
    Sector size (logical/physical): 512B/512B
    Partition Table: msdos
    
    Number  Start   End     Size    Type      File system  Flags
     1      32.3kB  10.8GB  107MB   primary   ext4         boot
     2      10.8GB  55.6GB  44.7GB  logical                lvm
  2. ທ່ານຈື່ໄດ້ວ່າ root volume ຂອງທ່ານແມ່ນ LVM logical volume. ໃຫ້ສະແກນ ແລະ ເປີດໃຊ້ງານ logical volumes ຕ່າງໆ:

    $ sudo lvm vgscan
    $ sudo lvm vgchange -ay
  3. ຕອນນີ້ທ່ານຄວນຈະເຫັນ logical volumes ຕ່າງໆ ໂດຍການໃຊ້ຄຳສັ່ງ blkid:

    $ sudo blkid
    /dev/sda1: UUID="3de247f3-5de4-4a44-afc5-1fe179750cf7" TYPE="ext4"
    /dev/sda2: UUID="Ek4dQw-cOtq-5MJu-OGRF-xz5k-O2l8-wdDj0I" TYPE="LVM2_member"
    /dev/mapper/linux-root: UUID="def0269e-424b-4752-acf3-1077bf96ad2c" TYPE="crypto_LUKS"
    /dev/mapper/linux-home: UUID="c69127c1-f153-4ea2-b58e-4cbfa9257c5e" TYPE="ext3"
    /dev/mapper/linux-swap: UUID="47b4d329-975c-4c08-b218-f9c9bf3635f1" TYPE="swap"
  4. ຈາກຜົນທີ່ສະແດງຂ້າງເທິງ, ທ່ານຈື່ໄດ້ວ່າ root volume ຂອງທ່ານຢູ່ເທິງບລັອກອຸປະກອນທີ່ຖືກເຂົ້າລະຫັດ. ໃຫ້ປົດລັອກ root volume ທີ່ຖືກເຂົ້າລະຫັດຂອງທ່ານ.

    $ UUID=$(sudo cryptsetup luksUUID /dev/mapper/linux-root)
    $ sudo cryptsetup luksOpen /dev/mapper/linux-root luks-$UUID
    Enter passphrase for /dev/mapper/linux-root:
    Key slot 0 unlocked.
  5. ຕໍ່ໄປ, ໃຫ້ສ້າງລິ້ງສັນຍະລັກ (symbolic link) ໄປຫາ root volume ທີ່ປົດລັອກແລ້ວ

    $ sudo ln -s /dev/mapper/luks-$UUID /dev/root
  6. ເມື່ອມີ root volume ພ້ອມແລ້ວ, ທ່ານສາມາດບູດລະບົບຕໍ່ໄດ້ໂດຍການອອກຈາກ dracut shell

    exit

ສະຫຼຸບຕົວເລືອກແຖວຄຳສັ່ງເຄີເນິລ (kernel command line) ຂອງ dracut

ຕົວເລືອກຂອງ dracut ທີ່ກ່ຽວຂ້ອງກັບການດີບັກທີ່ພົບເລື້ອຍທີ່ສຸດ:

rd.shell

ເຂົ້າສູ່ເຊລ (shell) ຫາກ initramfs ຫຼົ້ມເຫຼວ.

rd.debug

ຕັ້ງຄ່າ -x ສຳລັບ dracut shell.

rd.break=[cmdline|pre-udev|pre-trigger|initqueue|pre-mount|mount|pre-pivot|cleanup]

ຢຸດເຂົ້າສູ່ເຊລຕາມຈຸດຢຸດ (breakpoint) ທີ່ກຳນົດໄວ້ (ໃຊ້ egrep 'rd.?break' /usr/lib/dracut/modules.d/99base/init.sh ເພື່ອຊອກຫາຈຸດຢຸດທີ່ຮອງຮັບໂດຍເວີຊັນ dracut ຂອງທ່ານ)

rd.udev.info

ຕັ້ງຄ່າ udev ໃຫ້ມີລະດັບການບັນທຶກ (loglevel) ເປັນ info (ນີ້ແມ່ນລະດັບເລີ່ມຕົ້ນ)

rd.udev.debug

ຕັ້ງຄ່າ udev ໃຫ້ມີລະດັບການບັນທຶກ (loglevel) ເປັນ debug

ເບິ່ງ dracut.cmdline(7) ໜ້າຄູ່ມື (man page) ສຳລັບການອ້າງອີງທີ່ສົມບູນ.