Linux 之旅 5:磁盘与文件系统管理

Linux 之旅 5:磁盘与文件系统管理

Linux文件系统

文件系统特性

我们知道,对于一个新的存储设备,无论是移动硬盘还是U盘,在第一次连接电脑后一般都会提示要格式化后使用,那格式化是做什么用的呢?

简单来说,每种操作系统都有独特的数据存储和组织方式,也就是所谓的“文件系统”,而格式化就是将空白存储器,或者说非当前操作系统支持的文件系统格式转化为支持的一种文件系统格式的过程。虽然这么说有点拗口,但意思应该还是比较明确的。

所以说存储器只有经过格式化以后才能正常挂载到操作系统中供操作系统使用。

一般来说文件系统由以下几部分组成:

  • 超级区块(super block):记录文件系统的整体信息,包括inode与数据区块的总量、使用量、剩余量以及文件系统的格式与相关信息等。
  • inode:记录文件的属性,一个文件占用一个inode,同时记载此文件所在的数据区块(block)号码。
  • 数据区块(block):记录文件内容,如果一个区块不够,会占用多个区块。

这里的文件属性指读写权限、拥有者、所属组以及修改时间等非文件内容的相关信息。

虽然大部分文件系统都由这几部分构成,但在实现上有所不同,比如Linux文件系统ext2中,一个文件所关联的所有block都会记载在其对应的inode中,也就是说操作系统在读取这个文件的时候只要读取该文件的inode就可以知道其所有的block块,然后一次性读入内存(见图7.1.1)。但在老式的Windows文件系统FAT中不是如此,FAT中的inode仅会记录第一个block块的编号,要想知道第二个block编号则需要先读取第一个block之后才能知道,也就是说操作系统必须要依次读取:inode–>block1–>block2这样,一直到最后一个文件块(见图7.1.2)。如果文件系统的存储介质是SSD也问题不大,但如果是机械硬盘就很影响性能,想想看,前者最多也就是磁头扫描两圈(第一圈找inode,第二圈找block)就结束了,但后者的最差情况很可能是inode+block数量的圈数(如果block块过于分散的话),这也是为什么老式的Windows会建议用户定期进行碎片整理的原因,将一个文件的block整理在一起显然是有利于FAT之类的文件系统的执行效率。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5mSjZQmM-1628498323736)(https://image2.icexmoon.xyz/image/image-20210808143611114.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9ESuRrpr-1628498323741)(https://image2.icexmoon.xyz/image/image-20210808143625217.png)]

(图片引用自鸟哥的私房菜

在分类上,ext2这种inode记录所有关联block的文件系统称作索引式文件系统(indexed allocation)

Linux 的 ext2 文件系统(inode)

上边说了,ext2的文件系统是分为超级区块、inode和block的,具体到实际操作,因为即使是单个分区而非整块磁盘,也可能容量巨大,所以ext2文件系统会将一个分区划分为多个区块群组(block group)进行管理,每个区块群组会有各自的inode、block和超级区块(见图7.1.3)。

image-20210808145052013

(图片用自鸟哥的私房菜

数据区块

ext2的block有1k、2k和4k三种大小,且在格式化的时候就会确定下来,不可更改。

此外,ext2的block还有以下限制:

  • 区块的大小与数量在格式化完毕后就不可更改(除非重新格式化)。
  • 每个区块仅能放置最多一个文件的数据。
  • 如果文件大于区块大小,会占用多个区块。
  • 如果文件小于区块大小,会浪费掉剩余空间。

因为ext2的block有如上特性,所以对于大型文件存储来说,如果ext2的区块太小,存储单个大型文件就会占用很多个区块,inode也需要记录多个区块的编号,这可能会影响到文件系统的读写性能。

inode

之前说了,inode记录文件属性,具体包括以下数据:

  • 读写属性(read、write、execute)
  • 拥有者和群组(owner、group)
  • 大小
  • 建立或状态改变的时间(ctime,status time)
  • 最后一次读取时间(atime,access time)
  • 最后一次修改时间(mtime,modify time)
  • 特殊属性,如SetUID
  • 真正的内容指向(pointer)

与block类似,inode的大小和数量也是在格式化的时候就确定了的,除此以外还具有以下特点:

  • 每个inode大小固定为128B(新的 ext4 与 xfs 可设置到 256B)
  • 每个文件都只会占用一个inode
  • 因为上一条的原因,文件系统能够建立的文件数量上限为inode的数量上限
  • 系统在读取或执行文件的时候,会先查找到对应的inode,并依据inode中记录的文件权限进行判断,来决定用户是否有权限进行读取或执行该文件。

之前说了,单个文件最多也只会有一个inode,可能会有比较机灵的人会质疑,单个inode大小有限,如果某个大文件占用很多个区块,导致其inode需要存储的block编号过多,超过了单个inode大小怎么办。

其实不用担心,并非所有的inode–>block指向都是直接指向,如果占用的block过多,inode会间接指向一个记录了实际block编号的block,用这种间接指向的方式来记录超过自身容量的block编号,在此基础上甚至还可以双间接或三间接(也就是提升间接的层次),所以无论是关联多少个block编号,无论多大的文件,都是可以用一个inode完成记录的(可以参考图7.1.4)。

image-20210808150749944

(图片引用自鸟哥的私房菜

超级区块

超级区块记录了整个文件系统的相关信息,具体包括:

  • block与inode的总量
  • 未使用与已使用的block和inode数量
  • block与inode的大小
  • 文件系统的挂载时间、最后一次写入数据的时间、最近一次检验磁盘(fsck)的时间等文件系统相关信息。
  • 一个有效位数值,表示该文件系统是否已经挂载(0是,1否)

虽然我们上边说过,在实际中一个ext2文件系统是由多个区块群组构成的,每个群组都有自己的超级区块,也就是会有多个超级区块。但是,除了第一个区块群组的超级区块是真正使用中起作用的超级区块以外,其它区块群组的超级区块仅起到备份的作用,即真实超级区块出现问题的时候可以用其它的超级区块来修复。

与目录树的关系

在文件系统中,目录会占用一个inode和至少一个block,inode中存放该目录的权限和其它属性数据以及block编号,block中会存放目录下的文件和子目录名称,以及对应的inode编号。

要观察文件或目录的inode编号可以这样:

[icexmoon@xyz ~]$ ls -ali
总用量 44
      67 drwx------. 15 icexmoon icexmoon 4096 88 15:01 .
      64 drwxr-xr-x.  3 root     root       22 724 14:45 ..
      75 -rw-------.  1 icexmoon icexmoon  860 87 15:09 .bash_history
      68 -rw-r--r--.  1 icexmoon icexmoon   18 41 2020 .bash_logout
      69 -rw-r--r--.  1 icexmoon icexmoon  193 41 2020 .bash_profile
      70 -rw-r--r--.  1 icexmoon icexmoon  231 41 2020 .bashrc

此外我们还可以观察目录的大小:

[icexmoon@xyz ~]$ ls -ldh / /boot /usr/sbin /proc /sys
dr-xr-xr-x.  17 root root  224 724 14:45 /
dr-xr-xr-x.   5 root root 4.0K 724 14:47 /boot
dr-xr-xr-x. 227 root root    0 88 15:00 /proc
dr-xr-xr-x.  13 root root    0 88 15:00 /sys
dr-xr-xr-x.   2 root root  20K 724 14:38 /usr/sbin

可以看到/boot占用了4k,这并不是说/boot目录及其下的内容实际大小是4k,而是目录本身占用了一个block,大小是4k,而/usr/sbin因为其下的文件和子目录很多,所以占用了5个block,所以是20k。知道了这个就会理解ls命令输出的目录大小是怎么一回事了。

  • /boot/proc大小是0是因为他们是虚拟文件系统,存在于内存而非本地存储中,所以是0。
  • /的大小为224B可能是因为这里我的文件系统是xfs,使用了不同大小的block所致。

目录树读取

理解了上边这些文件系统相关的知识后,关于文件的读写和执行权限应该会有更清楚的认识,即目录树对文件的权限影响。

我们知道,文件系统是由inode和block组织起来的,具体到我们要读取一个文件,操作系统必须先从根目录开始,先读取根目录的inode,然后是根目录的block,然后才能知道根目录的子目录的inode,这样依次进行,直到读取最终文件的inode和block。如果在中途的某个中间目录的inode读取的时候,操作系统发现你并没有相应的权限,就会终止整个行为。

这也就是为什么有时候明明我们拥有某个文件的读写权限,但是不能操作,这很可能是因为缺少其父目录的权限导致的。

ext2/ext3/ext4 文件的存取与日志式文件系统的功能

前面我们说了文件系统中的文件读取操作,对于写入操作,文件系统需要执行以下步骤:

  • 先查看相应目录,确认用户是否有新建文件的权限。
  • 在超级区块中的inode对照表中找一个没有使用的inode,并写入文件相关的属性数据。
  • 在超级区块中的block对照表中找一个或多个没有使用的block,并写入文件内容,并在inode中记录这些block编号。
  • 将使用的inode和block编号更新到inode对照表和block对照表,并更新超级区块的内容。

数据不一致(inconsistent)状态

就像上面展示的那样,实际使用文件系统的时候,每个新建文件或者修改文件都涉及到多个地方数据的修改,一旦没有得到完整执行,比如使用了某个inode或者多个block的时候还没来得及更新超级区块就断电关机了,就会导致文件系统出现错误,即超级区块的记录与实际使用情况不一致。

在这时候就必须进行数据一致性检查,但是传统的文件系统,如ext2,对所有数据进行一致性检查极其耗费时间,所以就产生了新的日志式文件系统。

日志式文件系统

日志式文件系统的核心思想是如果进行类似的新建或修改等影响到多个地方数据同步的操作,就在执行的同时在相应的日志中添加一条记录,记录对某某文件执行某某操作,如果完整执行了操作,就消除该记录,如果没有,在我们进行数据一致性检查的时候就只要检查相应的日志即可,就可以快速发现问题并处理,并不需要检查文件系统上的所有数据,自然修复速度也就快的多。

具体分为以下步骤:

  • 预备:当需要写入一个文件时,在日志记录区块记录准备写入某文件。
  • 实际写入:写入文件的权限和数据,并更在超级区块中更新相应数据。
  • 结束:完成数据与超级区块更新后,在日志记录区块中完成该文件的记录。

Linux 文件系统的运行

在使用Linux进行文件读写的时候,出于效率的考虑,Linux会使用异步处理(asynchronously)的方式,将文件加载到内存中进行操作,并不会及时写入磁盘,因为内存的读写速度要比磁盘快的多。操作系统仅会在需要的时候,比如你手动执行了保存或者电脑关机的时候将已经修改了但还没有写入磁盘的内容(称为Dirty)进行磁盘写入操作。但这就面临一个和上边类似的问题,即如果没有写入就非正常关机,就会导致磁盘上的数据不一致。

我们可以通过sync命令显式地将内存中的Dirty数据写入磁盘。

挂载点的意义

我们已经直到了何为文件系统,而一个文件系统必须要结合到目录树才能使用,而将文件系统与目录树结合的操作我们称之为挂载。

挂载点一定是目录,且该目录就是进入文件系统的入口。

# 观察本机的挂载点
[icexmoon@xyz ~]$ df -h
文件系统                 容量  已用  可用 已用% 挂载点
devtmpfs                 470M     0  470M    0% /dev
tmpfs                    487M     0  487M    0% /dev/shm
tmpfs                    487M  8.6M  478M    2% /run
tmpfs                    487M     0  487M    0% /sys/fs/cgroup
/dev/mapper/centos-root   10G  3.9G  6.2G   39% /
/dev/sda2               1014M  172M  843M   17% /boot
/dev/mapper/centos-home  5.0G  119M  4.9G    3% /home
tmpfs                     98M   24K   98M    1% /run/user/1000
# 打印挂载点的inode
[icexmoon@xyz ~]$ ls -dil / /boot /home
64 dr-xr-xr-x. 17 root root  224 724 14:45 /
64 dr-xr-xr-x.  5 root root 4096 724 14:47 /boot
64 drwxr-xr-x.  3 root root   22 724 14:45 /home

从上边的示例可以看到,虽然//boot/home是三个不同的挂载点和目录,但它们的inode相同,都是64。这是因为它们是三个不同的文件系统,而且在各自文件系统中都是顶层目录,inode都是64(其它属性的不同也说明了这三者的确是不同的目录)。

我们需要牢记inode仅代表在所在文件系统中的编号,并不能拿不同的文件系统的inode来比较,就像上面三个inode编号相同的情况。

其它Linux支持的文件系统和VFS

常见的文件系统主要有:

  • 传统文件系统:ext2\minix\FAT(用vfat模块)\iso9660(光盘)等
  • 日志式文件系统:ext3\ext4\ReiserFS\Windows’ NTFS\IBM’s JFS
  • 网络文件系统:NFS\SMBFS

想要直到当前的Linux系统支持哪些文件系统,可以:

[icexmoon@xyz ~]$  ls -l /lib/modules/$(uname -r)/kernel/fs
总用量 20
-rw-r--r--. 1 root root 5992 1020 2020 binfmt_misc.ko.xz
drwxr-xr-x. 2 root root   25 724 14:35 btrfs
drwxr-xr-x. 2 root root   30 724 14:35 cachefiles
drwxr-xr-x. 2 root root   24 724 14:35 ceph
drwxr-xr-x. 2 root root   24 724 14:35 cifs
drwxr-xr-x. 2 root root   26 724 14:35 cramfs
drwxr-xr-x. 2 root root   23 724 14:35 dlm
drwxr-xr-x. 2 root root   26 724 14:35 exofs
drwxr-xr-x. 2 root root   24 724 14:35 ext4
drwxr-xr-x. 2 root root   60 724 14:35 fat
drwxr-xr-x. 2 root root   27 724 14:35 fscache
drwxr-xr-x. 2 root root   42 724 14:35 fuse
drwxr-xr-x. 2 root root   24 724 14:35 gfs2
drwxr-xr-x. 2 root root   25 724 14:35 isofs

查看系统已加载到内存中的对文件系统的支持列表:

[icexmoon@xyz ~]$ cat /proc/filesystems
nodev   sysfs
nodev   rootfs
nodev   ramfs
nodev   bdev
nodev   proc
nodev   cgroup
nodev   cpuset
nodev   tmpfs
nodev   devtmpfs
nodev   debugfs

Linux VFS(Virtual Filesystem Switch)

因为有如此之多的文件系统,所以对于操作系统而言,管理不同的文件系统自然是个大麻烦。

事实上所有Linux都通过一个名为VFS的内核功能读取具体的文件系统(可以视作不同文件系统的兼容层)。

可以参考下图:

image-20210808161223993

(图片引用自鸟哥的私房菜

XFS文件系统简介

之前介绍ext2的时候我们说过,ext2会在格式化的时候就确定所有的inode与block,自然也就需要对所有空间进行初始化工作,这就意味着超长时间的格式化,分区的容量越大就需要越久。

和ext2相比,xfs在格式化方面灵活的多,所需时间更是少的多。简单的说这是一个适合高容量磁盘和巨型文件且性能不错的文件系统。

XFS文件系统的配置

XFS文件系统主要分为这几个部分:

  • 数据区(data section):

    包括inode、block和超级区块等,与ext2类似,也分为多个存储区群组(allocation groups),每个群组都包含:(1)整个文件系统的超级区块(2)剩余空间的管理机制(3)inode的分配与追踪。此外,inode和block都是需要时才动态分配产生,所以可以快速格式化。

    xfs的inode和block有多种不同的容量可供设置(512B~64KB),但因为Linux页面文件容量(pagesize)的限制,最大只能使用4KB的block。

  • 文件系统活动日志区(log section):

    日志区块,记录文件系统的变化。可以指定外部磁盘作为xfs文件系统的日志区块,例如使用SSD。

  • 实时运行区(realtime section):

    可以看作实际执行存储分配的区块。当有文件需要新建时,xfs会在这个区段中找一个到多个extend区块,将文件放置在这个区块中,等到分配完毕,会写入到数据区的inode与区块中。

原书这里将log section写作登录区,我认为是翻译错误,这里和登录不搭边,应当是日志区。

XFS 文件系统的描述数据观察

[icexmoon@xyz ~]$ df -h
文件系统                 容量  已用  可用 已用% 挂载点
devtmpfs                 470M     0  470M    0% /dev
tmpfs                    487M     0  487M    0% /dev/shm
tmpfs                    487M  8.6M  478M    2% /run
tmpfs                    487M     0  487M    0% /sys/fs/cgroup
/dev/mapper/centos-root   10G  3.9G  6.2G   39% /
/dev/sda2               1014M  172M  843M   17% /boot
/dev/mapper/centos-home  5.0G  119M  4.9G    3% /home
tmpfs                     98M   24K   98M    1% /run/user/1000
tmpfs                     98M     0   98M    0% /run/user/0
[icexmoon@xyz ~]$ xfs_info /dev/sda2
meta-data=/dev/sda2              isize=512    agcount=4, agsize=65536 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=262144, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[icexmoon@xyz ~]$ xfs_info /
meta-data=/dev/mapper/centos-root isize=512    agcount=4, agsize=655360 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=2621440, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

可以使用xfs_info 挂载点|设备文件名查看xfs类型的文件系统信息。

其中agcount=4表示有4个群组,agsize=655360 blks表示每个群组有655360个区块,从data部分的bsize=4096可以看到每个区块大小是4KB,所以根目录的总容量是4*655360*4KB

文件系统简单操作

磁盘与目录的容量

df

df(default filesystem)命令可以列出磁盘整体的使用情况:

[icexmoon@xyz ~]$ df -h
文件系统                 容量  已用  可用 已用% 挂载点
devtmpfs                 470M     0  470M    0% /dev
tmpfs                    487M     0  487M    0% /dev/shm
tmpfs                    487M  8.6M  478M    2% /run
tmpfs                    487M     0  487M    0% /sys/fs/cgroup
/dev/mapper/centos-root   10G  3.9G  6.2G   39% /
/dev/sda2               1014M  172M  843M   17% /boot
/dev/mapper/centos-home  5.0G  119M  4.9G    3% /home
tmpfs                     98M   24K   98M    1% /run/user/1000

也可以在后边跟具体的目录,查看该目录所在的文件系统的情况:

[icexmoon@xyz ~]$ df -h /
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   10G  3.9G  6.2G   39% /

du

我们之前说过,使用ls查看到的目录大小是目录关联的block大小,并不能代表目录包含的内容的实际大小,而我们如果要看某个目录的实际占用大小就需要使用du(disk usage)这个命令。

比如我常用的命令是这个:

[icexmoon@xyz ~]$ du -hd 1
60M     ./.mozilla
27M     ./.cache
4.0K    ./.dbus
112K    ./.config
324K    ./.local
0       ./桌面
0       ./下载
0       ./模板
0       ./公共
0       ./文档
0       ./音乐
0       ./图片
0       ./视频
86M     .

参数-d 1的意思是仅显式下边一层子目录的大小,通过这个命令就可以查看当前目录下哪个子目录最占用空间。

硬链接与符号链接

可以使用ln(link)命令创建链接。

硬链接(Hard Link)

为某个文件创建一个硬链接指在某个目录下创建一个文件名,并指向该文件的inode编号。

实际演示:

[icexmoon@xyz ~]$ cd /tmp/test/
[icexmoon@xyz test]$ ls -al
总用量 4
drwxrwxr-x.  2 icexmoon icexmoon   21 86 17:56 .
drwxrwxrwt. 22 root     root     4096 88 16:55 ..
-rwxr-xr-x.  1 icexmoon icexmoon    0 86 17:56 test.py
[icexmoon@xyz test]$ ln test.py test_link.py
[icexmoon@xyz test]$ ls -ial
总用量 4
26833303 drwxrwxr-x.  2 icexmoon icexmoon   41 88 16:55 .
16797768 drwxrwxrwt. 22 root     root     4096 88 16:55 ..
26833311 -rwxr-xr-x.  2 icexmoon icexmoon    0 86 17:56 test_link.py
26833311 -rwxr-xr-x.  2 icexmoon icexmoon    0 86 17:56 test.py

这里使用ln命令为test.py这个文件创建了一个硬链接test_link.py

可以看到表示文件链接数目的数字从一开始的1变成了2,且两个文件的inode编号也完全相同,这表示两个文件其实是同一个。

我们来实际测试一下:

# 写入一行 hellow world代码
[icexmoon@xyz test]$ nano test_link.py
[icexmoon@xyz test]$ cat test.py
print("hellow world!")
[icexmoon@xyz test]$

可以看到,修改了硬链接文件的内容,原文件也同样发生了改变。

硬链接与原文件的关系可以用以下图表示:

image-20210808170232771

(图片引用自鸟哥的私房菜

硬链接最大的好处是安全,我们通过硬链接多保留了一份对原始数据inode的引用,也就意味着即使原文件被删除,只要还存在一个硬链接,就可以通过这个硬链接对数据进行访问。从这个角度上讲,硬链接其实已经很原始文件的那个引用没有什么区别了,它们都可以代表对真实数据的正式引用。

这里来实际测试一下:

[icexmoon@xyz test]$ rm -f test.py
[icexmoon@xyz test]$ ls -ail test*
26833311 -rwxr-xr-x. 1 icexmoon icexmoon 23 88 16:59 test_link.py
[icexmoon@xyz test]$ cat test_link.py
print("hellow world!")

可以看到,虽然删除了“原文件”,硬链接的链接数也变成了1,但是并不影响文件的读取。

总的来说,硬链接的本质就是通过在目录下添加一个文件名对具体数据的inode进行指向,并不会增加新的inode和block

硬链接虽然很棒,但是又一些限制:

  • 不能跨文件系统
  • 不能连接目录

第一条很好理解,既然是通过对inode的引用来添加硬链接,自然不能跨文件系统,每个文件系统的inode编号是自成一体的,不能引用别的文件系统的inode。至于第二条,解释起来就很麻烦了,还是只要记住这个限制就好…

符号链接(Symbolic Link)

符号链接是建立一个独立文件,并通过这个文件指向原文件的文件名。

可以用下图表示:

image-20210808171644636

(图片引用自鸟哥的私房菜

符号链接无论在实现还是功能上,都几乎和Windows上的快捷方式一毛一样,所以也就不难理解符号链接的种种行为,比如说原文件删除后符号链接就失效了,这个自然不必多说,Windows上相比都经常遇到。

此外需要说明的是,因为符号链接确实创建了新的文件,所以也相应的要消耗inode和block。

我们来实际测试一下:

# 创建符号链接
[icexmoon@xyz test]$ ln -s test_link.py test_sybolic_link.py
[icexmoon@xyz test]$ ls -ali
总用量 8
26833303 drwxrwxr-x.  2 icexmoon icexmoon   54 88 17:19 .
16797768 drwxrwxrwt. 22 root     root     4096 88 17:18 ..
26833311 -rwxr-xr-x.  1 icexmoon icexmoon   23 88 16:59 test_link.py
26833305 lrwxrwxrwx.  1 icexmoon icexmoon   12 88 17:19 test_sybolic_link.py -> test_link.py
[icexmoon@xyz test]$ nano test_sybolic_link.py
[icexmoon@xyz test]$ cat test_link.py
print("hellow world!")
print("symblic link edit")
[icexmoon@xyz test]$ rm -f test_link.py
[icexmoon@xyz test]$ ls -ali
总用量 4
26833303 drwxrwxr-x.  2 icexmoon icexmoon   34 88 17:20 .
16797768 drwxrwxrwt. 22 root     root     4096 88 17:20 ..
26833305 lrwxrwxrwx.  1 icexmoon icexmoon   12 88 17:19 test_sybolic_link.py -> test_link.py # 这里的->表示这是一个软链接
[icexmoon@xyz test]$ cat test_sybolic_link.py
cat: test_sybolic_link.py: 没有那个文件或目录

可以看到,删除了原文件后相应的符号链接就失效了。

虽然软链接在效用上不如硬链接,但是软链接也没有硬链接的限制:不仅可以链接目录,也可以跨文件系统进行链接。这也很好理解,因为软链接是通过指向一个路径来进行链接的,并非使用inode来指向,所以自然没有文件系统的限制。

磁盘的分区、格式化、检验与挂载

观察磁盘分区状态

lsblk

lsblk(list block device)命令可以列出系统上所有的磁盘。

[icexmoon@xyz test]$ lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   40G  0 disk
├─sda1            8:1    0    2M  0 part
├─sda2            8:2    0    1G  0 part /boot
└─sda3            8:3    0   30G  0 part
  ├─centos-root 253:0    0   10G  0 lvm  /
  ├─centos-swap 253:1    0    1G  0 lvm  [SWAP]
  └─centos-home 253:2    0    5G  0 lvm  /home
sr0              11:0    1 1024M  0 rom

输出的信息包括以下内容:

  • NAME:设备文件名
  • MAJ:MIN:主要与次要设备代码,用于内核识别
  • RM:是否为可卸载设备,如光盘/USB等
  • SIZE:容量
  • RO:是否为只读设备
  • TYPE:设备类型,如磁盘(disk),分区(part),只读存储器(rom)
  • MOUNTPOINT:挂载点

从上边的输出可以看到,我们当前的系统使用了一个磁盘sda,具体划分了三个分区,sda1是磁盘的启动引导分区,sda2是我们的系统加载分区,挂载在/boot下,sda3是一个LVM组分区,我们在sda3下边划分了具体的几个LVM,其中centos-root挂载在/下,centos-swap是一个交换分区,centos-home挂载在/home下,从几个LVM的容量可知,整个LVM组sda3还有14G的空间剩余,没有划分。

blkid

blkid命令常用于查看设备的UUID,这里的UUID指全局唯一标识符(universally unique identifier),Linux会给系统内的所有设备给予一个独一无二的标识。

这个UUID是和具体的硬件绑定的,比如你用树莓派给一个外接移动硬盘生成一个UUID,然后将这个移动硬盘连接到另一台Linux电脑上,依然是可以使用这个UUID进行挂载的(当然前提是该UUID没有和当前Linux上的设备的UUID冲突,就UUID的生成方式和长度来说这种可能微乎其微)。

事实上前边介绍的lsblk也可以用于查看UUID:

[icexmoon@xyz test]$ lsblk -f
NAME            FSTYPE      LABEL UUID                                   MOUNTPOINT
sda
├─sda1
├─sda2          xfs               3a6bd73c-8f36-4955-b079-b1e2501efc31   /boot
└─sda3          LVM2_member       z8yElP-WmqU-RW58-aQED-CexZ-238I-4n5JAu
  ├─centos-root xfs               9cfac9d8-a7d6-46e5-86ff-5843cc384ae6   /
  ├─centos-swap swap              1081ba0b-2e6b-47ab-be81-b136755a2744   [SWAP]
  └─centos-home xfs               9cc15746-fc30-4952-bf16-a248415fbebd   /home
sr0

但使用blkid命令查看更为直观:

[icexmoon@xyz ~]$ sudo blkid
[sudo] icexmoon 的密码:
/dev/sda1: PARTUUID="beba03a1-011f-4237-9848-96c3b46bbad7"
/dev/sda2: UUID="3a6bd73c-8f36-4955-b079-b1e2501efc31" TYPE="xfs" PARTUUID="af480520-bc6b-458a-be30-954f7cd1fdbe"
/dev/sda3: UUID="z8yElP-WmqU-RW58-aQED-CexZ-238I-4n5JAu" TYPE="LVM2_member" PARTUUID="1aab14fb-e456-4559-8e25-e15539e763b9"
/dev/mapper/centos-root: UUID="9cfac9d8-a7d6-46e5-86ff-5843cc384ae6" TYPE="xfs"
/dev/mapper/centos-swap: UUID="1081ba0b-2e6b-47ab-be81-b136755a2744" TYPE="swap"
/dev/mapper/centos-home: UUID="9cc15746-fc30-4952-bf16-a248415fbebd" TYPE="xfs"

比较诡异的是必须在root权限下执行blkid才能查看全部的设备信息,否则是没有输出的,我差点以为是我的blkid命令版本有问题。

parted

parted命令用于列出磁盘的分区表类型和分区信息。

[icexmoon@xyz ~]$ sudo parted /dev/sda print
[sudo] icexmoon 的密码:
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sda: 42.9GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: pmbr_boot

Number  Start   End     Size    File system  Name  标志
 1      1049kB  3146kB  2097kB                     bios_grub
 2      3146kB  1077MB  1074MB  xfs
 3      1077MB  33.3GB  32.2GB                     lvm

这个命令同样需要root权限。

磁盘分区

MBR分区主要使用fdisk分区,GPT分区主要使用gdisk分区。

gdisk

因为我的磁盘是GPT分区,所以这里展示使用gdisk的情况:

[icexmoon@xyz ~]$ sudo gdisk
GPT fdisk (gdisk) version 0.8.10

Type device filename, or press <Enter> to exit: /dev/sda
Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): h
b       back up GPT data to a file
c       change a partition's name
d       delete a partition
i       show detailed information on a partition
l       list known partition types
n       add a new partition
o       create a new empty GUID partition table (GPT)
p       print the partition table
q       quit without saving changes
r       recovery and transformation options (experts only)
s       sort partitions
t       change a partition's type code
v       verify disk
w       write table to disk and exit
x       extra functionality (experts only)
?       print this menu

Command (? for help): p
Disk /dev/sda: 83886080 sectors, 40.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 8B06235D-21F7-4581-8AB8-81469FD4654F
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 83886046
Partitions will be aligned on 2048-sector boundaries
Total free space is 18862013 sectors (9.0 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048            6143   2.0 MiB     EF02
   2            6144         2103295   1024.0 MiB  0700
   3         2103296        65026047   30.0 GiB    8E00

Command (? for help): q

gdisk需要管理员权限,这理所当然,毕竟这是可以分区的命令。

gdisk是一个交互式的工具,进入后可以执行一系列命令进行操作,有这么几个比较常用:

  • h:查看帮助信息,可以查看有哪些命令可以使用
  • p:打印分区信息
  • q:不保存分区修改的情况下离开
  • w:保存对分区的修改后离开
  • n:新增一个分区

最后的部分打印了sda磁盘的分区情况,具体包含以下信息:

  • Number:分区编号,1号指/dev/sda1
  • Start(sector):分区开始扇区
  • End(sector):分区结束扇区
  • Size:分区容量
  • Code:分区内可能的文件系统类型,Linux为8300,swap为8200
  • Name:文件系统的名称

这里可以看出两个关键:

  • last usable sector is 83886046说明最大可用分区是83886046,但是分区3仅使用到65026047,这说明已有的三个分区并没有把磁盘占满,磁盘还有未分配的可用空间。
  • 分区的时候扇区的起始编号Start为上一个分区的End扇区编号+1。

用gdisk新增分区

下面实际使用gdisk创建分区试试看:

[icexmoon@xyz ~]$ sudo gdisk
GPT fdisk (gdisk) version 0.8.10

Type device filename, or press <Enter> to exit: /dev/sda
Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): p
Disk /dev/sda: 83886080 sectors, 40.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 8B06235D-21F7-4581-8AB8-81469FD4654F
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 83886046
Partitions will be aligned on 2048-sector boundaries
Total free space is 18862013 sectors (9.0 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048            6143   2.0 MiB     EF02
   2            6144         2103295   1024.0 MiB  0700
   3         2103296        65026047   30.0 GiB    8E00

Command (? for help): n
Partition number (4-128, default 4):
First sector (34-83886046, default = 65026048) or {+-}size{KMGTP}:
Last sector (65026048-83886046, default = 83886046) or {+-}size{KMGTP}: +1G
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'

Command (? for help): p
Disk /dev/sda: 83886080 sectors, 40.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 8B06235D-21F7-4581-8AB8-81469FD4654F
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 83886046
Partitions will be aligned on 2048-sector boundaries
Total free space is 16764861 sectors (8.0 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048            6143   2.0 MiB     EF02
   2            6144         2103295   1024.0 MiB  0700
   3         2103296        65026047   30.0 GiB    8E00
   4        65026048        67123199   1024.0 MiB  8300  Linux filesystem

Command (? for help): n
Partition number (5-128, default 5):
First sector (34-83886046, default = 67123200) or {+-}size{KMGTP}:
Last sector (67123200-83886046, default = 83886046) or {+-}size{KMGTP}: +1G
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): L
0700 Microsoft basic data  0c01 Microsoft reserved    2700 Windows RE
3000 ONIE boot             3001 ONIE config           4100 PowerPC PReP boot
4200 Windows LDM data      4201 Windows LDM metadata  7501 IBM GPFS
7f00 ChromeOS kernel       7f01 ChromeOS root         7f02 ChromeOS reserved
8200 Linux swap            8300 Linux filesystem      8301 Linux reserved
8302 Linux /home           8400 Intel Rapid Start     8e00 Linux LVM
a500 FreeBSD disklabel     a501 FreeBSD boot          a502 FreeBSD swap
a503 FreeBSD UFS           a504 FreeBSD ZFS           a505 FreeBSD Vinum/RAID
a580 Midnight BSD data     a581 Midnight BSD boot     a582 Midnight BSD swap
a583 Midnight BSD UFS      a584 Midnight BSD ZFS      a585 Midnight BSD Vinum
a800 Apple UFS             a901 NetBSD swap           a902 NetBSD FFS
a903 NetBSD LFS            a904 NetBSD concatenated   a905 NetBSD encrypted
a906 NetBSD RAID           ab00 Apple boot            af00 Apple HFS/HFS+
af01 Apple RAID            af02 Apple RAID offline    af03 Apple label
af04 AppleTV recovery      af05 Apple Core Storage    be00 Solaris boot
bf00 Solaris root          bf01 Solaris /usr & Mac Z  bf02 Solaris swap
bf03 Solaris backup        bf04 Solaris /var          bf05 Solaris /home
bf06 Solaris alternate se  bf07 Solaris Reserved 1    bf08 Solaris Reserved 2
bf09 Solaris Reserved 3    bf0a Solaris Reserved 4    bf0b Solaris Reserved 5
c001 HP-UX data            c002 HP-UX service         ea00 Freedesktop $BOOT
eb00 Haiku BFS             ed00 Sony system partitio  ed01 Lenovo system partit
Press the <Enter> key to see more codes:
ef00 EFI System            ef01 MBR partition scheme  ef02 BIOS boot partition
fb00 VMWare VMFS           fb01 VMWare reserved       fc00 VMWare kcore crash p
fd00 Linux RAID
Hex code or GUID (L to show codes, Enter = 8300): 0700
Changed type of partition to 'Microsoft basic data'

Command (? for help): p
Disk /dev/sda: 83886080 sectors, 40.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 8B06235D-21F7-4581-8AB8-81469FD4654F
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 83886046
Partitions will be aligned on 2048-sector boundaries
Total free space is 14667709 sectors (7.0 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048            6143   2.0 MiB     EF02
   2            6144         2103295   1024.0 MiB  0700
   3         2103296        65026047   30.0 GiB    8E00
   4        65026048        67123199   1024.0 MiB  8300  Linux filesystem
   5        67123200        69220351   1024.0 MiB  0700  Microsoft basic data

Command (? for help): n
Partition number (6-128, default 6):
First sector (34-83886046, default = 69220352) or {+-}size{KMGTP}:
Last sector (69220352-83886046, default = 83886046) or {+-}size{KMGTP}: +0.5G
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 8200
Changed type of partition to 'Linux swap'

Command (? for help): p
Disk /dev/sda: 83886080 sectors, 40.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 8B06235D-21F7-4581-8AB8-81469FD4654F
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 83886046
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048            6143   2.0 MiB     EF02
   2            6144         2103295   1024.0 MiB  0700
   3         2103296        65026047   30.0 GiB    8E00
   4        65026048        67123199   1024.0 MiB  8300  Linux filesystem
   5        67123200        69220351   1024.0 MiB  0700  Microsoft basic data
   6        69220352        83886046   7.0 GiB     8200  Linux swap

Command (? for help): ?
b       back up GPT data to a file
c       change a partition's name
d       delete a partition
i       show detailed information on a partition
l       list known partition types
n       add a new partition
o       create a new empty GUID partition table (GPT)
p       print the partition table
q       quit without saving changes
r       recovery and transformation options (experts only)
s       sort partitions
t       change a partition's type code
v       verify disk
w       write table to disk and exit
x       extra functionality (experts only)
?       print this menu

Command (? for help): d
Partition number (1-6): 6

Command (? for help): p
Disk /dev/sda: 83886080 sectors, 40.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 8B06235D-21F7-4581-8AB8-81469FD4654F
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 83886046
Partitions will be aligned on 2048-sector boundaries
Total free space is 14667709 sectors (7.0 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048            6143   2.0 MiB     EF02
   2            6144         2103295   1024.0 MiB  0700
   3         2103296        65026047   30.0 GiB    8E00
   4        65026048        67123199   1024.0 MiB  8300  Linux filesystem
   5        67123200        69220351   1024.0 MiB  0700  Microsoft basic data

Command (? for help): n
Partition number (6-128, default 6):
First sector (34-83886046, default = 69220352) or {+-}size{KMGTP}:
Last sector (69220352-83886046, default = 83886046) or {+-}size{KMGTP}: +500M
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 8200
Changed type of partition to 'Linux swap'

Command (? for help): p
Disk /dev/sda: 83886080 sectors, 40.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 8B06235D-21F7-4581-8AB8-81469FD4654F
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 83886046
Partitions will be aligned on 2048-sector boundaries
Total free space is 13643709 sectors (6.5 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048            6143   2.0 MiB     EF02
   2            6144         2103295   1024.0 MiB  0700
   3         2103296        65026047   30.0 GiB    8E00
   4        65026048        67123199   1024.0 MiB  8300  Linux filesystem
   5        67123200        69220351   1024.0 MiB  0700  Microsoft basic data
   6        69220352        70244351   500.0 MiB   8200  Linux swap

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sda.
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
The operation has completed successfully.

这里我依次创建了三个分区,1G的Linux分区,1G的Windows分区,0.5G的Linux Swap分区。

值得注意的是,在创建分区的时候分区编号和开始扇区编号都可以使用默认值,而设定结束分区编号的时候可以使用+1G或者+500M这样的方式通过设置容量大小来让程序自行计算结束扇区编号。

这里我创建swap的时候使用+0.5G结果创建出的分区是7G,出错了,所以使用d命令删除后重新创建了。

此外关于扇区类型编号,可以使用L进行查看,这里Linux分区使用的编号是8300,LInux Swap分区使用的是8200,Windows分区使用的是0700。

一切设置好以后使用p命令进行确认,确认无误后使用w进行写入分区信息后退出。

退出后程序提醒你分区信息已写入,但是系统内核并没有立即加载新的分区,需要重启后才会加载。

partprobe

这里我们可以使用partprobe(partition probe)命令让内核立即加载分区表信息:

[icexmoon@xyz ~]$ sudo partprobe -s
[sudo] icexmoon 的密码:
/dev/sda: gpt partitions 1 2 3 4 5 6
[icexmoon@xyz ~]$ sudo lsblk /dev/sda
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   40G  0 disk
├─sda1            8:1    0    2M  0 part
├─sda2            8:2    0    1G  0 part /boot
├─sda3            8:3    0   30G  0 part
│ ├─centos-root 253:0    0   10G  0 lvm  /
│ ├─centos-swap 253:1    0    1G  0 lvm  [SWAP]
│ └─centos-home 253:2    0    5G  0 lvm  /home
├─sda4            8:4    0    1G  0 part
├─sda5            8:5    0    1G  0 part
└─sda6            8:6    0  500M  0 part
[icexmoon@xyz ~]$ cat /proc/partitions
major minor  #blocks  name

   8        0   41943040 sda
   8        1       2048 sda1
   8        2    1048576 sda2
   8        3   31461376 sda3
   8        4    1048576 sda4
   8        5    1048576 sda5
   8        6     512000 sda6
  11        0    1048575 sr0
 253        0   10485760 dm-0
 253        1    1048576 dm-1
 253        2    5242880 dm-2

可以看到新建的分区被正常加载。

用gdisk删除分区

[icexmoon@xyz ~]$ sudo gdisk
GPT fdisk (gdisk) version 0.8.10

Type device filename, or press <Enter> to exit: /dev/sda
Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): p
Disk /dev/sda: 83886080 sectors, 40.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 8B06235D-21F7-4581-8AB8-81469FD4654F
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 83886046
Partitions will be aligned on 2048-sector boundaries
Total free space is 13643709 sectors (6.5 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048            6143   2.0 MiB     EF02
   2            6144         2103295   1024.0 MiB  0700
   3         2103296        65026047   30.0 GiB    8E00
   4        65026048        67123199   1024.0 MiB  8300  Linux filesystem
   5        67123200        69220351   1024.0 MiB  0700  Microsoft basic data
   6        69220352        70244351   500.0 MiB   8200  Linux swap

Command (? for help): d
Partition number (1-6): 6

Command (? for help): p
Disk /dev/sda: 83886080 sectors, 40.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 8B06235D-21F7-4581-8AB8-81469FD4654F
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 83886046
Partitions will be aligned on 2048-sector boundaries
Total free space is 14667709 sectors (7.0 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048            6143   2.0 MiB     EF02
   2            6144         2103295   1024.0 MiB  0700
   3         2103296        65026047   30.0 GiB    8E00
   4        65026048        67123199   1024.0 MiB  8300  Linux filesystem
   5        67123200        69220351   1024.0 MiB  0700  Microsoft basic data

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sda.
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
The operation has completed successfully.
[icexmoon@xyz ~]$ sudo partprobe -s
/dev/sda: gpt partitions 1 2 3 4 5
[icexmoon@xyz ~]$ sudo lsblk /dev/sda
NAME            MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda               8:0    0  40G  0 disk
├─sda1            8:1    0   2M  0 part
├─sda2            8:2    0   1G  0 part /boot
├─sda3            8:3    0  30G  0 part
│ ├─centos-root 253:0    0  10G  0 lvm  /
│ ├─centos-swap 253:1    0   1G  0 lvm  [SWAP]
│ └─centos-home 253:2    0   5G  0 lvm  /home
├─sda4            8:4    0   1G  0 part
└─sda5            8:5    0   1G  0 part

需要注意的是,我们不能删除正在使用的分区,所以删除分区之前需要确保目标分区已经被卸载。

fdisk

fdisk的使用方式与gdisk类似,且现在MBR分区使用较少,所以这里不作过多介绍。

磁盘格式化

现在我们已经创建了两个新的分区,但是并不能直接挂载到文件系统中使用,因为我们还没有对分区进行格式化。

格式化分区的命令为mkfs(make filesystem),这是一个综合命令,支持多种文件系统。

XFS文件系统

对于XFS文件系统,我们可以使用mkfs.xfs进行格式化,或者也可以称之为创建文件系统。

[icexmoon@xyz ~]$ sudo mkfs.xfs /dev/sda4
[sudo] icexmoon 的密码:
meta-data=/dev/sda4              isize=512    agcount=4, agsize=65536 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=262144, 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
[icexmoon@xyz ~]$ sudo blkid
/dev/sda2: UUID="3a6bd73c-8f36-4955-b079-b1e2501efc31" TYPE="xfs" PARTUUID="af480520-bc6b-458a-be30-954f7cd1fdbe"
/dev/sda3: UUID="z8yElP-WmqU-RW58-aQED-CexZ-238I-4n5JAu" TYPE="LVM2_member" PARTUUID="1aab14fb-e456-4559-8e25-e15539e763b9"
/dev/mapper/centos-root: UUID="9cfac9d8-a7d6-46e5-86ff-5843cc384ae6" TYPE="xfs"
/dev/mapper/centos-swap: UUID="1081ba0b-2e6b-47ab-be81-b136755a2744" TYPE="swap"
/dev/mapper/centos-home: UUID="9cc15746-fc30-4952-bf16-a248415fbebd" TYPE="xfs"
/dev/sda1: PARTUUID="beba03a1-011f-4237-9848-96c3b46bbad7"
/dev/sda4: UUID="6a17cc8b-13e7-4e09-8be0-d82fd2b26131" TYPE="xfs" PARTLABEL="Linux filesystem" PARTUUID="4dc7e438-ecbb-4fc2-8c67-a8f412aa3ffc"
/dev/sda5: PARTLABEL="Microsoft basic data" PARTUUID="e3c582ba-d961-4a67-ace9-fcf87cceb41e"

可以看到格式化之后/dev/sda4的类型变成了xfs

ext4文件系统

类似的,我们可以使用mkfs.ext4命令创建ext4的文件系统:

[icexmoon@xyz ~]$ sudo mkfs.ext4 /dev/sda5
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536 inodes, 262144 blocks
13107 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376

Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (8192 blocks): 完成
Writing superblocks and filesystem accounting information: 完成

[icexmoon@xyz ~]$ sudo blkid
/dev/sda2: UUID="3a6bd73c-8f36-4955-b079-b1e2501efc31" TYPE="xfs" PARTUUID="af480520-bc6b-458a-be30-954f7cd1fdbe"
/dev/sda3: UUID="z8yElP-WmqU-RW58-aQED-CexZ-238I-4n5JAu" TYPE="LVM2_member" PARTUUID="1aab14fb-e456-4559-8e25-e15539e763b9"
/dev/mapper/centos-root: UUID="9cfac9d8-a7d6-46e5-86ff-5843cc384ae6" TYPE="xfs"
/dev/mapper/centos-swap: UUID="1081ba0b-2e6b-47ab-be81-b136755a2744" TYPE="swap"
/dev/mapper/centos-home: UUID="9cc15746-fc30-4952-bf16-a248415fbebd" TYPE="xfs"
/dev/sda4: UUID="6a17cc8b-13e7-4e09-8be0-d82fd2b26131" TYPE="xfs" PARTLABEL="Linux filesystem" PARTUUID="4dc7e438-ecbb-4fc2-8c67-a8f412aa3ffc"
/dev/sda1: PARTUUID="beba03a1-011f-4237-9848-96c3b46bbad7"
/dev/sda5: UUID="5ee3e1ce-1c1e-43a0-92fa-847518666c05" TYPE="ext4" PARTLABEL="Microsoft basic data" PARTUUID="e3c582ba-d961-4a67-ace9-fcf87cceb41e"

其它文件系统

我们可以使用mkfs[tab][tab]的方式查看其它文件系统的格式化命令:

[icexmoon@xyz ~]$ mkfs
mkfs         mkfs.cramfs  mkfs.ext3    mkfs.fat     mkfs.msdos   mkfs.xfs
mkfs.btrfs   mkfs.ext2    mkfs.ext4    mkfs.minix   mkfs.vfat

这里测试创建一个vfat格式的文件系统:

[icexmoon@xyz ~]$ sudo mkfs.vfat /dev/sda5
mkfs.fat 3.0.20 (12 Jun 2013)
[icexmoon@xyz ~]$ sudo blkid
/dev/sda2: UUID="3a6bd73c-8f36-4955-b079-b1e2501efc31" TYPE="xfs" PARTUUID="af480520-bc6b-458a-be30-954f7cd1fdbe"
/dev/sda3: UUID="z8yElP-WmqU-RW58-aQED-CexZ-238I-4n5JAu" TYPE="LVM2_member" PARTUUID="1aab14fb-e456-4559-8e25-e15539e763b9"
/dev/mapper/centos-root: UUID="9cfac9d8-a7d6-46e5-86ff-5843cc384ae6" TYPE="xfs"
/dev/mapper/centos-swap: UUID="1081ba0b-2e6b-47ab-be81-b136755a2744" TYPE="swap"
/dev/mapper/centos-home: UUID="9cc15746-fc30-4952-bf16-a248415fbebd" TYPE="xfs"
/dev/sda4: UUID="6a17cc8b-13e7-4e09-8be0-d82fd2b26131" TYPE="xfs" PARTLABEL="Linux filesystem" PARTUUID="4dc7e438-ecbb-4fc2-8c67-a8f412aa3ffc"
/dev/sda5: UUID="AFA9-252A" TYPE="vfat" PARTLABEL="Microsoft basic data" PARTUUID="e3c582ba-d961-4a67-ace9-fcf87cceb41e"
/dev/sda1: PARTUUID="beba03a1-011f-4237-9848-96c3b46bbad7"
# 还原回ext4文件系统
[icexmoon@xyz ~]$ sudo mkfs.ext4 /dev/sda5

文件系统检验

xfs_repair

xfs_repair命令可以用于检测、修复XFS文件系统,需要注意的是修复文件系统是个复杂的任务,所以必须确保目标文件系统已经被卸载。

根目录无法被卸载,修复根目录需要在单人维护模式下添加-d参数进行修复。

[icexmoon@xyz ~]$ sudo xfs_repair /dev/sda4
Phase 1 - find and verify superblock...
Phase 2 - using internal log
        - zero log...
        - scan filesystem freespace and inode maps...
        - found root inode chunk
Phase 3 - for each AG...
        - scan and clear agi unlinked lists...
        - process known inodes and perform inode discovery...
        - agno = 0
        - agno = 1
        - agno = 2
        - agno = 3
        - process newly discovered inodes...
Phase 4 - check for duplicate blocks...
        - setting up duplicate extent list...
        - check for inodes claiming duplicate blocks...
        - agno = 0
        - agno = 1
        - agno = 2
        - agno = 3
Phase 5 - rebuild AG headers and trees...
        - reset superblock...
Phase 6 - check inode connectivity...
        - resetting contents of realtime bitmap and summary inodes
        - traversing filesystem ...
        - traversal finished ...
        - moving disconnected inodes to lost+found ...
Phase 7 - verify and correct link counts...
done

fsck.ext4

fsck.ext4命令用于修复ext4文件系统。

[icexmoon@xyz ~]$ sudo fsck.ext4 /dev/sda5
e2fsck 1.42.9 (28-Dec-2013)
/dev/sda5: clean, 11/65536 files, 12955/262144 blocks
[icexmoon@xyz ~]$ sudo fsck.ext4 -f /dev/sda5
e2fsck 1.42.9 (28-Dec-2013)
第一步: 检查inode,块,和大小
第二步: 检查目录结构
第3步: 检查目录连接性
Pass 4: Checking reference counts
第5步: 检查簇概要信息
/dev/sda5: 11/65536 files (0.0% non-contiguous), 12955/262144 blocks

如果文件系统正常,该命令不会强制检查,如果需要强制检查,可以使用-f参数。

文件系统挂载与卸载

文件系统挂载应该遵循以下原则:

  • 单一文件系统不应该重复挂载到不同的目录下
  • 单一目录不应该挂载多个文件系统
  • 用于挂载文件系统的目录应该是空目录

最后一条并非一定不能违反,但是最好如此,因为如果是对非空目录进行挂载,在挂载完文件系统后原目录下的东西就看不到了,就像被挂载的文件系统屏蔽了一样,之后卸载文件系统后才能再出现。

操作系统中有这么几个文件与文件挂载相关:

  • /etc/filesystems:系统指定的测试挂载文件系统类型的优先级
  • /proc/filesystems:系统已加载的文件系统类型
  • /lib/modules/$(uname -r)/kernel/fs/:系统支持的文件系统驱动程序

挂载 xfs/ext4/vfat 等文件系统

[icexmoon@xyz ~]$ sudo mkdir /data/ext4
[icexmoon@xyz ~]$ sudo blkid
/dev/sda2: UUID="3a6bd73c-8f36-4955-b079-b1e2501efc31" TYPE="xfs" PARTUUID="af480520-bc6b-458a-be30-954f7cd1fdbe"
/dev/sda3: UUID="z8yElP-WmqU-RW58-aQED-CexZ-238I-4n5JAu" TYPE="LVM2_member" PARTUUID="1aab14fb-e456-4559-8e25-e15539e763b9"
/dev/mapper/centos-root: UUID="9cfac9d8-a7d6-46e5-86ff-5843cc384ae6" TYPE="xfs"
/dev/mapper/centos-swap: UUID="1081ba0b-2e6b-47ab-be81-b136755a2744" TYPE="swap"
/dev/mapper/centos-home: UUID="9cc15746-fc30-4952-bf16-a248415fbebd" TYPE="xfs"
/dev/sda4: UUID="6a17cc8b-13e7-4e09-8be0-d82fd2b26131" TYPE="xfs" PARTLABEL="Linux filesystem" PARTUUID="4dc7e438-ecbb-4fc2-8c67-a8f412aa3ffc"
/dev/sda5: UUID="f34b48b8-3add-4e02-9ca3-ad48030c344a" TYPE="ext4" PARTLABEL="Microsoft basic data" PARTUUID="e3c582ba-d961-4a67-ace9-fcf87cceb41e"
/dev/sda1: PARTUUID="beba03a1-011f-4237-9848-96c3b46bbad7"
[icexmoon@xyz ~]$ sudo mount UUID="6a17cc8b-13e7-4e09-8be0-d82fd2b26131" /data/xfs
[icexmoon@xyz ~]$ sudo mount UUID="f34b48b8-3add-4e02-9ca3-ad48030c344a" /data/ext4
[icexmoon@xyz ~]$ sudo df -h
文件系统                 容量  已用  可用 已用% 挂载点
devtmpfs                 470M     0  470M    0% /dev
tmpfs                    487M     0  487M    0% /dev/shm
tmpfs                    487M  8.6M  478M    2% /run
tmpfs                    487M     0  487M    0% /sys/fs/cgroup
/dev/mapper/centos-root   10G  3.9G  6.2G   39% /
/dev/sda2               1014M  172M  843M   17% /boot
/dev/mapper/centos-home  5.0G  119M  4.9G    3% /home
tmpfs                     98M   24K   98M    1% /run/user/1000
/dev/sda4               1014M   33M  982M    4% /data/xfs
/dev/sda5                976M  2.6M  907M    1% /data/ext4

挂载本身可以使用设备名或者UUID进行挂载,这里使用UUID。之前说过UUID是和硬件设备绑定的,所以使用UUID的好处是同一个外接存储设备,在这个Linux上的挂载用UUID和另一台机器上的完全相同,而设备名称就不一定了。

挂载 CD 或 DVD 光盘

因为我这里已经把Linux的安装镜像从本电脑移除了,所以这里临时使用UltraISO制作了一个镜像,制作方式也很简单,添加文件后另存为ISO格式镜像文件就可以了,这里不做过多介绍。

因为是使用的虚拟机,所以这里比实体机多一步,需要先把ISO镜像关联到虚拟机光驱。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3q6b66Cn-1628498323761)(https://image2.icexmoon.xyz/image/image-20210809112425404.png)]

设置好后点右小角的光驱图标进行连接即可。

[icexmoon@xyz ~]$ sudo mkdir /data/cd
[sudo] icexmoon 的密码:
[icexmoon@xyz ~]$ sudo blkid
/dev/sda1: PARTUUID="beba03a1-011f-4237-9848-96c3b46bbad7"
/dev/sda2: UUID="3a6bd73c-8f36-4955-b079-b1e2501efc31" TYPE="xfs" PARTUUID="af480520-bc6b-458a-be30-954f7cd1fdbe"
/dev/sda3: UUID="z8yElP-WmqU-RW58-aQED-CexZ-238I-4n5JAu" TYPE="LVM2_member" PARTUUID="1aab14fb-e456-4559-8e25-e15539e763b9"
/dev/sda4: UUID="6a17cc8b-13e7-4e09-8be0-d82fd2b26131" TYPE="xfs" PARTLABEL="Linux filesystem" PARTUUID="4dc7e438-ecbb-4fc2-8c67-a8f412aa3ffc"
/dev/sda5: UUID="f34b48b8-3add-4e02-9ca3-ad48030c344a" TYPE="ext4" PARTLABEL="Microsoft basic data" PARTUUID="e3c582ba-d961-4a67-ace9-fcf87cceb41e"
/dev/sr0: UUID="2021-08-09-11-18-01-00" LABEL="20210809_111500" TYPE="iso9660"
/dev/mapper/centos-root: UUID="9cfac9d8-a7d6-46e5-86ff-5843cc384ae6" TYPE="xfs"
/dev/mapper/centos-swap: UUID="1081ba0b-2e6b-47ab-be81-b136755a2744" TYPE="swap"
/dev/mapper/centos-home: UUID="9cc15746-fc30-4952-bf16-a248415fbebd" TYPE="xfs"
[icexmoon@xyz ~]$ sudo mount /dev/sr0 /data/cd
mount: /dev/sr0 写保护,将以只读方式挂载
[icexmoon@xyz ~]$ ls -al /data/cd/music
总用量 851373
dr-xr-xr-x. 1 root root    14336 89 11:18 .
dr-xr-xr-x. 1 root root     2048 89 11:18 ..
-r-xr-xr-x. 1 root root  9711036 123 2020 Actium - Here With You.mp3
-r-xr-xr-x. 1 root root 10252755 123 2020 again.mp3
-r-xr-xr-x. 1 root root     8896 324 11:15 Alternative ending,ARM - チルノのパーフェクトさんすう教室.lrc
-r-xr-xr-x. 1 root root 12875222 123 2020 Alternative ending,ARM - チルノのパーフェクトさんすう教室.mp3
-r-xr-xr-x. 1 root root     3324 324 11:20 angela - 騎士行進曲.lrc
-r-xr-xr-x. 1 root root 11508174 123 2020 angela - 騎士行進曲.mp3
-r-xr-xr-x. 1 root root     1966 324 11:25 bassy_ 茶太 - 夕日.lrc
-r-xr-xr-x. 1 root root  7853135 123 2020 bassy_ 茶太 - 夕日.mp3
[icexmoon@xyz ~]$ df -h /data/cd
文件系统        容量  已用  可用 已用% 挂载点
/dev/sr0        832M  832M     0  100% /data/cd

光盘的挂载方法和磁盘分区别无二致。此外因为是光盘,所以通过df命令查看到的容量是100%。

需要注意的是要将光盘从挂载点卸载后才能弹出光驱,对于我们虚拟机来说就是断开虚拟光驱。

挂载U盘

即使我们使用的是虚拟机,要测试U盘挂载也需要一个实体U盘。因为手头没有合适的U盘,所以这里就不测试了。需要注意的是要挂载U盘的前提是U盘的文件系统要是Linux支持的类型才行,如果不支持或者缺少驱动,就要通过系统更新的方式来支持以后才能挂载并识别。

卸载

使用umount命令即可对挂载的文件系统进行卸载:

[icexmoon@xyz ~]$ sudo umount /data/xfs
[sudo] icexmoon 的密码:
[icexmoon@xyz ~]$ sudo umount /data/ext4
[icexmoon@xyz ~]$ sudo umount /data/cd
[icexmoon@xyz ~]$ df -h
文件系统                 容量  已用  可用 已用% 挂载点
devtmpfs                 470M     0  470M    0% /dev
tmpfs                    487M     0  487M    0% /dev/shm
tmpfs                    487M  8.6M  478M    2% /run
tmpfs                    487M     0  487M    0% /sys/fs/cgroup
/dev/mapper/centos-root   10G  3.9G  6.2G   39% /
/dev/sda2               1014M  172M  843M   17% /boot
/dev/mapper/centos-home  5.0G  119M  4.9G    3% /home
tmpfs                     98M   24K   98M    1% /run/user/1000

磁盘、文件系统参数修改

mknod

Linux下的外接设备都以文件的形式表示,操作系统内核通过两个记录在文件属性上的编号来识别具体的设备,这两个编号是major 与 minor :

[icexmoon@xyz ~]$ ls -al /dev/sda*
brw-rw----. 1 root disk 8, 0 89 11:08 /dev/sda
brw-rw----. 1 root disk 8, 1 89 11:08 /dev/sda1
brw-rw----. 1 root disk 8, 2 89 11:08 /dev/sda2
brw-rw----. 1 root disk 8, 3 89 11:08 /dev/sda3
brw-rw----. 1 root disk 8, 4 89 11:08 /dev/sda4
brw-rw----. 1 root disk 8, 5 89 11:08 /dev/sda5

这里打印出的8就是主要设备代码(Major),0~5是次要设备代码(Minor),常见的设备名对应的设备代码如下:

磁盘设备名主要设备代码次要设备代码
/dev/sda80~15
/dev/sdb816~31
/dev/loop070
/dev/loop171

Linux 内核2.6之后,硬件设备代码就可以自动产生了,一般来说不用我们管,但特殊情况下我们可以通过mknod命令手动创建硬件设备编号:

[icexmoon@xyz ~]$ sudo mknod /dev/sda10 b 8 10
[icexmoon@xyz ~]$ ls -al /dev/sda*
brw-rw----. 1 root disk 8,  0 89 11:08 /dev/sda
brw-rw----. 1 root disk 8,  1 89 11:08 /dev/sda1
brw-r--r--. 1 root root 8, 10 89 11:50 /dev/sda10
brw-rw----. 1 root disk 8,  2 89 11:08 /dev/sda2
brw-rw----. 1 root disk 8,  3 89 11:08 /dev/sda3
brw-rw----. 1 root disk 8,  4 89 11:08 /dev/sda4
brw-rw----. 1 root disk 8,  5 89 11:08 /dev/sda5
[icexmoon@xyz ~]$ sudo rm -f /dev/sda10

这里的参数b是设备类型。

xfs_admin

如果我们想修改已存在的分区的Label和UUID,可以使用xfs_admin命令。

分区的Label相当于Windows下盘符的名称,起一个标识的作用。

下面展示修改/dev/sda4分区的Label并通过修改后的Label进行挂载:

[icexmoon@xyz ~]$ sudo xfs_admin -l /dev/sda4
[sudo] icexmoon 的密码:
label = ""
[icexmoon@xyz ~]$ sudo xfs_admin -L icexmoon_xfs /dev/sda4
writing all SBs
new label = "icexmoon_xfs"
[icexmoon@xyz ~]$ sudo mount -L icexmoon_xfs /data/xfs
[icexmoon@xyz ~]$ lsblk
NAME            MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda               8:0    0    40G  0 disk
├─sda1            8:1    0     2M  0 part
├─sda2            8:2    0     1G  0 part /boot
├─sda3            8:3    0    30G  0 part
│ ├─centos-root 253:0    0    10G  0 lvm  /
│ ├─centos-swap 253:1    0     1G  0 lvm  [SWAP]
│ └─centos-home 253:2    0     5G  0 lvm  /home
├─sda4            8:4    0     1G  0 part /data/xfs
└─sda5            8:5    0     1G  0 part
sr0              11:0    1 831.6M  0 rom

下面展示修改/dev/sda4分区的UUID,并使用新的UUID进行挂载:

[icexmoon@xyz ~]$ sudo umount /data/xfs
[icexmoon@xyz ~]$ uuidgen
3a8b7c86-e1b7-406b-a89c-721eed29febb
[icexmoon@xyz ~]$ sudo xfs_admin -u /dev/sda4
UUID = 6a17cc8b-13e7-4e09-8be0-d82fd2b26131
[icexmoon@xyz ~]$ sudo xfs_admin -U 3a8b7c86-e1b7-406b-a89c-721eed29febb /dev/sda4
Clearing log and setting UUID
writing all SBs
new UUID = 3a8b7c86-e1b7-406b-a89c-721eed29febb
[icexmoon@xyz ~]$ sudo lsblk /dev/sda4
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda4   8:4    0   1G  0 part /data/xfs

需要注意的是,在xfs_admin命令中,小写的lu将输出xfs文件系统的Label和UUID,大写的LU将修改Label和UUID。

需要注意的是,我们在修改文件系统的Label和UUID时应当先将该文件系统卸载,因为系统是通过Label或者UUID进行挂载的,所以可能会对系统有影响。此外,如果设置了通过Label或UUID进行自动加载,也应当一并修改。

tune2fs

前面介绍的xfs_admin命令可以修改xfs文件系统的Label和UUID,而对于ext4文件系统,我们可以使用tune2fs命令。

tune2fs的意思是tunable ext2 filesystem的意思,这个命令可以修改ext2/ext3/ext4文件系统的可调节参数。

下面使用tune2fs命令修改/dev/sda5的Lable,并挂载:

[icexmoon@xyz ~]$ sudo dumpe2fs -h /dev/sda5 | grep name
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name:   <none>
[icexmoon@xyz ~]$ tune2fs -L icexmoon_ext4 /dev/sda5
tune2fs 1.42.9 (28-Dec-2013)
tune2fs: 权限不够 当尝试打开 /dev/sda5 时
找不到有效的文件系统超级块.
[icexmoon@xyz ~]$ sudo tune2fs -L icexmoon_ext4 /dev/sda5
tune2fs 1.42.9 (28-Dec-2013)
[icexmoon@xyz ~]$ sudo dumpe2fs -h /dev/sda5 | grep name
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name:   icexmoon_ext4
[icexmoon@xyz ~]$ sudo mount -L icexmoon_ext4 /data/ext4
[icexmoon@xyz ~]$ df -h /data/ext4
文件系统        容量  已用  可用 已用% 挂载点
/dev/sda5       976M  2.6M  907M    1% /data/ext4

设置开机挂载

开机挂载

我们上边都是使用mount命令将文件系统手动挂载,通过这种方式挂载,在系统重启后就会失效,当然不能每次重启都手动重新挂载,我们可以通过修改/ext/fstab文件的方式实现系统启动后自动挂载。

在介绍之前,必须先再次明确一下文件系统挂载和卸载的一些原则:

  • 根目录/必须被挂载,且要在其他挂载点被挂载之前执行。
  • 作为挂载点的目录必须已经存在,且要遵守FHS的相关约定。
  • 一个挂载点在同一时间只能挂载一个文件系统。
  • 一个文件系统在同一时间只能被挂载到一个挂载点。
  • 如果要执行卸载,必须要确保当前工作目录在要被卸载的文件系统之外。

/etc/fstab(filesystem table)是一个系统配置文件,用于在系统开机的时候进行文件系统挂载。

[icexmoon@xyz ~]$ cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Sat Jul 24 14:32:58 2021
#
# 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/centos-root /                       xfs     defaults        0 0
UUID=3a6bd73c-8f36-4955-b079-b1e2501efc31 /boot                   xfs     defaults        0 0
/dev/mapper/centos-home /home                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0

可以看到目前系统启动后会自动挂载的有四个挂载点//boot/homeswap,且根目录在第一个会被挂载。

第一列是被挂载的设备。

可以看到默认的挂载方式是设备名称,也就是/dev/mapper/centos-root这种方式,此外也可以使用UUID进行挂载,比如UUID=3a6bd73c-8f36-4955-b079-b1e2501efc31,这也是推荐的方式,之前我们说过,UUID是和硬件绑定的,不会轻易改变,而设备名称就不一定了,比如多连接几个外接存储设备,其中某个原本是/dev/sdb的设备可能就变成/dev/sdc了。当然如果使用的是LVM分区卷则不会有这种问题,毕竟分区卷名称是自定义的,同样是固定值,比如上边的LVM分区/dev/mapper/centos-root,使用这种设备名称也同样没有上边的问题。除了设备名称和UUID,还可以使用Label进行挂载,方式是LABEL=XXX

第二列是挂载点,这个没什么好说的。

第三列是文件系统类型,包括xfsext4等,需要注意的是交换分区的文件系统类型就是swap

第四列是文件系统参数,包括以下选项:

参数意义
async/sync异步/同步,设置磁盘是否以异步方式运行!默认为 async(性能较佳)
auto/noauto自动/非自动,当使用mount -a 命令时,此文件系统是否会被主动测试挂载。默认为 auto
rw/ro读写/只读,如果以只读方式挂载,无论目录和文件权限如何,都不能写入数据
exec/noexec可执行/不可执行,如果设定为不可执行,其下所有文件都不能被执行,建议仅将此选项用于只包含数据(非可执行文件)的文件系统
user/nouser是否允许一般用户(非root)执行挂载操作,建议不要使用,不安全
suid/nosuid是否允许设置SUID属性
defaults同时具有rw, suid, dev, exec, auto, nouser, async 等参数,一般情况我们只需要使用这个参数即可

第五列,能否使用备份命令dump。目前有很多其他的备份工具,所以这里可以设置为0。

第六列,是否用fsck检查扇区。我们知道fsck仅对老式的ext文件系统有效,对xfs文件系统无效,且会拖慢系统启动时间,所以设置为0就可以了。

下面我们通过修改/etc/fstab来实现/dev/sda4的自动挂载。

在修改配置文件前我们要先确保目标文件系统出于卸载状态,如果没有,要进行卸载:

[icexmoon@xyz ~]$ df -h /dev/sda4
文件系统        容量  已用  可用 已用% 挂载点
/dev/sda4      1014M   33M  982M    4% /data/xfs
[icexmoon@xyz ~]$ sudo umount /data/xfs
[sudo] icexmoon 的密码:

然后我们要查询文件系统的UUID和类型,然后修改配置文件:

[icexmoon@xyz ~]$ blkid /dev/sda4
/dev/sda4: LABEL="icexmoon_xfs" UUID="3a8b7c86-e1b7-406b-a89c-721eed29febb" TYPE="xfs" PARTLABEL="Linux filesystem" PARTUUID="4dc7e438-ecbb-4fc2-8c67-a8f412aa3ffc"
[icexmoon@xyz ~]$ sudo nano /etc/fstab
[sudo] icexmoon 的密码:

修改/ext/fstab需要管理员权限,否则是不能保存修改的。

下面是我修改以后的/etc/fstab文件:

#
# /etc/fstab
# Created by anaconda on Sat Jul 24 14:32:58 2021
#
# 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
#
#filesystem name                                mount point             type    parameters
/dev/mapper/centos-root                         /                       xfs     defaults        0 0
UUID=3a6bd73c-8f36-4955-b079-b1e2501efc31       /boot                   xfs     defaults        0 0
/dev/mapper/centos-home                         /home                   xfs     defaults        0 0
/dev/mapper/centos-swap                         swap                    swap    defaults        0 0
UUID=3a8b7c86-e1b7-406b-a89c-721eed29febb       /data/xfs               xfs     defaults        0 0

这个文件本身只要求用空白符将每一列数据区分开就行了,并没有规定要使用几个空格或者制表符,如果你喜欢整洁,可以像我一样使用制表符将每一列对齐并用注释加上表头,有利于阅读。

最后使用mount -a命令通过配置文件让系统自动将没挂载的文件系统进行挂载:

[icexmoon@xyz ~]$ sudo mount -a
[icexmoon@xyz ~]$ sudo df /dev/sda4
文件系统         1K-块  已用    可用 已用% 挂载点
/dev/sda4      1038336 32992 1005344    4% /data/xfs

修改/etc/fstab后最好通过mount -a检测一下是否可以正确挂载,否则如果因为有问题导致重启后根目录都挂载不了就乐子大了。

特殊设备 loop 挂载

挂载镜像文件

在使用Windows的时候,如果需要使用ISO镜像文件,我们通常会用UltraISO之类的工具将其加载到虚拟光驱中然后进行后续操作,在Linux中我们同样可以实现类似的操作,并且不用借助额外的工具,使用mount命令就可以。

因为是虚拟机,所以需要先将实体机的镜像文件拖到虚拟机中。

如果你也使用的是VMware,只需要打开Linux上的资源管理器,然后拖拽进去就行了。

挂载方式很简单:

[icexmoon@xyz ~]$ sudo mount -o loop ~/下载/my_music.iso /data/cd
[sudo] icexmoon 的密码:
mount: /dev/loop0 写保护,将以只读方式挂载
[icexmoon@xyz ~]$ ls -al /data/cd/music/
总用量 851373
dr-xr-xr-x. 1 root root    14336 89 11:18 .
dr-xr-xr-x. 1 root root     2048 89 11:18 ..
-r-xr-xr-x. 1 root root  9711036 123 2020 Actium - Here With You.mp3
-r-xr-xr-x. 1 root root 10252755 123 2020 again.mp3
-r-xr-xr-x. 1 root root     8896 324 11:15 Alternative ending,ARM - チルノのパーフェクトさんすう教室.lrc
-r-xr-xr-x. 1 root root 12875222 123 2020 Alternative ending,ARM - チルノのパーフェクトさんすう教室.mp3
-r-xr-xr-x. 1 root root     3324 324 11:20 angela - 騎士行進曲.lrc
[icexmoon@xyz ~]$ sudo umount /data/cd

挂载大型文件

既然ISO文件可以被挂载,我们手动创建一个大文件并格式化后能不能被挂载?

答案是可以。

先需要通过dd命令创建一个大文件:

[icexmoon@xyz ~]$ sudo dd if=/dev/zero of=/srv/loopdev bs=1M count=512
[sudo] icexmoon 的密码:

记录了512+0 的读入
记录了512+0 的写出
536870912字节(537 MB)已复制,0.931258 秒,577 MB/秒
[icexmoon@xyz ~]$ ls -alh /srv/loopdev
-rw-r--r--. 1 root root 512M 89 15:12 /srv/loopdev

然后格式化为xfs文件系统:

[icexmoon@xyz ~]$ sudo mkfs.xfs -f /srv/loopdev
meta-data=/srv/loopdev           isize=512    agcount=4, agsize=32768 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=131072, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=855, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[icexmoon@xyz ~]$ sudo blkid /srv/loopdev
/srv/loopdev: UUID="1bbc8bd1-1244-4fa0-a424-b21d581fb762" TYPE="xfs"

手动挂载:

[icexmoon@xyz ~]$ sudo mkdir /data/file
[icexmoon@xyz ~]$ sudo mount -U 1bbc8bd1-1244-4fa0-a424-b21d581fb762 /data/file
[icexmoon@xyz ~]$ df /data/file
文件系统        1K-块  已用   可用 已用% 挂载点
/dev/loop0     520868 26436 494432    6% /data/file

添加自动挂载:

[icexmoon@xyz ~]$ sudo nano /etc/fstab
/srv/loopdev                                    /data/file              xfs     defaults        0 0
[icexmoon@xyz ~]$ sudo mount -a
[icexmoon@xyz ~]$ df /data/file
文件系统        1K-块  已用   可用 已用% 挂载点
/dev/loop0     520868 26436 494432    6% /data/file

这里需要注意的是大部分Linux都是通过block device查询设备的UUID的,所有对于挂载大型文件来说,在/dev/fstab中使用UUID进行挂载可能会出问题,所以这里使用文件路径比较靠谱。

内存交换分区(swap)的创建

老式的计算机内存很小,所以需要swap来起到虚拟内存的作用,但现在的电脑内存都很大,已经不太依赖swap了,但如果你的Linux创建后没有划分swap,可以通过以下的方式创建一个。

使用实体分区创建swap

创建swap分区有以下几个步骤:

  1. 使用gdisk划分出一个swap分区。
  2. 使用mkswap对分区进行格式化。
  3. 使用swapon命令启用swap分区。
  4. 通过freeswapon -s命令查看swap相关情况。

下面看实际操作:

[icexmoon@xyz ~]$ gdisk
GPT fdisk (gdisk) version 0.8.10

Type device filename, or press <Enter> to exit: /dev/sda
Problem opening /dev/sda for reading! Error is 13.
You must run this program as root or use sudo!
# 下面的分区过程省略,需要注意的是设备类型要设置为8200,即linux swap
Command (? for help): p
Disk /dev/sda: 83886080 sectors, 40.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 8B06235D-21F7-4581-8AB8-81469FD4654F
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 83886046
Partitions will be aligned on 2048-sector boundaries
Total free space is 13619133 sectors (6.5 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048            6143   2.0 MiB     EF02
   2            6144         2103295   1024.0 MiB  0700
   3         2103296        65026047   30.0 GiB    8E00
   4        65026048        67123199   1024.0 MiB  8300  Linux filesystem
   5        67123200        69220351   1024.0 MiB  0700  Microsoft basic data
   6        69220352        70268927   512.0 MiB   8200  Linux swap

Command (? for help): w
[icexmoon@xyz ~]$ sudo partprobe
[icexmoon@xyz ~]$ sudo lsblk
NAME            MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda               8:0    0    40G  0 disk
├─sda1            8:1    0     2M  0 part
├─sda2            8:2    0     1G  0 part /boot
├─sda3            8:3    0    30G  0 part
│ ├─centos-root 253:0    0    10G  0 lvm  /
│ ├─centos-swap 253:1    0     1G  0 lvm  [SWAP]
│ └─centos-home 253:2    0     5G  0 lvm  /home
├─sda4            8:4    0     1G  0 part /data/xfs
├─sda5            8:5    0     1G  0 part /data/ext4
└─sda6            8:6    0   512M  0 part
sr0              11:0    1 831.6M  0 rom
loop0             7:0    0   512M  0 loop /data/file
[icexmoon@xyz ~]$ sudo mkswap /dev/sda6
正在设置交换空间版本 1,大小 = 524284 KiB
无标签,UUID=a734bbba-18d6-4c15-8757-250c7d4fcfdf
[icexmoon@xyz ~]$ sudo blkid /dev/sda6
/dev/sda6: UUID="a734bbba-18d6-4c15-8757-250c7d4fcfdf" TYPE="swap" PARTLABEL="Linux swap" PARTUUID="61a9103b-9817-48f5-8b47-8c0fc6ba59ab"
[icexmoon@xyz ~]$ free -h
              total        used        free      shared  buff/cache   available
Mem:           972M        414M        200M        9.4M        357M        405M
Swap:          1.0G         46M        977M
[icexmoon@xyz ~]$ sudo swapon /dev/sda6
[icexmoon@xyz ~]$ free -h
              total        used        free      shared  buff/cache   available
Mem:           972M        415M        199M        9.4M        357M        404M
Swap:          1.5G         46M        1.5G
[icexmoon@xyz ~]$ swapon -s
文件名                          类型            大小    已用    权限
/dev/dm-1                               partition       1048572 47360   -2
/dev/sda6                               partition       524284  0       -3

使用文件创建swap

类似于使用大文件挂载,我们同样可以使用大文件作为swap。

[icexmoon@xyz ~]$ sudo dd if=/dev/zero of=/tmp/swap bs=1M count=128
[sudo] icexmoon 的密码:
记录了128+0 的读入
记录了128+0 的写出
134217728字节(134 MB)已复制,0.20171 秒,665 MB/秒
[icexmoon@xyz ~]$ ls -al /tmp/swap
-rw-r--r--. 1 root root 134217728 89 15:45 /tmp/swap
[icexmoon@xyz ~]$ sudo mkswap /tmp/swap
正在设置交换空间版本 1,大小 = 131068 KiB
无标签,UUID=11baff7c-3801-4eec-b317-349bf82291be
[icexmoon@xyz ~]$ sudo swapon /tmp/swap
swapon: /tmp/swap:不安全的权限 0644,建议使用 0600。
[icexmoon@xyz ~]$ sudo swapoff /tmp/swap
[icexmoon@xyz ~]$ swapon -s
文件名                          类型            大小    已用    权限
/dev/dm-1                               partition       1048572 47360   -2
/dev/sda6                               partition       524284  0       -3
/tmp/swap                               file    131068  0       -4
[icexmoon@xyz ~]$ sudo nano /etc/fstab
[icexmoon@xyz ~]$ swapon -s
文件名                          类型            大小    已用    权限
/dev/dm-1                               partition       1048572 47016   -2
/dev/sda6                               partition       524284  0       -3
[icexmoon@xyz ~]$ sudo mount -a
[icexmoon@xyz ~]$ swapon -s
文件名                          类型            大小    已用    权限
/dev/dm-1                               partition       1048572 47016   -2
/dev/sda6                               partition       524284  0       -3

在这里我遇到了一个和原作者不一样的地方,虽然我修改了/etc/fstab,添加了swap分区的相关自启动设置,但是使用swapoff命令关闭相应的swap分区后执行mount -a并不会自动加载swap分区,但是重启系统后是会自动加载相应的swap分区的,不知道这是不是因为CentOS7.9与之前的版本有差别导致的。

这部分内容总结完了,真累,谢谢阅读。

至于为啥还没发4就已经到5了,别问,问就是我忘了…

  • 0
    点赞
  • 1
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:精致技术 设计师:CSDN官方博客 返回首页
评论

打赏作者

魔芋红茶

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值