linux的2.6核心有了sysfs,可以通過這個檔案系統得到系統裝置的一些屬性,作為使用sysfs的乙個例子,我們可以修改initrd的init指令碼,使得它可以根據磁碟的屬性而不是bootloader中kernel的root引數來尋找並掛載root,傳統中都是根據root=/dev/sdxy(hdxy)來掛載根的,寫下這個sdxy或者hdxy需要使用者對linux的磁碟命名很了解,一旦hda變成了hdb1(很容易發生,比如跳線或者換了主機板或者磁碟插錯了槽),很多人就不知所措了,我們更需要一種人性化的方式,比如root=seagate/usb等等來尋找並掛載root,有了sysfs,這些都可以在initrd的init指令碼中做到。以下是基本的sh1指令碼(或者寫成乙個指令碼函式也行):
sh1:
mount -t sysfs sys /sys
for disk in `ls /sys/block/|grep $pref`; do #pref為磁碟字首,比如hd為ide磁碟,sd為scsi磁碟
disk=`cat /sys/block/$disk/device/model`
if [ -n "$disk" ]; then
if [ "$" = "$type" ]; then #type為磁碟型別,比如cf卡,dom等
maj=`cat /sys/block/sda/dev|awk -f : ''`
min=$((`cat /sys/block/sda/dev|awk -f : ''`+1)) #預設是第乙個分割槽,當然可以在此加以判斷尋找任意分割槽。
mknod /dev2/device1 b $maj $min #尋找到了裝置號,建立裝置
mount -t ext3 /dev2/device1 /mnt #掛載剛建立的裝置,後面我們直接chroot到/mnt,然後exec(sbin/init)即可
if [ "$?" -eq 0 ]; then #成功
flag="found" #設定標誌
rm -f /mnt/dev/root #刪除建立的裝置
mknod /mnt/dev/root b $maj $min #建立根檔案系統中的裝置,用於mount時的顯式(/etc/fstab中寫/dev/root)
break #跳出迴圈
else
echo "not found" #測試
fielse
echo bianfen #測試「扁粉菜」
fifi
done
可以在initrd的init指令碼中實現乙個基於優先順序的掛載序列,類似bios中設定啟動順序的那樣,比如可以設定usb,dom卡,cf卡,sata磁碟為掛載為根的順序,在init指令碼中首先通過sh1尋找usb裝置,如果找到直接將之掛為root,如果找不到則繼續呼叫sh1尋找dom,依次類推。這樣的話,即使事先不知道磁碟是hd的還是sd的,又不知道是hda1還是hdb1的情況下,只要我們只知道磁碟的一些特性(在sh1這個例子中我們使用model特性,也可以遍歷device目錄匹配任意屬性,當然sh1的**需要更複雜一些,這裡僅僅給出思想)。
為何要修改initrd,因為很多場景都需要乙份grub配置檔案在多台不同機器上都能用,而這些機器的磁碟引線可能不同,比如有的機器上磁碟在hda1,而另外一些機器上就成了hdb1,這樣就需要修改grub配置中kernel的root引數了,或者通過硬體跳線來解決,為了不做這些煩人的動作,索性搞乙個自適應的initrd,而我們所做的僅僅是知道一些磁碟的內秉屬性即可,比如一塊威騰電子的磁碟作為hda和hdb時都是這個牌子,不會變的,不會因機器主機板的變化而變化。
根據uuid來掛載磁碟
生產上原來有幾台機器,是使用傳統的 dev sdx的方式來進行掛載的,經常的在重啟以後碟符會變化導致認不到盤的錯誤 我們推薦使用uuid的方式來進行磁碟的掛載 注 uuid universally unique identifiers全域性唯一識別符號 一 linux磁碟分割槽uuid的獲取方法 l...
Linux根據UUID自動掛載磁碟分割槽
一般伺服器都有多個硬碟分割槽,在重啟後,這些分割槽的邏輯位置載入時可能會發生變動,如果使用傳統的裝置名稱 例如 dev sda 方式掛載磁碟,就可能因為磁碟順序變化而造成混亂。linux環境中每個block device都有乙個全域性唯一的uuid,可以標識這個裝置,我們可以在fstab中使用uui...
linux掛載磁碟
結果顯示這是有兩塊磁碟,分別是sda和sdb。fdisk dev sdb d 刪除分割槽 n 新建分割槽 q 退出不儲存 w 退出並儲存 p 該硬碟的分割槽資訊 mkfs t ext3 vfat dev sdb1 mkdir mnt database mount t ext3 vfat mnt da...