這二天同事在建立了一個新的rocky linux 9的server後,因為要建立很多台再發放到各單位,所以請廠商複製原本能正常運作的硬碟再放到每一台NUC內,但是發現每一台都無法開機,卡在開機boot時要mount lvm裡的logical volume(lv)的/dev/mapper/rl-home 邏輯磁碟區,然後因mount不起來timed out後,也因為 root (/,根目錄)也是建在lvm內故也進不去emergency mode,導致很難查找問題。
後來使用rocky linux的minimal iso做成usb開機並進去rescue mode,這個recue mode很聰明,會自動抓硬碟上的分區再自動mount起來,你只要進去後chroot /mnt/sysroot 就可以處理原本硬碟內的東西了。
進去rescue mode並chroot後,下lvdisplay, vgdisplay, pvdisplay,總是吐同一個訊息:
Devices file sys_wwid nvme. PVID=xxxxxxxxxxxxx last seen on /dev/nvme0n1p3 not found.
原本我還以為是chroot的關係導致看不到,但經過我重新安裝一台一樣是掛lvm的server後,上述指令都能正常呼叫,交叉比對結果發現是 /etc/lvm/devices/system.device 裡的設定不正常,原因是因為對拷硬碟後,新硬碟的wwid(World Wide Identifier, 或稱 World Wide Name (WWN) )每台都不一樣,導致每台的PVID也跟著不一樣,這應該是跟著硬碟的serial number故每台都不同,所以lvm才一直說找不到對應的device。這樣也會導致boot時這些裝置就會被blacklist掉,然後開機一直mount不成功(但真的都沒啥明顯的錯誤訊息啊啊啊呵,查message log也找不到原因)。那為啥live usb/cd開機進去可以mount lvm成功呢?因為auto mount並不需要去讀取原本硬碟的system.deivce檔案啊....
版本9以前沒這個問題,是因為預設是使用 lvm.conf裡的 filter去過濾可以看得到的lvm裝置,從版本9開始,變成預設是用devices file (/etc/lvm/devices/system.device) 去過濾裝置,只要新安裝的OS,都會把掛lvm的device寫入到 system.device 裡,因此只要更換硬碟,那麼很可能就無法開機。
以下是解法:
1.把 /etc/lvm/devices/system.device 刪掉,這樣預設就會用回lvm filter
2.修改 /etc/lvm/lvm.conf 裡的 use_devicesfile = 0 ,這樣一樣會用回lvm filter:
#sed -ri 's/^(\s*)#*\s*(use_devicesfile\s*=\s*)[0-9]*$/\1\20/g' /etc/lvm/lvm.conf
3.重建 system.device為正確的內容,譬如我要把vg所有的device加入:
#rm /etc/lvm/devices/system.device
#vgimportdevices --all
心得:
若要避免這樣的問題,建議就做步驟1跟2,也就是不要用devices file的機制,不然以平常的使用情形,一台server建個lvm卻不mount是蠻少會有這種需求的,另外在虛擬機上要是有修改硬碟類型的話,或用到VirtIO SCSI並將虛擬機的導出再導入,也有可能造成PVID改變而開不了機。
最根本解法就是沒有用lvm的需求的話,就用一般的分割區(ext4, xfs等),不然多了層lvm要除錯就會有點困難。
還有就是lvm裡的lv也不要用一般的fdisk去新增刪除修改,要用lvm專用的指令(lvmdevices等),這樣才會跟著修改如lvm.conf及system.device的內容,不然很可能會造成其它問題。
How to Chroot in Rescue Mode:
https://gist.github.com/cho2/100e2c06cf9865979a3c2539c39ce663
https://wiki.ubuntu-tw.org/index.php?title=GRUB2%E4%B8%AD%E6%96%87%E6%8C%87%E5%8D%97%E7%AC%AC%E4%BA%8C%E7%89%88%28%E4%B8%8A%EF%BC%89#.E6.96.B9.E6.A1.88_3_-_CHROOT
修復開機GRUB啟動(UEFI啟動方式,換新主機/新硬碟等會用到)
https://hackmd.io/@3wVHgj-ES9ixJUlof_TM0Q/BkI8rFqn9#11-%E6%9B%B4%E6%96%B0Grub%E5%BC%95%E5%B0%8E
https://blog.csdn.net/aukomn/article/details/50704293
secure chroot完後,執行:
grub2-mkconfig -o /boot/grub2/grub.cfg
MBR啟動方式:
grub-install /dev/sda
update-grub
UEFI啟動方式:
mount /dev/sda3 /boot/efi //假設sda3是EFI分區
grub2-install /boot/efi
ref:
https://kb.synology.com/zh-tw/DSM/tutorial/My_virtual_machine_running_RHEL_9_enters_emergency_mode
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html/configuring_and_managing_logical_volumes/limiting-lvm-device-visibility-and-usage_configuring-and-managing-logical-volume
https://en.wikipedia.org/wiki/World_Wide_Name
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/storage_administration_guide/persistent_naming#persistent_naming-wwid
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html/configuring_and_managing_logical_volumes/limiting-lvm-device-visibility-and-usage_configuring-and-managing-logical-volumes
https://serverfault.com/questions/1093110/linux-lvm-pvid-last-seen-on
https://bugzilla.redhat.com/show_bug.cgi?id=1965941
https://unix.stackexchange.com/questions/719137/deleting-old-lvms
https://man7.org/linux/man-pages/man8/lvmdevices.8.html
沒有留言:
張貼留言