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之类的文件系统的执行效率。
(图片引用自)
在分类上,ext2这种inode记录所有关联block的文件系统称作索引式文件系统(indexed allocation)。
Linux 的 ext2 文件系统(inode)
上边说了,ext2的文件系统是分为超级区块、inode和block的,具体到实际操作,因为即使是单个分区而非整块磁盘,也可能容量巨大,所以ext2文件系统会将一个分区划分为多个区块群组(block group)进行管理,每个区块群组会有各自的inode、block和超级区块(见图7.1.3)。
(图片用自)
数据区块
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)。
(图片引用自)
超级区块
超级区块记录了整个文件系统的相关信息,具体包括:
-
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 8月 8 15:01 .
64 drwxr-xr-x. 3 root root 22 7月 24 14:45 ..
75 -rw-------. 1 icexmoon icexmoon 860 8月 7 15:09 .bash_history
68 -rw-r--r--. 1 icexmoon icexmoon 18 4月 1 2020 .bash_logout
69 -rw-r--r--. 1 icexmoon icexmoon 193 4月 1 2020 .bash_profile
70 -rw-r--r--. 1 icexmoon icexmoon 231 4月 1 2020 .bashrc
此外我们还可以观察目录的大小:
[icexmoon@xyz ~]$ ls -ldh / /boot /usr/sbin /proc /sys
dr-xr-xr-x. 17 root root 224 7月 24 14:45 /
dr-xr-xr-x. 5 root root 4.0K 7月 24 14:47 /boot
dr-xr-xr-x. 227 root root 0 8月 8 15:00 /proc
dr-xr-xr-x. 13 root root 0 8月 8 15:00 /sys
dr-xr-xr-x. 2 root root 20K 7月 24 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 7月 24 14:45 /
64 dr-xr-xr-x. 5 root root 4096 7月 24 14:47 /boot
64 drwxr-xr-x. 3 root root 22 7月 24 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 10月 20 2020 binfmt_misc.ko.xz
drwxr-xr-x. 2 root root 25 7月 24 14:35 btrfs
drwxr-xr-x. 2 root root 30 7月 24 14:35 cachefiles
drwxr-xr-x. 2 root root 24 7月 24 14:35 ceph
drwxr-xr-x. 2 root root 24 7月 24 14:35 cifs
drwxr-xr-x. 2 root root 26 7月 24 14:35 cramfs
drwxr-xr-x. 2 root root 23 7月 24 14:35 dlm
drwxr-xr-x. 2 root root 26 7月 24 14:35 exofs
drwxr-xr-x. 2 root root 24 7月 24 14:35 ext4
drwxr-xr-x. 2 root root 60 7月 24 14:35 fat
drwxr-xr-x. 2 root root 27 7月 24 14:35 fscache
drwxr-xr-x. 2 root root 42 7月 24 14:35 fuse
drwxr-xr-x. 2 root root 24 7月 24 14:35 gfs2
drwxr-xr-x. 2 root root 25 7月 24 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的内核功能读取具体的文件系统(可以视作不同文件系统的兼容层)。
可以参考下图:
(图片引用自)
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 8月 6 17:56 .
drwxrwxrwt. 22 root root 4096 8月 8 16:55 ..
-rwxr-xr-x. 1 icexmoon icexmoon 0 8月 6 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 8月 8 16:55 .
16797768 drwxrwxrwt. 22 root root 4096 8月 8 16:55 ..
26833311 -rwxr-xr-x. 2 icexmoon icexmoon 0 8月 6 17:56 test_link.py
26833311 -rwxr-xr-x. 2 icexmoon icexmoon 0 8月 6 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]$
可以看到,修改了硬链接文件的内容,原文件也同样发生了改变。
硬链接与原文件的关系可以用以下图表示:
(图片引用自)
硬链接最大的好处是安全,我们通过硬链接多保留了一份对原始数据inode的引用,也就意味着即使原文件被删除,只要还存在一个硬链接,就可以通过这个硬链接对数据进行访问。从这个角度上讲,硬链接其实已经很原始文件的那个引用没有什么区别了,它们都可以代表对真实数据的正式引用。
这里来实际测试一下:
[icexmoon@xyz test]$ rm -f test.py
[icexmoon@xyz test]$ ls -ail test*
26833311 -rwxr-xr-x. 1 icexmoon icexmoon 23 8月 8 16:59 test_link.py
[icexmoon@xyz test]$ cat test_link.py
print("hellow world!")
可以看到,虽然删除了“原文件”,硬链接的链接数也变成了1,但是并不影响文件的读取。
总的来说,硬链接的本质就是通过在目录下添加一个文件名对具体数据的inode进行指向,并不会增加新的inode和block。
硬链接虽然很棒,但是又一些限制:
-
不能跨文件系统
-
不能连接目录
第一条很好理解,既然是通过对inode的引用来添加硬链接,自然不能跨文件系统,每个文件系统的inode编号是自成一体的,不能引用别的文件系统的inode。至于第二条,解释起来就很麻烦了,还是只要记住这个限制就好......
符号链接(Symbolic Link)
符号链接是建立一个独立文件,并通过这个文件指向原文件的文件名。
可以用下图表示:
(图片引用自)
符号链接无论在实现还是功能上,都几乎和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 8月 8 17:19 .
16797768 drwxrwxrwt. 22 root root 4096 8月 8 17:18 ..
26833311 -rwxr-xr-x. 1 icexmoon icexmoon 23 8月 8 16:59 test_link.py
26833305 lrwxrwxrwx. 1 icexmoon icexmoon 12 8月 8 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 8月 8 17:20 .
16797768 drwxrwxrwt. 22 root root 4096 8月 8 17:20 ..
26833305 lrwxrwxrwx. 1 icexmoon icexmoon 12 8月 8 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镜像关联到虚拟机光驱。
设置好后点右小角的光驱图标进行连接即可。
[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 8月 9 11:18 .
dr-xr-xr-x. 1 root root 2048 8月 9 11:18 ..
-r-xr-xr-x. 1 root root 9711036 12月 3 2020 Actium - Here With You.mp3
-r-xr-xr-x. 1 root root 10252755 12月 3 2020 again.mp3
-r-xr-xr-x. 1 root root 8896 3月 24 11:15 Alternative ending,ARM - チルノのパーフェクトさんすう教室.lrc
-r-xr-xr-x. 1 root root 12875222 12月 3 2020 Alternative ending,ARM - チルノのパーフェクトさんすう教室.mp3
-r-xr-xr-x. 1 root root 3324 3月 24 11:20 angela - 騎士行進曲.lrc
-r-xr-xr-x. 1 root root 11508174 12月 3 2020 angela - 騎士行進曲.mp3
-r-xr-xr-x. 1 root root 1966 3月 24 11:25 bassy_ 茶太 - 夕日.lrc
-r-xr-xr-x. 1 root root 7853135 12月 3 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 8月 9 11:08 /dev/sda
brw-rw----. 1 root disk 8, 1 8月 9 11:08 /dev/sda1
brw-rw----. 1 root disk 8, 2 8月 9 11:08 /dev/sda2
brw-rw----. 1 root disk 8, 3 8月 9 11:08 /dev/sda3
brw-rw----. 1 root disk 8, 4 8月 9 11:08 /dev/sda4
brw-rw----. 1 root disk 8, 5 8月 9 11:08 /dev/sda5
这里打印出的8
就是主要设备代码(Major),0~5是次要设备代码(Minor),常见的设备名对应的设备代码如下:
磁盘设备名 | 主要设备代码 | 次要设备代码 |
---|---|---|
/dev/sda | 8 | 0~15 |
/dev/sdb | 8 | 16~31 |
/dev/loop0 | 7 | 0 |
/dev/loop1 | 7 | 1 |
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 8月 9 11:08 /dev/sda
brw-rw----. 1 root disk 8, 1 8月 9 11:08 /dev/sda1
brw-r--r--. 1 root root 8, 10 8月 9 11:50 /dev/sda10
brw-rw----. 1 root disk 8, 2 8月 9 11:08 /dev/sda2
brw-rw----. 1 root disk 8, 3 8月 9 11:08 /dev/sda3
brw-rw----. 1 root disk 8, 4 8月 9 11:08 /dev/sda4
brw-rw----. 1 root disk 8, 5 8月 9 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
命令中,小写的l
和u
将输出xfs文件系统的Label和UUID,大写的L
和U
将修改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
、/home
、swap
,且根目录在第一个会被挂载。
第一列是被挂载的设备。
可以看到默认的挂载方式是设备名称,也就是/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
。
第二列是挂载点,这个没什么好说的。
第三列是文件系统类型,包括xfs
、ext4
等,需要注意的是交换分区的文件系统类型就是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 8月 9 11:18 .
dr-xr-xr-x. 1 root root 2048 8月 9 11:18 ..
-r-xr-xr-x. 1 root root 9711036 12月 3 2020 Actium - Here With You.mp3
-r-xr-xr-x. 1 root root 10252755 12月 3 2020 again.mp3
-r-xr-xr-x. 1 root root 8896 3月 24 11:15 Alternative ending,ARM - チルノのパーフェクトさんすう教室.lrc
-r-xr-xr-x. 1 root root 12875222 12月 3 2020 Alternative ending,ARM - チルノのパーフェクトさんすう教室.mp3
-r-xr-xr-x. 1 root root 3324 3月 24 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 8月 9 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分区有以下几个步骤:
-
使用
gdisk
划分出一个swap分区。 -
使用
mkswap
对分区进行格式化。 -
使用
swapon
命令启用swap分区。 -
通过
free
和swapon -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 8月 9 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与之前的版本有差别导致的。
这部分内容总结完了,真累,谢谢阅读。
文章评论