linux根据磁盘的属性挂载root

简介:


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 [ "${disk:0:12}" = "$type" ]; then         #type为磁盘类型,比如cf卡,dom等
            maj=`cat /sys/block/sda/dev|awk -F : '{print $1}'`
            min=$((`cat /sys/block/sda/dev|awk -F : '{print $2}'`+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"         #测试
            fi
        else
            echo BianFen                 #测试“扁粉菜”
        fi
    fi
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时都是这个牌子,不会变的,不会因机器主板的变化而变化。



 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1271085

相关文章
|
2月前
|
存储 Linux
认识Linux文件类型和属性
认识Linux文件类型和属性
58 4
|
3月前
|
Ubuntu Linux Shell
Linux系统中如何查看磁盘情况
【9月更文挑战第3天】在Linux系统中,有多种方式查看磁盘情况。可通过命令行工具`df`查看文件系统磁盘使用情况,选项`-h`以人类可读格式显示,`-T`显示文件系统类型;`du`命令显示目录或文件磁盘使用情况,`-h`以人类可读格式显示,`-s`仅显示总计;`fdisk -l`列出磁盘和分区信息。此外,图形界面的磁盘管理工具和文件管理器也可用于查看磁盘使用情况。这些方法有助于更好地管理磁盘空间。
727 4
|
4月前
|
存储 监控 安全
在Linux中,⼀个EXT3的文件分区,当使用touch test.file命令创建⼀个新文件时报错,报错的信息是提示磁盘已满,但是采用df -h命令查看磁盘大小时,只使用了,60%的磁盘空间,为什么会出现这个情况?
在Linux中,⼀个EXT3的文件分区,当使用touch test.file命令创建⼀个新文件时报错,报错的信息是提示磁盘已满,但是采用df -h命令查看磁盘大小时,只使用了,60%的磁盘空间,为什么会出现这个情况?
|
3月前
|
存储 Linux 5G
Linux 基于 LVM 逻辑卷的磁盘管理【简明教程】
这篇文章介绍了LVM(逻辑卷管理)如何提供灵活的磁盘管理方式,允许动态调整逻辑卷的大小而不会丢失数据。
Linux 基于 LVM 逻辑卷的磁盘管理【简明教程】
|
2月前
|
Linux
linux开机挂载镜像
【10月更文挑战第1天】在 Linux 系统中,开机挂载镜像通常涉及几个关键步骤,包括创建挂载点、编辑配置文件以及重新加载配置
101 0
|
2月前
|
关系型数据库 MySQL Linux
Linux 文件基本属性
Linux 文件基本属性
22 3
|
2月前
|
Unix Linux 对象存储
Linux 磁盘管理
Linux 磁盘管理
46 1
|
2月前
|
监控 Linux 测试技术
Linux系统命令与网络,磁盘和日志监控总结
Linux系统命令与网络,磁盘和日志监控总结
70 0
|
2月前
|
监控 Linux 测试技术
Linux系统命令与网络,磁盘和日志监控三
Linux系统命令与网络,磁盘和日志监控三
49 0
|
4月前
|
Ubuntu Linux
内核实验(四):Qemu调试Linux内核,实现NFS挂载
本文介绍了在Qemu虚拟机中配置NFS挂载的过程,包括服务端的NFS服务器安装、配置和启动,客户端的DHCP脚本添加和开机脚本修改,以及在Qemu中挂载NFS、测试连通性和解决挂载失败的方法。
270 0
内核实验(四):Qemu调试Linux内核,实现NFS挂载