关于Linux系统增加SCSI硬盘不识别的问题及解决办法

2011年07月19日 Linux服务器 评论 12 条 阅读 20,766 views 次

前面我写了一篇关于Linux系统分区与格式化的文章,有朋友提出这样的问题:“partprobe 这条命令就能重置分区信息,但是在6上面不行

于是就找个时间实验了一下,发现这样的问题:如果系统已经处于启动状态下,向系统中增加硬盘的话,系统就不认新的硬盘。因为我没有真实的服务器来实验,只有虚拟机,所以我目前的情况是RHEL6在虚拟机VM上,但据说真实的机器也是一样的问题。就算在RHEL6上使用了partprobe这个命令,也找不到新的硬盘,其实partprobe这个命令只是针对分区表的,而不是针对设备,所以说,这样肯定是没有效果的啊!

那么如何让系统认识新增加的磁盘设备呢?这就是我们今天的学习内容。在这里要先感谢群中的KADE给以的帮助。
注意,我们增加的磁盘只能是SCSI的,只有这样的才支持热插拔。

下面看一下在系统不重启的情况,如何让系统认识新的磁盘,并能对其分区与格式化
1、在开机状态下新增磁盘
2、执行下面的命令

echo "- - -" >  /sys/class/scsi_host/host2/scan

特别注意

host2一般是/sys/class/scsi_host/下最大的那个文件,也就相当于最后加入的设备。需要根据自己的系统情况而定

"- - -" 这三个-之间是有空格的

我们再查看系统日志/var/log/messages,发现对SCSI设备进行了一次重新扫描,用fdisk -l也看到了新增加的磁盘了。上面的命令主要的目的就是scan the SCSI bus。

3、对磁盘进行分区与格式化,请看羽飞博客中的其他相关文章。这里就不赘述了。

注意

1、通过此方法,格式化就无需通过partprobe这个命令来重新认识分区表了

2、通过此方法,可以在线随意增加删除磁盘(千万不能是系统磁盘)

3、通过此方法,只用一次后,后面再增加新的磁盘,就不用此命令了,系统就能自动认识了(我也不明白为什么,奇怪)

4、在RHEL5中有个kudzu检测硬件,所以就增加完磁盘后,系统能识别(此系统本人已经没有环境测试,据其他用户说是可以识别的)。而在RHEL6中kudzu虽然已经被hal(haldaemon服务)取代了(hal全名Hardware Abstraction Layer,是linux一种管理硬件的机制,它会帮所有的应用程序或用户搜集所有PCI及USB等硬件信息,因此,用户可以很简单并实时地通过HAL的方式取得硬件的相关数据; ),但为什么结果不一样,如果有知道或了解的朋友,请指点一下小弟。

12 条留言  访客:8 条  博主:4 条

  1. avatar 杨晓飞

    [root@desktop1 ~]# fdisk -l /dev/sda

    Disk /dev/sda: 42.9 GB, 42949672960 bytes
    255 heads, 63 sectors/track, 5221 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x000a3945

    Device Boot Start End Blocks Id System
    /dev/sda1 * 1 13 102400 83 Linux
    Partition 1 does not end on cylinder boundary.
    /dev/sda2 13 3583 28672000 8e Linux LVM
    /dev/sda3 3583 3648 524288 82 Linux swap / Solaris
    [root@desktop1 ~]# fdisk /dev/sda

    WARNING: DOS-compatible mode is deprecated. It’s strongly recommended to
    switch off the mode (command ‘c’) and change display units to
    sectors (command ‘u’).
    Command (m for help): p

    Disk /dev/sda: 42.9 GB, 42949672960 bytes
    255 heads, 63 sectors/track, 5221 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x000a3945

    Device Boot Start End Blocks Id System
    /dev/sda1 * 1 13 102400 83 Linux
    Partition 1 does not end on cylinder boundary.
    /dev/sda2 13 3583 28672000 8e Linux LVM
    /dev/sda3 3583 3648 524288 82 Linux swap / Solaris

    Command (m for help): n
    Command action
    e extended
    p primary partition (1-4)
    e
    Selected partition 4
    First cylinder (3648-5221, default 3648):
    Using default value 3648
    Last cylinder, +cylinders or +size{K,M,G} (3648-5221, default 5221):
    Using default value 5221

    Command (m for help): p

    Disk /dev/sda: 42.9 GB, 42949672960 bytes
    255 heads, 63 sectors/track, 5221 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x000a3945

    Device Boot Start End Blocks Id System
    /dev/sda1 * 1 13 102400 83 Linux
    Partition 1 does not end on cylinder boundary.
    /dev/sda2 13 3583 28672000 8e Linux LVM
    /dev/sda3 3583 3648 524288 82 Linux swap / Solaris
    /dev/sda4 3648 5221 12637970+ 5 Extended

    Command (m for help): n
    First cylinder (3648-5221, default 3648):
    Using default value 3648
    Last cylinder, +cylinders or +size{K,M,G} (3648-5221, default 5221): +100M

    Command (m for help):
    Command (m for help):
    Command (m for help): w
    The partition table has been altered!

    Calling ioctl() to re-read partition table.

    WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
    The kernel still uses the old table. The new table will be used at
    the next reboot or after you run partprobe(8) or kpartx(8)
    Syncing disks.
    [root@desktop1 ~]#
    [root@desktop1 ~]# fdisk -l /dev/sda

    Disk /dev/sda: 42.9 GB, 42949672960 bytes
    255 heads, 63 sectors/track, 5221 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x000a3945

    Device Boot Start End Blocks Id System
    /dev/sda1 * 1 13 102400 83 Linux
    Partition 1 does not end on cylinder boundary.
    /dev/sda2 13 3583 28672000 8e Linux LVM
    /dev/sda3 3583 3648 524288 82 Linux swap / Solaris
    /dev/sda4 3648 5221 12637970+ 5 Extended
    /dev/sda5 3648 3661 107239 83 Linux
    [root@desktop1 ~]#
    [root@desktop1 ~]# mkfs.ext4 /dev/sda
    sda sda1 sda2 sda3
    [root@desktop1 ~]# echo “- – -” > /sys/class/scsi_host/host2/scan
    [root@desktop1 ~]# mkfs.ext4 /dev/sda
    sda sda1 sda2 sda3
    老师,在分区过后,没做任何设置,fdisk -l /dev/sda 能查看到我做到分区,
    但是mkfs.ext4 /dev/sda 还是找不到我刚刚做的分区,我贴了我做的命令详细!请老师在看看

    • echo “- – -” > /sys/class/scsi_host/host2/scan
      你明白他是干嘛的了吗?
      请仔细阅读本文章。

      有两点不明白,你都找到磁盘了,干吗还要用此命令呢?
      你分区与格式化sda?这个是你的系统盘不?

      • avatar 杨晓飞

        我看懂意思了 ,可能是我说的,老师你没理解!分区过会能看到分区信息,可是我格式化我刚刚新建的那个分区,如上面的命令,我新建了sda5这个分区,现在我需要格式化它,在rhel5的情况下,用partprobe之后,我用mkfs.ext4 /dev/sdaX 能找到sda5 分区 ,可是现在rhel6,使用相同的方法,却是不行的!

        • 第一个问题:你是新增加的硬盘还是系统已经有的硬盘?(意思是不是加过硬盘,重新启动过机子)
          第二个问题:/dev/sda4 是扩展分区,而/dev/sda5是逻辑分区,你上面的分区情况,我没有发现/dev/sda5是逻辑分区的信息,是不是哪里有问题?
          第三个问题:无论是在RHEL5/RHEL6上,我分区后都能直接格式化。(而不需要输入partprobe或 kpartx)当然这个可能是虚拟机有关系。

          • avatar 杨晓飞

            1、新增的分区时再原有饿硬盘上分出来的,分区过后没有重启过机子!
            2、恩,sda4是新建的扩展分区,sda5是新建的逻辑分区
            3、分区过后直接格式化找到不相应的分区,比如我格式化sda5
            4、今天向别人请教了一个方法,:命令partx -a (对于新建分区)
            partx -d (对于删除分区)
            具体的我不知道为什么这样,求解!

            • 为什么会这样?
              其实系统已经提示你了啊!!
              WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
              The kernel still uses the old table. The new table will be used at
              the next reboot or after you run partprobe(8) or kpartx(8)

              • avatar 杨晓飞

                系统提示reboot系统啊,那么做实验很浪费时间,所以我回复信息,就是问问您能不能在线实现,而不需要重启机器!

                • 兄弟啊。我无语啊,人家不是给了解决方案吗?
                  要么重新启动,
                  要么执行partprobe or kpartx
                  那你还想怎么办?
                  要不你到磁盘里面给他分区格式化吧!!哈哈!

  2. avatar 杨晓飞

    重启后:

    [root@desktop1 ~]# mkfs.ext4 /dev/sda
    sda sda1 sda2 sda3 sda4 sda5
    分区出现了

  3. avatar halfbloodrock

    partprobe不能动态挂载分区,这个是RHEL6的bug。6.1似乎修复了这个bug
    https://partner-bugzilla.redhat.com/show_bug.cgi?id=614357

  4. avatar itnihao

    今天发现partprobe这个命令在rhel6.0下面的用法所partprobe /dev/sdb针对一个磁盘
    partprobe /dev/sda4针对一个分区,否则提示的所文件系统正忙,其实非partprobe在rhel6.0下无法使用,至于是不所是系统bug,难说……

给我留言

Copyright © 羽飞博客 保留所有权利.   Ality主题 皖ICP备14013844号-1

用户登录