我们知道,对于一个新的存储设备,无论是移动硬盘还是U盘,在第一次连接电脑后一般都会提示要格式化后使用,那格式化是做什么用的呢?
简单来说,每种操作系统都有独特的数据存储和组织方式,也就是所谓的“文件系统”,而格式化就是将空白存储器,或者说非当前操作系统支持的文件系统格式转化为支持的一种文件系统格式的过程。虽然这么说有点拗口,但意思应该还是比较明确的。
所以说存储器只有经过格式化以后才能正常挂载到操作系统中供操作系统使用。
一般来说文件系统由以下几部分组成:
这里的文件属性指读写权限、拥有者、所属组以及修改时间等非文件内容的相关信息。
虽然大部分文件系统都由这几部分构成,但在实现上有所不同,比如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)。
上边说了,ext2的文件系统是分为超级区块、inode和block的,具体到实际操作,因为即使是单个分区而非整块磁盘,也可能容量巨大,所以ext2文件系统会将一个分区划分为多个区块群组(block group)进行管理,每个区块群组会有各自的inode、block和超级区块(见图7.1.3)。
(图片用自鸟哥的私房菜)
ext2的block有1k、2k和4k三种大小,且在格式化的时候就会确定下来,不可更改。
此外,ext2的block还有以下限制:
因为ext2的block有如上特性,所以对于大型文件存储来说,如果ext2的区块太小,存储单个大型文件就会占用很多个区块,inode也需要记录多个区块的编号,这可能会影响到文件系统的读写性能。
之前说了,inode记录文件属性,具体包括以下数据:
与block类似,inode的大小和数量也是在格式化的时候就确定了的,除此以外还具有以下特点:
之前说了,单个文件最多也只会有一个inode,可能会有比较机灵的人会质疑,单个inode大小有限,如果某个大文件占用很多个区块,导致其inode需要存储的block编号过多,超过了单个inode大小怎么办。
其实不用担心,并非所有的inode–>block指向都是直接指向,如果占用的block过多,inode会间接指向一个记录了实际block编号的block,用这种间接指向的方式来记录超过自身容量的block编号,在此基础上甚至还可以双间接或三间接(也就是提升间接的层次),所以无论是关联多少个block编号,无论多大的文件,都是可以用一个inode完成记录的(可以参考图7.1.4)。
(图片引用自鸟哥的私房菜)
超级区块记录了整个文件系统的相关信息,具体包括:
虽然我们上边说过,在实际中一个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读取的时候,操作系统发现你并没有相应的权限,就会终止整个行为。
这也就是为什么有时候明明我们拥有某个文件的读写权限,但是不能操作,这很可能是因为缺少其父目录的权限导致的。
前面我们说了文件系统中的文件读取操作,对于写入操作,文件系统需要执行以下步骤:
就像上面展示的那样,实际使用文件系统的时候,每个新建文件或者修改文件都涉及到多个地方数据的修改,一旦没有得到完整执行,比如使用了某个inode或者多个block的时候还没来得及更新超级区块就断电关机了,就会导致文件系统出现错误,即超级区块的记录与实际使用情况不一致。
在这时候就必须进行数据一致性检查,但是传统的文件系统,如ext2,对所有数据进行一致性检查极其耗费时间,所以就产生了新的日志式文件系统。
日志式文件系统的核心思想是如果进行类似的新建或修改等影响到多个地方数据同步的操作,就在执行的同时在相应的日志中添加一条记录,记录对某某文件执行某某操作,如果完整执行了操作,就消除该记录,如果没有,在我们进行数据一致性检查的时候就只要检查相应的日志即可,就可以快速发现问题并处理,并不需要检查文件系统上的所有数据,自然修复速度也就快的多。
具体分为以下步骤:
在使用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系统支持哪些文件系统,可以:
[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的内核功能读取具体的文件系统(可以视作不同文件系统的兼容层)。
可以参考下图:
(图片引用自鸟哥的私房菜)
之前介绍ext2的时候我们说过,ext2会在格式化的时候就确定所有的inode与block,自然也就需要对所有空间进行初始化工作,这就意味着超长时间的格式化,分区的容量越大就需要越久。
和ext2相比,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
写作登录区,我认为是翻译错误,这里和登录不搭边,应当是日志区。
[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
(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% /
我们之前说过,使用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)命令创建链接。
为某个文件创建一个硬链接指在某个目录下创建一个文件名,并指向该文件的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。至于第二条,解释起来就很麻烦了,还是只要记住这个限制就好…
符号链接是建立一个独立文件,并通过这个文件指向原文件的文件名。
可以用下图表示:
(图片引用自鸟哥的私房菜)
符号链接无论在实现还是功能上,都几乎和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
(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
输出的信息包括以下内容:
从上边的输出可以看到,我们当前的系统使用了一个磁盘sda
,具体划分了三个分区,sda1
是磁盘的启动引导分区,sda2
是我们的系统加载分区,挂载在/boot
下,sda3
是一个LVM组分区,我们在sda3
下边划分了具体的几个LVM,其中centos-root
挂载在/
下,centos-swap
是一个交换分区,centos-home
挂载在/home
下,从几个LVM的容量可知,整个LVM组sda3
还有14G的空间剩余,没有划分。
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
命令用于列出磁盘的分区表类型和分区信息。
[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
分区。
因为我的磁盘是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
是一个交互式的工具,进入后可以执行一系列命令进行操作,有这么几个比较常用:
最后的部分打印了sda磁盘的分区情况,具体包含以下信息:
/dev/sda1
这里可以看出两个关键:
last usable sector is 83886046
说明最大可用分区是83886046,但是分区3仅使用到65026047
,这说明已有的三个分区并没有把磁盘占满,磁盘还有未分配的可用空间。下面实际使用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
(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
可以看到新建的分区被正常加载。
[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
的使用方式与gdisk
类似,且现在MBR分区使用较少,所以这里不作过多介绍。
现在我们已经创建了两个新的分区,但是并不能直接挂载到文件系统中使用,因为我们还没有对分区进行格式化。
格式化分区的命令为mkfs
(make filesystem),这是一个综合命令,支持多种文件系统。
对于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
。
类似的,我们可以使用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
命令用于修复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
参数。
文件系统挂载应该遵循以下原则:
最后一条并非一定不能违反,但是最好如此,因为如果是对非空目录进行挂载,在挂载完文件系统后原目录下的东西就看不到了,就像被挂载的文件系统屏蔽了一样,之后卸载文件系统后才能再出现。
操作系统中有这么几个文件与文件挂载相关:
[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和另一台机器上的完全相同,而设备名称就不一定了。
因为我这里已经把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 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盘的文件系统要是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
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
是设备类型。
如果我们想修改已存在的分区的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进行自动加载,也应当一并修改。
前面介绍的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
文件的方式实现系统启动后自动挂载。
在介绍之前,必须先再次明确一下文件系统挂载和卸载的一些原则:
/
必须被挂载,且要在其他挂载点被挂载之前执行。/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
检测一下是否可以正确挂载,否则如果因为有问题导致重启后根目录都挂载不了就乐子大了。
在使用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了,但如果你的Linux创建后没有划分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。
[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与之前的版本有差别导致的。
这部分内容总结完了,真累,谢谢阅读。
至于为啥还没发4就已经到5了,别问,问就是我忘了…
文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态
文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境
文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn
文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker
文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机
文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk
文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入
文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。 Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。
文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动
文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计
文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;gt;Jni-&amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图
文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法