我们先来理清一下添加硬盘设备的操作思路:首先需要在虚拟机(VMWare)中模拟添加入一块新的硬盘存储设备,然后再进行分区、格式化、挂载等操作,最后通过检查系统的挂载状态并真实地使用硬盘来验证硬盘设备是否成功添加。
鉴于我们不需要为了做这个实验而特意买一块真实的硬盘,而是通过虚拟机软件进行硬件模拟,因此这也体现出了使用虚拟机软件的好处。具体的操作步骤如下。
首先把虚拟机系统关机,稍等几分钟会自动返回到虚拟机管理主界面,然后单击编辑虚拟机设置
选项,在弹出的界面中单击添加
按钮,新增一块硬件设备,如下图所示:
选择想要添加的硬件类型为硬盘
,然后单击`下一步按钮就可以了,这确实没有什么需要进一步解释的,如下图所示:
这里一直下一步即可,最后会添加一个硬盘2
,在启动虚拟机。
在虚拟机中模拟添加了硬盘设备后就应该能看到
抽象成的硬盘设备文件
了。按照udev 服务命名规则
,第二个被识别的SCSI 设备
应该会被保存为/dev/sdb
,这个就是硬盘设备文件了。但在开始使用该硬盘之前还需要进行分区操作,例如从中取出一个2GB
的分区设备以供后面的操作使用。
fdisk 命令
在Linux 系统中,管理硬盘设备最常用的方法就当属fdisk 命令
了。fdisk 命令
用于管理磁盘分区,格式为fdisk [磁盘名称]
,它提供了集添加、删除、转换分区等功能于一身的一站式分区服务
。不过与前面讲解的直接写到命令后面的参数不同,这条命令的参数(见表6-5)是交互式的,因此在管理硬盘设备时特别方便,可以根据需求动态调整。
参数 | 作用 |
---|---|
m | 查看全部可用的参数 |
n | 添加新的分区 |
d | 删除某个分区信息 |
l | 列出所有可用的分区类型 |
t | 改变某个分区的类型 |
p | 查看分区信息 |
w | 保存并退出 |
q | 不保存直接退出 |
我们首先使用fdisk 命令
来尝试管理/dev/sdb
硬盘设备。在看到提示信息后输入参数p
来查看硬盘设备内已有的分区信息,其中包括了硬盘的容量大小、扇区个数等信息:
[root@lynchj ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x47d24a34.
Command (m for help): p
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x47d24a34
Device Boot Start End Blocks Id System
输入参数n
尝试添加新的分区。系统会要求您是选择继续输入参数p
来创建主分区,还是输入参数e
来创建扩展分区。这里输入参数p
来创建一个主分区:
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
在确认创建一个主分区后,系统要求您先输入主分区的编号。我们在前文得知,主分区的编号范围是1~4,
因此这里输入默认的1 就可以了。接下来系统会提示定义起始的扇区位置,这不需要改动,我们敲击回车键保留默认设置即可,系统会自动计算出最靠前的空闲扇区的位置。最后,系统会要求定义分区的结束扇区位置,这其实就是要去定义整个分区的大小
是多少。我们不用去计算扇区的个数,只需要输入+2G
即可创建出一个容量为2GB 的硬盘分区。
Partition number (1-4, default 1): 1
First sector (2048-41943039, default 2048): // 此处敲回车即可
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +2G
Partition 1 of type Linux and of size 2 GiB is set
再次使用参数p
来查看硬盘设备中的分区信息。果然就能看到一个名称为/dev/sdb1
、起始扇区位置为2048、结束扇区位置为4196351 的主分区了。这时候千万不要直接关闭窗口,而应该敲击参数w
后回车,这样分区信息才是真正的写入成功啦。
Command (m for help): p
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x47d24a34
Device Boot Start End Blocks Id System
/dev/sdb1 2048 4196351 2097152 83 Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
在上述步骤执行完毕之后,Linux 系统会自动把这个硬盘主分区抽象成/dev/sdb1
设备文件。我们可以使用file 命令
查看该文件的属性,但有些时候系统并没有自动把分区信息同步给Linux 内核,而且这种情况似乎还比较常见(但不能算作是严重的bug)。我们可以输入partprobe 命令
手动将分区信息同步到内核,而且一般推荐连续两次
执行该命令,效果会更好。如果使用这个命令都无法解决问题,那么就重启计算机吧,这个杀手锏百试百灵,一定会有用的。
[root@lynchj ]# file /dev/sdb1
/dev/sdb1: cannot open (No such file or directory)
[root@lynchj ]# partprobe
[root@lynchj ]# partprobe
[root@lynchj ]# file /dev/sdb1
/dev/sdb1: block special
mkfs和mkfs.* 命令
如果硬件存储设备没有进行格式化,则Linux 系统无法得知怎么在其上写入数据。因此,在对存储设备进行分区后还需要进行格式化操作。在Linux 系统中用于格式化操作的命令是mkfs
。这条命令很有意思,因为在Shell 终端中输入mkfs
名后再敲击两下
用于补齐命令的Tab键
,会有如下所示的效果:
[root@lynchj ~]# mkfs
mkfs mkfs.cramfs mkfs.ext3 mkfs.fat mkfs.msdos mkfs.xfs
mkfs.btrfs mkfs.ext2 mkfs.ext4 mkfs.minix mkfs.vfat
对!这个mkfs 命令
很贴心地把常用的文件系统名称用后缀的方式保存成了多个命令文件,用起来也非常简单—mkfs.
文件类型名称。例如要格式分区为XFS 的文件系统,则命令应为mkfs.xfs /dev/sdb1
。
[root@lynchj ~]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1 isize=256 agcount=4, agsize=131072 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0
data = bsize=4096 blocks=524288, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
终于完成了存储设备的分区和格式化操作,接下来就是要来挂载并使用存储设备了。与之相关的步骤也非常简单:首先是创建一个用于挂载设备的挂载点目录;然后使用mount 命令
将存储设备与挂载点进行关联;最后使用df -h 命令
来查看挂载状态和硬盘使用量信息。
[root@lynchj ~]# mkdir /newFS
[root@lynchj ~]# mount /dev/sdb1 /newFS/
[root@lynchj ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 18G 3.5G 15G 20% /
devtmpfs 905M 0 905M 0% /dev
tmpfs 914M 140K 914M 1% /dev/shm
tmpfs 914M 8.8M 905M 1% /run
tmpfs 914M 0 914M 0% /sys/fs/cgroup
/dev/sr0 3.5G 3.5G 0 100% /media/cdrom
/dev/sda1 497M 119M 379M 24% /boot
/dev/sdb1 2.0G 33M 2.0G 2% /newFS
记得设置开机自动挂载
如果您需要在云服务器系统启动时自动挂载磁盘,不能采用在 /etc/fstab
直接指定 /dev/sdb1
的方法,因为云中设备的顺序编码在关闭或者开启云服务器过程中可能发生改变,例如 /dev/sdb1
可能会变成 /dev/sdb2
。推荐使用 UUID 来配置自动挂载数据盘。
磁盘的 UUID(universally unique identifier)是 Linux 系统为存储设备提供的唯一的标识字符串。
# 查看磁盘 UUID,还可以看到磁盘文件系统类型
$ blkid /dev/sdb1
/dev/vdb1: UUID="fed1d78d-18bd-49d7-88b4-55ff7196898e" TYPE="xfs"
然后在文件 /etc/fstab
的末尾追加如下一行:
$ vim /etc/fstab
UUID=fed1d78d-18bd-49d7-88b4-55ff7196898e /newFS xfs defaults 1 2
以下针对 fstab
文件中每一列的说明:
- 第一列:分区名(设备ID);如果磁盘是 SCSI/STAT 接口,且有多个磁盘,则每个磁盘被标记为 /dev/sda、/dev/sdb、/dev/sdc 等以此类推;而每个磁盘的分区被标记为 /dev/hda1、/dev/hda2 等。除了使用设备名,还可以使用设备的 UUID 或设备的卷标签(Lable)。例如,你可以在这个字段写成
LABAL=root
或UUID=fed1d78d-18bd-49d7-88b4-55ff7196898e
,这将使系统更具伸缩性。例如,如果你的系统添加或移除了一个 SCSI 硬盘,这有可能以改变系统的设备名,但它不会修改的卷标签和 UUID。 - 第二列:挂载点;挂载点必须为当前已经存在的目录。对于交换分区(swap),这个字段定义为 swap,如果在载入点的路径中包含空格符,可以用
/040
来替代空格符。 - 第三列:文件系统类型;Linux 系统支持大量的文件类型,常见的有:ext2、ext3、ext4、xfs(CentOS7)、iso9660(光盘)等,此字段须与分区格式化时使用的类型相同。也可以使用 auto 这一特殊的语法,使系统自动侦测目标分区的分区类型。auto 通常用于可移动设备的挂载。如果想了解你的系统目前支持哪些文件系统,可以查看 /proc/filesystems 的内容。可以通过命令
blkid /dev/sdb1
查看 UUID 和文件系统类型。 - 第四列:挂载参数;指定加载该设备的文件系统是需要使用的特定参数选项,多个参数是由逗号分隔开来。常见参数如下:
- auto:系统自动挂载,fstab默认就是这个选项。
- defaults:最常见参数,可以满足需要大多数文件系统使用。
- noauto:开机不自动挂载。
- nouser:只有超级用户可以挂载。
- ro:按只读权限挂载。
- rw:按可读可写权限挂载。
- user:任何用户都可以挂载。
- 请注意光驱和软驱只有在装有介质时才可以进行挂载,因此它是 noauto
- 第五列:dump备份设置;当其值设置为1时,将允许 dump 备份程序备份;设置为0时,忽略备份操作;
- 第六列:开机磁盘检查顺序;数字越小越优先检查,如果两个分区的数字相同,则同时检查。当其值为0时,永远不检查。根
/
分区永远都为1。其它分区从2开始。
du 命令
既然存储设备已经顺利挂载,接下来就可以尝试通过挂载点目录向存储设备中写入文件了。在写入文件之前,先介绍一个用于查看文件数据占用量的du 命令
,其格式为du [选项] [文件]
。简单来说,该命令就是用来查看一个或多个文件占用了多大的硬盘空间。我们还可以使用du -sh /*
命令来查看在Linux 系统根目录下所有一级目录分别占用的空间大小。下面,我们先从某些目录中复制过来一批文件,然后查看这些文件总共占用了多大的容量:
[root@lynchj ~]# cp -rf /etc/* /newFS/
[root@lynchj ~]# ls /newFS/
abrt hosts pulse
adjtime hosts.allow purple
aliases hosts.deny qemu-ga
aliases.db hp qemu-kvm
alsa idmapd.conf radvd.conf
alternatives init.d rc0.d
anacrontab inittab rc1.d
………………省略部分输入信息………………
[root@lynchj ~]# du -sh /newFS/
33M /newFS/
前面有说到mount 命令
时提到,使用mount 命令
挂载的设备文件会在系统下一次重启的时候失效。如果想让这个设备文件的挂载永久有效,则需要把挂载的信息写入到配置文件中:
[root@lynchj ~]# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Wed May 4 19:26:23 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rhel-root / xfs defaults 1 1
UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b /boot xfs defaults 1 2
/dev/mapper /rhel-swap swap swap defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
/dev/sdb1 /newFS xfs defaults 0 0
文章评论