6.5 添加硬盘设备

根据前文讲解的与管理硬件设备相关的理论知识,我们先来理清一下添加硬盘设备的操作思路:首先需要在虚拟机中模拟添加入一块新的硬盘存储设备,然后再进行分区、格式化、挂载等操作,最后通过检查系统的挂载状态并真实地使用硬盘来验证硬盘设备是否成功添加。

鉴于我们不需要为了做这个实验而特意买一块真实的硬盘,而是通过虚拟机软件进行硬件模拟,因此这再次体现出了使用虚拟机软件的好处。具体的操作步骤如下。

第1步:首先把虚拟机系统关机,稍等几分钟会自动返回到虚拟机管理主界面,然后单击“编辑虚拟机设置”选项,在弹出的界面中单击“添加”按钮,新增一块硬件设备,如图6-6所示。

在虚拟机中添加硬盘

图6-6 在虚拟机系统中添加硬件设备

第2步:选择想要添加的硬件类型为“硬盘”,然后单击“下一步”按钮就可以了,这确实没有什么需要进一步解释的,如图6-7所示。

6.5 添加硬盘设备 - 图2

图6-7 选择添加硬件类型

第3步:选择虚拟硬盘的类型为SCSI(默认推荐),并单击“下一步”按钮,这样虚拟机中的设备名称过一会儿后应该为/dev/sdb,如图6-8所示。

6.5 添加硬盘设备 - 图3

图6-8 选择硬盘设备类型

第4步:选中“创建新虚拟磁盘”单选按钮,而不是其他选项,再次单击“下一步”按钮,如图6-9所示。

6.5 添加硬盘设备 - 图4

图6-9 选择“创建新虚拟磁盘”选项

第5步:将“最大磁盘大小”设置为默认的20GB。这个数值是限制这台虚拟机所使用的最大硬盘空间,而不是立即将其填满,因此默认20GB就很合适了。单击“下一步”按钮,如图6-10所示。

6.5 添加硬盘设备 - 图5

图6-10 设置硬盘的最大使用空间

第6步:设置磁盘文件的文件名和保存位置(这里采用默认设置即可,无需修改),直接单击“完成”按钮,如图6-11所示。

6.5 添加硬盘设备 - 图6

图6-11 设置磁盘文件的文件名和保存位置

第7步:将新硬盘添加好后就可以看到设备信息了。这里不需要做任何修改,直接单击“确认”按钮后就可以开启虚拟机了,如图6-12所示。

6.5 添加硬盘设备 - 图7

图6-12 查看虚拟机硬件设置信息

在虚拟机中模拟添加了硬盘设备后就应该能看到抽象成的硬盘设备文件了。按照前文讲解的udev服务命名规则,第二个被识别的SCSI设备应该会被保存为/dev/sdb,这个就是硬盘设备文件了。但在开始使用该硬盘之前还需要进行分区操作,例如从中取出一个2GB的分区设备以供后面的操作使用。

1. fdisk命令

在Linux系统中,管理硬盘设备最常用的方法就当属fdisk命令了。fdisk命令用于管理磁盘分区,格式为“fdisk [磁盘名称]”,它提供了集添加、删除、转换分区等功能于一身的“一站式分区服务”。不过与前面讲解的直接写到命令后面的参数不同,这条命令的参数(见表6-5)是交互式的,因此在管理硬盘设备时特别方便,可以根据需求动态调整。

表6-5 fdisk命令中的参数以及作用

参数作用
m查看全部可用的参数
n添加新的分区
d删除某个分区信息
l列出所有可用的分区类型
t改变某个分区的类型
p查看分区表信息
w保存并退出
q不保存直接退出

第1步:我们首先使用fdisk命令来尝试管理/dev/sdb硬盘设备。在看到提示信息后输入参数p来查看硬盘设备内已有的分区信息,其中包括了硬盘的容量大小、扇区个数等信息:

  1. [root@linuxprobe ~]# fdisk /dev/sdb
  2. Welcome to fdisk (util-linux 2.23.2).
  3. Changes will remain in memory only, until you decide to write them.
  4. Be careful before using the write command.
  5. Device does not contain a recognized partition table
  6. Building a new DOS disklabel with disk identifier 0x47d24a34.
  7. Command (m for help): p
  8. Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
  9. Units = sectors of 1 * 512 = 512 bytes
  10. Sector size (logical/physical): 512 bytes / 512 bytes
  11. I/O size (minimum/optimal): 512 bytes / 512 bytes
  12. Disk label type: dos
  13. Disk identifier: 0x47d24a34
  14. Device Boot Start End Blocks Id System

第2步:输入参数n尝试添加新的分区。系统会要求您是选择继续输入参数p来创建主分区,还是输入参数e来创建扩展分区。这里输入参数p来创建一个主分区:

  1. Command (m for help): n
  2. Partition type:
  3. p primary (0 primary, 0 extended, 4 free)
  4. e extended
  5. Select (default p): p

第3步:在确认创建一个主分区后,系统要求您先输入主分区的编号。我们在前文得知,主分区的编号范围是1~4,因此这里输入默认的1就可以了。接下来系统会提示定义起始的扇区位置,这不需要改动,我们敲击回车键保留默认设置即可,系统会自动计算出最靠前的空闲扇区的位置。最后,系统会要求定义分区的结束扇区位置,这其实就是要去定义整个分区的大小是多少。我们不用去计算扇区的个数,只需要输入+2G即可创建出一个容量为2GB的硬盘分区。

  1. Partition number (1-4, default 1): 1
  2. First sector (2048-41943039, default 2048):此处敲击回车
  3. Using default value 2048
  4. Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +2G
  5. Partition 1 of type Linux and of size 2 GiB is set

第4步:再次使用参数p来查看硬盘设备中的分区信息。果然就能看到一个名称为/dev/sdb1、起始扇区位置为2048、结束扇区位置为4196351的主分区了。这时候千万不要直接关闭窗口,而应该敲击参数w后回车,这样分区信息才是真正的写入成功啦。

  1. Command (m for help): p
  2. Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
  3. Units = sectors of 1 * 512 = 512 bytes
  4. Sector size (logical/physical): 512 bytes / 512 bytes
  5. I/O size (minimum/optimal): 512 bytes / 512 bytes
  6. Disk label type: dos
  7. Disk identifier: 0x47d24a34
  8. Device Boot Start End Blocks Id System
  9. /dev/sdb1 2048 4196351 2097152 83 Linux
  10. Command (m for help): w
  11. The partition table has been altered!
  12. Calling ioctl() to re-read partition table.
  13. Syncing disks.

第5步:在上述步骤执行完毕之后,Linux系统会自动把这个硬盘主分区抽象成/dev/sdb1设备文件。我们可以使用file命令查看该文件的属性,但是刘遄老师在讲课和工作中发现,有些时候系统并没有自动把分区信息同步给Linux内核,而且这种情况似乎还比较常见(但不能算作是严重的bug)。我们可以输入partprobe命令手动将分区信息同步到内核,而且一般推荐连续两次执行该命令,效果会更好。如果使用这个命令都无法解决问题,那么就重启计算机吧,这个杀手锏百试百灵,一定会有用的。

  1. [root@linuxprobe ]# file /dev/sdb1
  2. /dev/sdb1: cannot open (No such file or directory)
  3. [root@linuxprobe ]# partprobe
  4. [root@linuxprobe ]# partprobe
  5. [root@linuxprobe ]# file /dev/sdb1
  6. /dev/sdb1: block special

如果硬件存储设备没有进行格式化,则Linux系统无法得知怎么在其上写入数据。因此,在对存储设备进行分区后还需要进行格式化操作。在Linux系统中用于格式化操作的命令是mkfs。这条命令很有意思,因为在Shell终端中输入mkfs名后再敲击两下用于补齐命令的Tab键,会有如下所示的效果:

  1. [root@linuxprobe ~]# mkfs
  2. mkfs mkfs.cramfs mkfs.ext3 mkfs.fat mkfs.msdos mkfs.xfs
  3. mkfs.btrfs mkfs.ext2 mkfs.ext4 mkfs.minix mkfs.vfat

对!这个mkfs命令很贴心地把常用的文件系统名称用后缀的方式保存成了多个命令文件,用起来也非常简单—mkfs.文件类型名称。例如要格式分区为XFS的文件系统,则命令应为mkfs.xfs /dev/sdb1。

  1. [root@linuxprobe ~]# mkfs.xfs /dev/sdb1
  2. meta-data=/dev/sdb1 isize=256 agcount=4, agsize=131072 blks
  3. = sectsz=512 attr=2, projid32bit=1
  4. = crc=0
  5. data = bsize=4096 blocks=524288, imaxpct=25
  6. = sunit=0 swidth=0 blks
  7. naming =version 2 bsize=4096 ascii-ci=0 ftype=0
  8. log =internal log bsize=4096 blocks=2560, version=2
  9. = sectsz=512 sunit=0 blks, lazy-count=1
  10. realtime =none extsz=4096 blocks=0, rtextents=0

终于完成了存储设备的分区和格式化操作,接下来就是要来挂载并使用存储设备了。与之相关的步骤也非常简单:首先是创建一个用于挂载设备的挂载点目录;然后使用mount命令将存储设备与挂载点进行关联;最后使用df -h命令来查看挂载状态和硬盘使用量信息。

  1. [root@linuxprobe ~]# mkdir /newFS
  2. [root@linuxprobe ~]# mount /dev/sdb1 /newFS/
  3. [root@linuxprobe ~]# df -h
  4. Filesystem Size Used Avail Use% Mounted on
  5. /dev/mapper/rhel-root 18G 3.5G 15G 20% /
  6. devtmpfs 905M 0 905M 0% /dev
  7. tmpfs 914M 140K 914M 1% /dev/shm
  8. tmpfs 914M 8.8M 905M 1% /run
  9. tmpfs 914M 0 914M 0% /sys/fs/cgroup
  10. /dev/sr0 3.5G 3.5G 0 100% /media/cdrom
  11. /dev/sda1 497M 119M 379M 24% /boot
  12. /dev/sdb1 2.0G 33M 2.0G 2% /newFS

2. du命令

既然存储设备已经顺利挂载,接下来就可以尝试通过挂载点目录向存储设备中写入文件了。在写入文件之前,先介绍一个用于查看文件数据占用量的du命令,其格式为“du [选项] [文件]”。简单来说,该命令就是用来查看一个或多个文件占用了多大的硬盘空间。我们还可以使用du -sh /*命令来查看在Linux系统根目录下所有一级目录分别占用的空间大小。下面,我们先从某些目录中复制过来一批文件,然后查看这些文件总共占用了多大的容量:

  1. [root@linuxprobe ~]# cp -rf /etc/* /newFS/
  2. [root@linuxprobe ~]# ls /newFS/
  3. abrt hosts pulse
  4. adjtime hosts.allow purple
  5. aliases hosts.deny qemu-ga
  6. aliases.db hp qemu-kvm
  7. alsa idmapd.conf radvd.conf
  8. alternatives init.d rc0.d
  9. anacrontab inittab rc1.d
  10. ………………省略部分输入信息………………
  11. [root@linuxprobe ~]# du -sh /newFS/
  12. 33M /newFS/

细心的读者一定还记得,前面在讲解mount命令时提到,使用mount命令挂载的设备文件会在系统下一次重启的时候失效。如果想让这个设备文件的挂载永久有效,则需要把挂载的信息写入到配置文件中:

  1. [root@linuxprobe ~]# vim /etc/fstab
  2. #
  3. # /etc/fstab
  4. # Created by anaconda on Wed May 4 19:26:23 2017
  5. #
  6. # Accessible filesystems, by reference, are maintained under '/dev/disk'
  7. # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
  8. #
  9. /dev/mapper/rhel-root / xfs defaults 1 1
  10. UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b /boot xfs defaults 1 2
  11. /dev/mapper/rhel-swap swap swap defaults 0 0
  12. /dev/cdrom /media/cdrom iso9660 defaults 0 0
  13. /dev/sdb1 /newFS xfs defaults 0 0