06 存储结构与管理硬盘

一切从 "/" 开始

Linux 系统中的文件存储结构

img

Linux 系统中常见的目录名称

目录名称 应放置文件的内容
/boot 开机所需文件—内核、开机菜单以及所需配置文件等
/dev 以文件形式存放任何设备与接口
/etc 配置文件
/home 用户主目录
/bin 存放单用户模式下还可以操作的命令
/lib 开机时用到的函数库,以及 /bin/sbin 下面的命令要调用的函数
/sbin 开机过程中需要的命令
/media 用于挂载设备文件的目录
/opt 放置第三方的软件
/root 系统管理员的家目录
/srv 一些网络服务的数据文件目录
/tmp 任何人均可使用的 "共享" 临时目录
/proc 虚拟文件系统,例如系统内核、进程、外部设备及网络状态等
/usr/local 用户自行安装的软件
/usr/sbin Linux 系统开机时不会使用到的软件/命令/脚本
/usr/share 帮助与说明文件,也可放置共享文件
/var 主要存放经常变化的文件,如日志
/lost+found 当文件系统发生错误时,将一些丢失的文件片段存放在这里

路径

路径:如何定位到某个文件,分为绝对路径与相对路径。

物理设备的命名规则

磁盘设备

应包括磁盘驱动器、适配器及盘片,它们既可以作为输入设备,也可作为输出设备或称载体。控制软盘读和写,即输入或输出是由磁盘驱动器及其适配器来完成的,从功能上来说,一台磁盘设备与一台录放机的作用是相同的,一盘录音带可反复地录音,那么软盘片或硬盘片,或称信息载体,也可以反复地被改写。

常见的硬件设备

硬件设备 文件名称
IDE 设备 /dev/hd[a-d]
SCSI/SATA/U 盘 /dev/sd[a-z]
virtio 设备 /dev/vd[a-z]
软驱 /dev/fd[0-1]
打印机 /dev/lp[0-15]
光驱 /dev/cdrom
鼠标 /dev/mouse
磁带机 /dev/st0/dev/ht0

设备文件名称

img

扇区

img

硬盘分区的规划

img

注意

所谓扩展分区,严格地讲它不是一个实际意义的分区,而仅仅是一个指向其他分区的指针,这种指针结构将形成一个单向链表。因此扩展分区自身不能存储数据,用户需要在其指向的对应分区(称之为逻辑分区)上进行操作。

文件系统与数据资料

文件系统的作用是合理规划硬盘,以保证用户正常的使用需求。

常见的文件系统

Info

  • 在拿到一块新的硬盘存储设备后,先需要分区,然后再格式化文件系统,最后才能挂载并正常使用。硬盘的分区操作取决于您的需求和硬盘大小;也可以选择不进行分区,但是必须对硬盘进行格式化处理。
  • 就像拿到了一张未裁切的完整纸张那样,首先要进行裁切以方便使用(分区),接下来在裁切后的纸张上画格以便能书写工整(格式化),最后是正式的使用(挂载)。

数据资料

存储文件内容的 block 块

img

挂载硬件设备

mount

[root@linuxprobe ~]# mount /dev/sdb2 /backup # 把设备 /dev/sdb2 挂载到 /backup 目录

blkid

[root@linuxprobe ~]# blkid
/dev/sda1: UUID="73159c7d-b179-4ef9-a83f-3f6f6ce390ed" TYPE="xfs" PARTUUID="5fef684b-01"
/dev/sda2: UUID="oBY3nX-axGY-bavU-eCJf-1l8K-dpPW-Lgfm2K" TYPE="LVM2_member" PARTUUID="5fef684b-02"
/dev/sr0: UUID="2022-06-29-06-15-46-00" LABEL="RHEL-8-2-0-BaseOS-x86_64" TYPE="iso9660" PTUUID="72cfe76b" PTTYPE="dos"
/dev/mapper/rhel-root: UUID="34630964-7974-4d0a-a1cb-9686da83698c" TYPE="xfs"
/dev/mapper/rhel-swap: UUID="77b404e5-2bbb-45d4-8885-60a4d9318b17" TYPE="swap"
[root@linuxprobe ~]#
[root@linuxprobe ~]# mount UUID=oBY3nX-axGY-bavU-eCJf-1l8K-dpPW-Lgfm2K /backup # 有了设备的 UUID 值之后,就可以用它挂载网络设备

开机自动挂载

[root@linuxprobe ~]# vim /etc/fstab
[root@linuxprobe ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sun Jun  4 03:05:37 2023
#
# 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.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/rhel-root   /                       xfs     defaults        0 0
UUID=73159c7d-b179-4ef9-a83f-3f6f6ce390ed /boot                   xfs     defaults        0 0
/dev/mapper/rhel-swap   swap                    swap    defaults        0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
/dev/sdb2 /backup ext4 defaults 0 0
[root@linuxprobe ~]#
[root@linuxprobe ~]# vim /etc/fstab # 把光盘设备挂载到 /media/cdrom 目录中
[root@linuxprobe ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sun Jun  4 03:05:37 2023
#
# 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.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/rhel-root   /                       xfs     defaults        0 0
UUID=73159c7d-b179-4ef9-a83f-3f6f6ce390ed /boot                   xfs     defaults        0 0
/dev/mapper/rhel-swap   swap                    swap    defaults        0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
/dev/sdb2 /backup ext4 defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
[root@linuxprobe ~]# mount -a # 写入到 /etc/fstab 文件中的设备信息并不会立即生效,需要使用 mount -a 参数进行自动挂载
[root@linuxprobe ~]#
[root@linuxprobe ~]# vim /etc/fstab # 对于网络存储设备,在 fstab 文件挂载信息中加上 `_netdev` 参数。加上后系统会等联网成功后再尝试挂载这块网络存储设备,从而避免了开机时间过长或失败的情况
[root@linuxprobe ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sun Jun  4 03:05:37 2023
#
# 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.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/rhel-root   /                       xfs     defaults        0 0
UUID=73159c7d-b179-4ef9-a83f-3f6f6ce390ed /boot                   xfs     defaults        0 0
/dev/mapper/rhel-swap   swap                    swap    defaults        0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
/dev/sdb2 /backup ext4 defaults,_netdev 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
[root@linuxprobe ~]#

df

[linuxprobe@linuxprobe ~]$ df -h
Filesystem             Size  Used Avail Use% Mounted on
devtmpfs               952M     0  952M   0% /dev
tmpfs                  981M     0  981M   0% /dev/shm
tmpfs                  981M   19M  962M   2% /run
tmpfs                  981M     0  981M   0% /sys/fs/cgroup
/dev/mapper/rhel-root   17G  4.3G   13G  26% /
/dev/sda1             1014M  211M  804M  21% /boot
tmpfs                  196M  1.2M  195M   1% /run/user/42
tmpfs                  196M  4.6M  192M   3% /run/user/1000
/dev/sr0               7.9G  7.9G     0 100% /media/cdrom
tmpfs                  196M  4.6M  192M   3% /run/user/0
[linuxprobe@linuxprobe ~]$

umount

[root@linuxprobe ~]# cd /media/cdrom/
[root@linuxprobe cdrom]# umount /dev/cdrom # 当前就处于设备所挂载的目录,系统会提示该设备繁忙
umount: /media/cdrom: target is busy.
[root@linuxprobe  cdrom]# cd ~
[root@linuxprobe ~]# umount /dev/cdrom # 退出到其他目录后再尝试一次就行了
[root@linuxprobe ~]#

lsblk

[linuxprobe@linuxprobe ~]$ lsblk -a
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda             8:0    0   20G  0 disk
├─sda1          8:1    0    1G  0 part /boot
└─sda2          8:2    0   19G  0 part
  ├─rhel-root 253:0    0   17G  0 lvm  /
  └─rhel-swap 253:1    0    2G  0 lvm  [SWAP]
sr0            11:0    1  7.9G  0 rom  /media/cdrom
[linuxprobe@linuxprobe ~]$

添加硬盘设备

虚拟机中添加硬盘设备

选择硬盘设备类型

  • 选择虚拟硬盘的类型为 SATA,并单击 "下一步" 按钮,如图 3 所示。这样虚拟机中的设备名称过一会儿后应该为 /dev/sdb

img

设置硬盘的最大使用空间

  • 将 "最大磁盘大小" 设置为默认的 20GB。这个数值是限制这台虚拟机所使用的最大硬盘空间,而不是立即将其填满,因此默认 20GB 就很合适了。

img

img

[linuxprobe@linuxprobe ~]$ lsblk -a # 新添加的硬盘为 sdb
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda             8:0    0   20G  0 disk
├─sda1          8:1    0    1G  0 part /boot
└─sda2          8:2    0   19G  0 part
  ├─rhel-root 253:0    0   17G  0 lvm  /
  └─rhel-swap 253:1    0    2G  0 lvm  [SWAP]
sdb             8:16   0   20G  0 disk
sr0            11:0    1  7.9G  0 rom  /media/cdrom
[linuxprobe@linuxprobe ~]$

fdisk

[linuxprobe@linuxprobe ~]$ su - root
Password:
[root@linuxprobe ~]# fdisk /dev/sdb # 使用 fdisk 命令来尝试管理 /dev/sdb 硬盘设备

Welcome to fdisk (util-linux 2.32.1).
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.
Created a new DOS disklabel with disk identifier 0x67e306b2.

Command (m for help): m # 输入参数 m 查看全部可用的参数

Help:

  DOS (MBR)
   a   toggle a bootable flag
   b   edit nested BSD disklabel
   c   toggle the dos compatibility flag

  Generic
   d   delete a partition
   F   list free unpartitioned space
   l   list known partition types
   n   add a new partition
   p   print the partition table
   t   change a partition type
   v   verify the partition table
   i   print information about a partition

  Misc
   m   print this menu
   u   change display/entry units
   x   extra functionality (experts only)

  Script
   I   load disk layout from sfdisk script file
   O   dump disk layout to sfdisk script file

  Save & Exit
   w   write table to disk and exit
   q   quit without saving changes

  Create a new label
   g   create a new empty GPT partition table
   G   create a new empty SGI (IRIX) partition table
   o   create a new empty DOS partition table
   s   create a new empty Sun partition table

Command (m for help): p # 输入参数 p 来查看硬盘设备内已有的分区信息,其中包括了硬盘的容量大小、扇区个数等信息
Disk /dev/sdb: 20 GiB, 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
Disklabel type: dos
Disk identifier: 0x67e306b2

Command (m for help): n # 输入参数 n 尝试添加新的分区
Partition type
   p   primary (0 primary, 0 extended, 4 free) # 输入参数 p 来创建主分区
   e   extended (container for logical partitions) # 输入参数 e 来创建扩展分区
Select (default p): p
Partition number (1-4, default 1): 1 # 输入主分区的编号,主分区的编号范围是 1~4,因此这里输入默认的 1 就可以了
First sector (2048-41943039, default 2048): # 定义起始的扇区位置,这不需要改动,敲击回车键保留默认设置即可,系统会自动计算出最靠前的空闲扇区的位置。
Last sector, +sectors or +size{K,M,G,T,P} (2048-41943039, default 41943039): +2G # 定义分区的结束扇区位置,这其实就是要去定义整个分区的大小是多少。我们不用去计算扇区的个数,只需要输入 +2G 即可创建出一个容量为 2GB 的硬盘分区。

Created a new partition 1 of type 'Linux' and of size 2 GiB.

Command (m for help): p # 输入参数 p 来查看硬盘设备内已有的分区信息,其中包括了硬盘的容量大小、扇区个数等信息
Disk /dev/sdb: 20 GiB, 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
Disklabel type: dos
Disk identifier: 0x67e306b2

Device     Boot Start     End Sectors Size Id Type
/dev/sdb1        2048 4196351 4194304   2G 83 Linux # 新建的主分区

Command (m for help): w # 保存分区信息并退出
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

[root@linuxprobe ~]# fdisk /dev/sdb

Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): l # 使用 l 参数查看一下磁盘编码都有哪些 (82  Linux swap)

 0  Empty           24  NEC DOS         81  Minix / old Lin bf  Solaris
 1  FAT12           27  Hidden NTFS Win 82  Linux swap / So c1  DRDOS/sec (FAT-
 2  XENIX root      39  Plan 9          83  Linux           c4  DRDOS/sec (FAT-
 3  XENIX usr       3c  PartitionMagic  84  OS/2 hidden or  c6  DRDOS/sec (FAT-
 4  FAT16 <32M      40  Venix 80286     85  Linux extended  c7  Syrinx
 5  Extended        41  PPC PReP Boot   86  NTFS volume set da  Non-FS data
 6  FAT16           42  SFS             87  NTFS volume set db  CP/M / CTOS / .
 7  HPFS/NTFS/exFAT 4d  QNX4.x          88  Linux plaintext de  Dell Utility
 8  AIX             4e  QNX4.x 2nd part 8e  Linux LVM       df  BootIt
 9  AIX bootable    4f  QNX4.x 3rd part 93  Amoeba          e1  DOS access
 a  OS/2 Boot Manag 50  OnTrack DM      94  Amoeba BBT      e3  DOS R/O
 b  W95 FAT32       51  OnTrack DM6 Aux 9f  BSD/OS          e4  SpeedStor
 c  W95 FAT32 (LBA) 52  CP/M            a0  IBM Thinkpad hi ea  Rufus alignment
 e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a5  FreeBSD         eb  BeOS fs
 f  W95 Ext'd (LBA) 54  OnTrackDM6      a6  OpenBSD         ee  GPT
10  OPUS            55  EZ-Drive        a7  NeXTSTEP        ef  EFI (FAT-12/16/
11  Hidden FAT12    56  Golden Bow      a8  Darwin UFS      f0  Linux/PA-RISC b
12  Compaq diagnost 5c  Priam Edisk     a9  NetBSD          f1  SpeedStor
14  Hidden FAT16 <3 61  SpeedStor       ab  Darwin boot     f4  SpeedStor
16  Hidden FAT16    63  GNU HURD or Sys af  HFS / HFS+      f2  DOS secondary
17  Hidden HPFS/NTF 64  Novell Netware  b7  BSDI fs         fb  VMware VMFS
18  AST SmartSleep  65  Novell Netware  b8  BSDI swap       fc  VMware VMKCORE
1b  Hidden W95 FAT3 70  DiskSecure Mult bb  Boot Wizard hid fd  Linux raid auto
1c  Hidden W95 FAT3 75  PC/IX           bc  Acronis FAT32 L fe  LANstep
1e  Hidden W95 FAT1 80  Old Minix       be  Solaris boot    ff  BBT

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

[root@linuxprobe ~]#
[root@linuxprobe ~]# lsblk -a  # Linux 系统会自动把这个硬盘主分区抽象成 /dev/sdb1 设备文件
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda             8:0    0   20G  0 disk
├─sda1          8:1    0    1G  0 part /boot
└─sda2          8:2    0   19G  0 part
  ├─rhel-root 253:0    0   17G  0 lvm  /
  └─rhel-swap 253:1    0    2G  0 lvm  [SWAP]
sdb             8:16   0   20G  0 disk
└─sdb1          8:17   0    2G  0 part
sr0            11:0    1  7.9G  0 rom  /media/cdrom

partprobe

Info

  • 有些时候系统并没有自动把分区信息同步给 Linux 内核,而且这种情况似乎还比较常见(但不能算作严重的 bug)。
  • 可以输入 partprobe 命令手动将分区信息同步到内核,而且一般推荐连续两次执行该命令,效果会更好。
  • 如果使用这个命令都无法解决问题,那么就重启计算机吧,这个 "杀手锏" 百试百灵,一定会有用的。
[root@linuxprobe ~]# file /dev/sdb1 # 使用 file 命令查看该文件的属性
/dev/sdb1: cannot open `/dev/sdb1' (No such file or directory)
[root@linuxprobe ~]# partprobe
[root@linuxprobe ~]# partprobe
[root@linuxprobe ~]# file /dev/sdb1
/dev/sdb1: block special (8/17)
[root@linuxprobe ~]#

mkfs

对存储设备进行分区后还需要进行格式化操作。

[root@linuxprobe ~]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1              isize=512    agcount=4, agsize=131072 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1
data     =                       bsize=4096   blocks=524288, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
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
[root@linuxprobe ~]#

挂载并使用存储设备

完成了存储设备的分区和格式化操作,接下来就是要来挂载并使用存储设备了。

[root@linuxprobe ~]# mkdir /newFS # 创建挂载点目录
[root@linuxprobe ~]# mount /dev/sdb1 /newFS # 将存储设备与挂载点进行关联
[root@linuxprobe ~]# df -h # 查看挂载状态和硬盘使用量信息
Filesystem             Size  Used Avail Use% Mounted on
devtmpfs               952M     0  952M   0% /dev
tmpfs                  981M     0  981M   0% /dev/shm
tmpfs                  981M  9.5M  971M   1% /run
tmpfs                  981M     0  981M   0% /sys/fs/cgroup
/dev/mapper/rhel-root   17G  4.3G   13G  25% /
/dev/sr0               7.9G  7.9G     0 100% /media/cdrom
/dev/sda1             1014M  211M  804M  21% /boot
tmpfs                  196M  3.4M  193M   2% /run/user/1000
/dev/sdb1              2.0G   47M  2.0G   3% /newFS
[root@linuxprobe ~]#

du

[root@linuxprobe ~]# du -sh /*
20K     /backup.acl
0       /bin
171M    /boot
0       /dev
30M     /etc
9.3M    /home
0       /lib
0       /lib64
8.0G    /media
0       /mnt
0       /newFS
0       /opt
0       /proc
8.4M    /root
9.5M    /run
0       /sbin
0       /srv
0       /sys
52K     /tmp
3.8G    /usr
191M    /var
[root@linuxprobe ~]# cp -rf /etc/* /newFS
[root@linuxprobe ~]# du -sh /newFS/
30M     /newFS/
[root@linuxprobe ~]#
[root@linuxprobe ~]# vim /etc/fstab # 想让这个设备文件的挂载永久有效,则需要把挂载的信息写入 fstab 配置文件中
[root@linuxprobe ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sun Jun  4 03:05:37 2023
#
# 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.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/rhel-root   /                       xfs     defaults        0 0
UUID=73159c7d-b179-4ef9-a83f-3f6f6ce390ed /boot                   xfs     defaults        0 0
/dev/mapper/rhel-swap   swap                    swap    defaults        0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
/dev/sdb2 /backup ext4 defaults,_netdev 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
/dev/sdb1 /newFS xfs defaults 0 0
[root@linuxprobe ~]#

添加交换分区

交换 SWAP 分区

交换分区的创建过程

与前文讲到的挂载并使用存储设备的过程非常相似。在对 /dev/sdb 存储设备进行分区操作前,有必要先说一下交换分区的划分建议:在生产环境中,交换分区的大小一般为真实物理内存的 1.5 ~ 2 倍

[root@linuxprobe ~]# fdisk /dev/sdb # 使用 fdisk 命令来尝试管理 /dev/sdb 硬盘设备

Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): n # 添加新分区
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): p # 设置为主分区
Partition number (2-4, default 2): # 设置分区编号,默认
First sector (4196352-41943039, default 4196352): # 扇区起始位置,默认
Last sector, +sectors or +size{K,M,G,T,P} (4196352-41943039, default 41943039): +5G # 容量为 5GB

Created a new partition 2 of type 'Linux' and of size 5 GiB.

Command (m for help): l # 查看磁盘编码 (82  Linux swap)

 0  Empty           24  NEC DOS         81  Minix / old Lin bf  Solaris
 1  FAT12           27  Hidden NTFS Win 82  Linux swap / So c1  DRDOS/sec (FAT-
 2  XENIX root      39  Plan 9          83  Linux           c4  DRDOS/sec (FAT-
 3  XENIX usr       3c  PartitionMagic  84  OS/2 hidden or  c6  DRDOS/sec (FAT-
 4  FAT16 <32M      40  Venix 80286     85  Linux extended  c7  Syrinx
 5  Extended        41  PPC PReP Boot   86  NTFS volume set da  Non-FS data
 6  FAT16           42  SFS             87  NTFS volume set db  CP/M / CTOS / .
 7  HPFS/NTFS/exFAT 4d  QNX4.x          88  Linux plaintext de  Dell Utility
 8  AIX             4e  QNX4.x 2nd part 8e  Linux LVM       df  BootIt
 9  AIX bootable    4f  QNX4.x 3rd part 93  Amoeba          e1  DOS access
 a  OS/2 Boot Manag 50  OnTrack DM      94  Amoeba BBT      e3  DOS R/O
 b  W95 FAT32       51  OnTrack DM6 Aux 9f  BSD/OS          e4  SpeedStor
 c  W95 FAT32 (LBA) 52  CP/M            a0  IBM Thinkpad hi ea  Rufus alignment
 e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a5  FreeBSD         eb  BeOS fs
 f  W95 Ext'd (LBA) 54  OnTrackDM6      a6  OpenBSD         ee  GPT
10  OPUS            55  EZ-Drive        a7  NeXTSTEP        ef  EFI (FAT-12/16/
11  Hidden FAT12    56  Golden Bow      a8  Darwin UFS      f0  Linux/PA-RISC b
12  Compaq diagnost 5c  Priam Edisk     a9  NetBSD          f1  SpeedStor
14  Hidden FAT16 <3 61  SpeedStor       ab  Darwin boot     f4  SpeedStor
16  Hidden FAT16    63  GNU HURD or Sys af  HFS / HFS+      f2  DOS secondary
17  Hidden HPFS/NTF 64  Novell Netware  b7  BSDI fs         fb  VMware VMFS
18  AST SmartSleep  65  Novell Netware  b8  BSDI swap       fc  VMware VMKCORE
1b  Hidden W95 FAT3 70  DiskSecure Mult bb  Boot Wizard hid fd  Linux raid auto
1c  Hidden W95 FAT3 75  PC/IX           bc  Acronis FAT32 L fe  LANstep
1e  Hidden W95 FAT1 80  Old Minix       be  Solaris boot    ff  BBT


Command (m for help): t # 改变分区类型
Partition number (1,2, default 2): 2 # 选择刚才创建的分区
Hex code (type L to list all codes): 82 # 设置为 swap 分区

Changed type of partition 'Linux' to 'Linux swap / Solaris'.

Command (m for help): p # 查看已有分区信息
Disk /dev/sdb: 20 GiB, 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
Disklabel type: dos
Disk identifier: 0x67e306b2

Device     Boot   Start      End  Sectors Size Id Type
/dev/sdb1          2048  4196351  4194304   2G 83 Linux
/dev/sdb2       4196352 14682111 10485760   5G 82 Linux swap / Solaris

Command (m for help): w # 保存分区信息并退出
The partition table has been altered.
Syncing disks.

[root@linuxprobe ~]#

mkswap

[root@linuxprobe ~]# mkswap /dev/sdb2
Setting up swapspace version 1, size = 5 GiB (5368705024 bytes)
no label, UUID=e4fe2da9-c060-495c-a55c-2c4978e8efa0

swapon

[root@linuxprobe ~]# swapon -s # 查看当前的 swap 空间
Filename                                Type            Size    Used    Priority
/dev/dm-1                               partition       2097148 1292    -2
[root@linuxprobe ~]# free -m # 使用 free -m 命令查看交换分区的大小变化
              total        used        free      shared  buff/cache   available
Mem:           1960        1026          69          12         863         738
Swap:          2047           1        2046
[root@linuxprobe ~]#
[root@linuxprobe ~]# swapon /dev/sdb2 # 使用 swapon 命令把准备好的 swap 硬盘设备正式挂载到系统中
[root@linuxprobe ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1960        1030          65          12         864         733
Swap:          7167           1        7166
[root@linuxprobe ~]# swapon -s
Filename                                Type            Size    Used    Priority
/dev/dm-1                               partition       2097148 1292    -2
/dev/sdb2                               partition       5242876 0       -3
[root@linuxprobe ~]# cat /proc/swaps
Filename                                Type            Size    Used    Priority
/dev/dm-1                               partition       2097148 1292    -2
/dev/sdb2                               partition       5242876 0       -3

为了能够让新的交换分区设备在重启后依然生效,需要按照下面的格式将相关信息写入 fstab 配置文件中。

[root@linuxprobe ~]# vim /etc/fstab
[root@linuxprobe ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sun Jun  4 03:05:37 2023
#
# 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.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/rhel-root   /                       xfs     defaults        0 0
UUID=73159c7d-b179-4ef9-a83f-3f6f6ce390ed /boot                   xfs     defaults        0 0
/dev/mapper/rhel-swap   swap                    swap    defaults        0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
/dev/sdb2 /backup ext4 defaults,_netdev 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
/dev/sdb1 /newFS xfs defaults 0 0
/dev/sdb2 swap swap defaults 0 0
[root@linuxprobe ~]#

磁盘容量配额

[root@linuxprobe ~]# vim /etc/fstab
[root@linuxprobe ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sun Jun  4 03:05:37 2023
#
# 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.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/rhel-root   /                       xfs     defaults        0 0
UUID=73159c7d-b179-4ef9-a83f-3f6f6ce390ed /boot                   xfs     defaults,uquota        0 0
/dev/mapper/rhel-swap   swap                    swap    defaults        0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
/dev/sdb2 /backup ext4 defaults,_netdev 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
/dev/sdb1 /newFS xfs defaults 0 0
/dev/sdb2 swap swap defaults 0 0
[root@linuxprobe ~]#

在重启系统后使用 mount 命令查看,即可发现 /boot 目录已经支持 quota 磁盘配额技术了:

[linuxprobe@linuxprobe ~]$ mount | grep boot
/dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,usrquota)
[linuxprobe@linuxprobe ~]$

xfs_quota

[root@linuxprobe ~]# useradd jaime # 创建一个用于检查 quota 磁盘容量配额效果的用户 jaime
[root@linuxprobe ~]# chmod -R o+w /boot # 针对 /boot 目录增加其他人的写权限,保证用户能够正常写入数据
[root@linuxprobe ~]# xfs_quota -x -c 'limit bsoft=3m bhard=6m isoft=3 ihard=6 jaime' /boot # 设置用户 jaime 对 /boot 目录的 quota 磁盘容量配额: 硬盘使用量的软限制和硬限制分别为 3MB 和 6MB;创建文件数量的软限制和硬限制分别为 3 个和 6 个。
[root@linuxprobe ~]# xfs_quota -x -c report /boot
User quota on /boot (/dev/sda1)
                               Blocks
User ID          Used       Soft       Hard    Warn/Grace
---------- --------------------------------------------------
root           174528          0          0     00 [--------]
jaime               0       3072       6144     00 [--------]

[root@linuxprobe ~]#

当配置好上述各种软硬限制后,尝试切换到一个普通用户,然后分别尝试创建一个体积为 5MB 和 8MB 的文件。可以发现,在创建 8MB 的文件时受到了系统限制:

[root@linuxprobe ~]# su - jaime
[jaime@linuxprobe ~]$ cd /boot
[jaime@linuxprobe boot]$ dd if=/dev/zero of=/boot/jaime bs=5M count=1 # 5MB 文件创建成功
1+0 records in
1+0 records out
5242880 bytes (5.2 MB, 5.0 MiB) copied, 0.0324882 s, 161 MB/s
[jaime@linuxprobe boot]$ dd if=/dev/zero of=/boot/jaime bs=8M count=1 # 8MB 文件创建失败
dd: error writing '/boot/jaime': Disk quota exceeded
1+0 records in
0+0 records out
4194304 bytes (4.2 MB, 4.0 MiB) copied, 0.0271308 s, 155 MB/s

edquota

[jaime@linuxprobe boot]$ logout
[root@linuxprobe ~]# edquota -u jaime # 针对 jaime 用户进行设置(硬盘使用量的硬限额从 6MB/6144 提升到 8MB/8192)
Disk quotas for user jaime (uid 1001):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/sda1                      4096       3072       8192          1        3        6
[root@linuxprobe ~]# su - jaime
[jaime@linuxprobe ~]$ cd /boot/
[jaime@linuxprobe boot]$ dd if=/dev/zero of=/boot/jaime bs=8M count=1
1+0 records in
1+0 records out
8388608 bytes (8.4 MB, 8.0 MiB) copied, 0.055455 s, 151 MB/s
[jaime@linuxprobe boot]$

VDO 虚拟数据优化

VDO 针对各种类型文件的压缩效果

文件名 描述 类型 原始大小(KB) 实际占用空间(KB)
dickens 狄更斯文集 英文原文 9953 9948
mozilla Mozilla 的 1.0 可执行文件 执行程序 50020 33228
mr 医用 resonanse 图像 图片 9736 9272
nci 结构化的化学数据库 数据库 32767 10168
ooffice Open Office.org 1.01 DLL 可执行程序 6008 5640
osdb 基准测试用的 MySQL 格式示例数据库 数据库 9849 9824
reymont 瓦迪斯瓦夫·雷蒙特的书 PDF 6471 6312
samba samba 源代码 src 源码 21100 11768
sao 星空数据 天文格式的 bin 文件 7081 7036
webster 辞海 HTML 40487 40144
xml XML 文件 HTML 5220 2180
x-ray 透视医学图片 医院数据 8275 8260

特殊情况

VDO 技术拓扑图

实验代码

  1. 把虚拟机关闭,添加一块容量为 20GB 的新 SATA 硬盘进来。

  2. 查看系统的磁盘使用情况。

    [root@linuxprobe ~]# lsblk -a # 查看系统的磁盘使用情况
    NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda             8:0    0   20G  0 disk
    ├─sda1          8:1    0    1G  0 part /boot
    └─sda2          8:2    0   19G  0 part
      ├─rhel-root 253:0    0   17G  0 lvm  /
      └─rhel-swap 253:1    0    2G  0 lvm  [SWAP]
    sdb             8:16   0   20G  0 disk
    ├─sdb1          8:17   0    2G  0 part
    └─sdb2          8:18   0    5G  0 part
    sdc             8:32   0   20G  0 disk
    sr0            11:0    1  7.9G  0 rom  /media/cdrom
    [root@linuxprobe ~]# ls -l /dev/sdc # 查看新添加的 SATA 硬盘
    brw-rw----. 1 root disk 8, 32 Jun 13 08:18 /dev/sdc
    
  3. RHEL/CentOS 8 系统中默认已经启用了 VDO 技术。如果系统没有安装 VDO,用 dnf install kmod-kvdo vdo 命令安装。

    [root@linuxprobe ~]# dnf install kmod-kvdo vdo # 安装 VDO
    Updating Subscription Management repositories.
    Unable to read consumer identity
    This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
    Last metadata expiration check: 1:48:09 ago on Tue 13 Jun 2023 06:31:19 AM CST.
    Package kmod-kvdo-6.2.2.117-65.el8.x86_64 is already installed.
    Package vdo-6.2.2.117-13.el8.x86_64 is already installed.
    Dependencies resolved.
    Nothing to do.
    Complete!
    
  4. 使用 vdo 命令 vdo create --name=storage --device=/dev/sdc --vdoLogicalSize=200G 来管理新添加进来的物理设备。依据红帽公司推荐的原则,20GB 硬盘将翻成 200GB 的逻辑存储。

    • 其中 name 参数代表新的设备卷的名称;
    • device 参数代表由哪块磁盘进行制作;
    • vdoLogicalSize 参数代表制作后的设备大小。
    [root@linuxprobe ~]# vdo create --name=storage --device=/dev/sdc --vdoLogicalSize=200G
    Creating VDO storage
          The VDO volume can address 16 GB in 8 data slabs, each 2 GB.
          It can grow to address at most 16 TB of physical storage in 8192 slabs.
          If a larger maximum size might be needed, use bigger slabs.
    Starting VDO storage
    Starting compression on VDO storage
    VDO instance 0 volume is ready at /dev/mapper/storage
    
  5. 查看新建卷的概述信息。在输出信息中包含了 VDO 卷创建的时间、主机名、版本、是否压缩 Compression 及是否删重 Deduplication 等关键信息。

    [root@linuxprobe ~]# vdo status --name=storage
    VDO status:
      Date: '2023-06-13 08:19:50+08:00'
      Node: linuxprobe.com
    Kernel module:
      Loaded: true
      Name: kvdo
      Version information:
        kvdo version: 6.2.2.117
    Configuration:
      File: /etc/vdoconf.yml
    ………………省略部分输出信息………………
            write amplification ratio: 0.0
            write policy: sync
    
  6. 格式化新建卷。

    [root@linuxprobe ~]# mkfs.xfs /dev/mapper/storage # 格式化新建卷
    meta-data=/dev/mapper/storage    isize=512    agcount=4, agsize=13107200 blks
             =                       sectsz=4096  attr=2, projid32bit=1
             =                       crc=1        finobt=1, sparse=1, rmapbt=0
             =                       reflink=1
    data     =                       bsize=4096   blocks=52428800, imaxpct=25
             =                       sunit=0      swidth=0 blks
    naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
    log      =internal log           bsize=4096   blocks=25600, version=2
             =                       sectsz=4096  sunit=1 blks, lazy-count=1
    realtime =none                   extsz=4096   blocks=0, rtextents=0
    
  7. 挂载前同步分区表,对设备进行一次刷新操作,避免刚才的配置没有生效。

    [root@linuxprobe ~]# udevadm settle
    
  8. 创建挂载点,挂载新建卷。

    [root@linuxprobe ~]# mkdir /storage
    [root@linuxprobe ~]# mount /dev/mapper/storage /storage
    
  9. 查看设备的实际使用情况。

    • human-readable 参数的作用是将存储容量自动进位,以人们更易读的方式输出
      • 比如,显示 20G 而不是 20971520K
    • 这里显示的 Size 是实际物理存储的空间大小(即 20.0GB 是硬盘的大小),查看逻辑存储空间使用 df -h 命令。
    [root@linuxprobe ~]# vdostats --human-readable
    Device                    Size      Used Available Use% Space saving%
    /dev/mapper/storage      20.0G      4.0G     16.0G  20%           99%
    [root@linuxprobe ~]# df -h # 查看逻辑存储空间
    Filesystem             Size  Used Avail Use% Mounted on
    devtmpfs               952M     0  952M   0% /dev
    tmpfs                  981M     0  981M   0% /dev/shm
    tmpfs                  981M  9.5M  971M   1% /run
    tmpfs                  981M     0  981M   0% /sys/fs/cgroup
    /dev/mapper/rhel-root   17G  4.3G   13G  25% /
    /dev/sr0               7.9G  7.9G     0 100% /media/cdrom
    /dev/sda1             1014M  219M  796M  22% /boot
    tmpfs                  196M  3.4M  193M   2% /run/user/1000
    /dev/mapper/storage    200G  1.5G  199G   1% /storage
    
  10. 复制文件,查看占用了多少容量,以及空间节省率 Space saving。

    [root@linuxprobe ~]# ls -lh /media/cdrom/images/install.img # 查看要复制的文件的信息
    -r--r--r--. 1 root root 532M Jun 29  2022 /media/cdrom/images/install.img
    [root@linuxprobe ~]# cp /media/cdrom/images/install.img /storage/ # 复制文件
    [root@linuxprobe ~]# ls -lh /storage/install.img
    -r--r--r--. 1 root root 532M Jun 13 08:27 /storage/install.img
    [root@linuxprobe ~]# vdostats --human-readable # 查看占用了多少容量,以及空间节省率(Space saving)
    Device                    Size      Used Available Use% Space saving%
    /dev/mapper/storage      20.0G      4.5G     15.5G  22%           15%
    
  11. 再次复制文件,查看占用了多少容量,以及空间节省率 Space saving。

    • 可以看到原先 532MB 的文件基本不占容量,空间节省率从 15% 提升到了 54%
    [root@linuxprobe ~]# cp /media/cdrom/images/install.img /storage/rhel.img
    [root@linuxprobe ~]# vdostats --human-readable
    Device                    Size      Used Available Use% Space saving%
    /dev/mapper/storage      20.0G      4.5G     15.5G  22%           54%
    
  12. 查看设备 UUID。

    [root@linuxprobe ~]# blkid /dev/mapper/storage
    /dev/mapper/storage: UUID="1f86fda9-e273-4894-acfe-08168f7d71f1" TYPE="xfs"
    
  13. 将设备设置成永久挂载生效,一直提供服务。使用 _netdev 参数后系统会等联网成功后再尝试挂载这块网络存储设备,从而避免了开机时间过长或失败的情况。

    [root@linuxprobe ~]# vim /etc/fstab
    [root@linuxprobe ~]# cat /etc/fstab
    #
    # /etc/fstab
    # Created by anaconda on Sun Jun  4 03:05:37 2023
    #
    # 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.
    #
    # After editing this file, run 'systemctl daemon-reload' to update systemd
    # units generated from this file.
    #
    /dev/mapper/rhel-root   /                       xfs     defaults        0 0
    UUID=73159c7d-b179-4ef9-a83f-3f6f6ce390ed /boot                   xfs     defaults,uquota        0 0
    /dev/mapper/rhel-swap   swap                    swap    defaults        0 0
    /dev/cdrom /media/cdrom iso9660 defaults 0 0
    /dev/sdb2 /backup ext4 defaults,_netdev 0 0
    /dev/cdrom /media/cdrom iso9660 defaults 0 0
    /dev/sdb1 /newFS xfs defaults 0 0
    /dev/sdb2 swap swap defaults 0 0
    UUID=1f86fda9-e273-4894-acfe-08168f7d71f1 /storage xfs defaults,_netdev 0 0
    

软硬方式链接

img

ln

软链接

实验代码

  1. 创建文件。

    [linuxprobe@linuxprobe ~]$ echo "Welcome to linuxprobe.com" > old.txt
    
  2. 创建软链接。

    [linuxprobe@linuxprobe ~]$ ln -s old.txt new.txt
    
  3. 查看两文件。

    [linuxprobe@linuxprobe ~]$ cat old.txt
    Welcome to linuxprobe.com
    [linuxprobe@linuxprobe ~]$ cat new.txt
    Welcome to linuxprobe.com
    [linuxprobe@linuxprobe ~]$ ls -ald old.txt new.txt
    lrwxrwxrwx. 1 linuxprobe linuxprobe  7 Jun 13 09:00 new.txt -> old.txt
    -rw-rw-r--. 1 linuxprobe linuxprobe 26 Jun 13 09:00 old.txt
    
  4. 删除原始文件,再次查看软链接文件。

    [linuxprobe@linuxprobe ~]$ rm -f old.txt
    [linuxprobe@linuxprobe ~]$ ls -ald old.txt new.txt
    ls: cannot access 'old.txt': No such file or directory
    lrwxrwxrwx. 1 linuxprobe linuxprobe 7 Jun 13 09:00 new.txt -> old.txt
    

硬链接

实验代码

  1. 创建文件。

    [linuxprobe@linuxprobe ~]$ echo "Welcome to linuxprobe.com" > old.txt
    
  2. 创建硬链接,即相当于针对原始文件的硬盘存储位置创建了一个指针。

    • 这样一来,新创建的这个硬链接就不再依赖于原始文件的名称等信息,也不会因为原始文件的删除而导致无法读取了。
    [linuxprobe@linuxprobe ~]$ ln old.txt new.txt
    
  3. 查看两文件。

    • 可以看到创建硬链接后,原始文件的硬盘链接数量增加到了 2,这个数字表示的是文件的 inode 信息块的数量。
    [linuxprobe@linuxprobe ~]$ cat old.txt
    Welcome to linuxprobe.com
    [linuxprobe@linuxprobe ~]$ cat new.txt
    Welcome to linuxprobe.com
    [linuxprobe@linuxprobe ~]$ ls -ald old.txt  new.txt
    -rw-rw-r--. 2 linuxprobe linuxprobe 26 Jun 13 09:07 new.txt
    -rw-rw-r--. 2 linuxprobe linuxprobe 26 Jun 13 09:07 old.txt
    
  4. 删除原始文件,再次查看硬链接文件。

    [linuxprobe@linuxprobe ~]$ rm -f old.txt
    [linuxprobe@linuxprobe ~]$ ls -ald new.txt old.txt
    ls: cannot access 'old.txt': No such file or directory
    -rw-rw-r--. 1 linuxprobe linuxprobe 26 Jun 13 09:07 new.txt
    

总结