我们接着第一篇文章讲起。
文件系统挂载与卸载
创建完文件系统,我们需要将新建的文件系统挂载到根文件系统上的某个目录上,进而我们便可以通过该目录来访问该文件系统。建立这种关联关系的过程称为挂载,所挂载的目录称为挂载点;若解除这种关联关系,则称之为卸载;
由于在某一目录下挂在新设备后,该目录原有文件会被临时隐藏,因此要尽量以空目录作为挂载点;
mount 将设备挂载到挂载点(mount point)
用法
~]# mount
通过读取/etc/fstab文件中的信息,来显示当前系统已挂载的所有设备;
~]# mount [option] Device Mount_Point
将文件系统挂载到根文件系统的目录下;
~]# cat /proc/mounts
上述关键字进行解读:
Device:挂载设备,包括:
(1)设备文件:如/dev/sdb1
(2)卷标:-L LABEL ,例如 -L MYDATA
(3)UUID:-U uuid ,例如 -U cc6ed223-ea32-459d-b639-f77e8da35b72
(4)伪文件系统名称:proc,sysfs,devtmpfs,configfs
Mount_Point:挂载点,建议使用空目录
选项
- -t VFS_TYPE 指定Device的文件系统类型,可省略
- -r 只读挂载,即 readonly
- -w 读写挂载,即 read and write
- -a 自动挂载;所有支持自动挂载的设备,所谓支持自动挂载,就是定义在/etc/fstab文件中,且挂载选项中有自动挂载功能
- -n 不更新/etc/fstab,这是由于挂载一个新文件系统,会在/etc/fstab中添加信息,卸载一个文件系统,则会删除掉该文件中的信息;
- -L LABEL 以卷标指定Device
- -U UUID 以UUID指定Device
- -B ,–bind 绑定目录到另一个目录上
示例:
首先,格式化分区/dev/sdb1,文件系统类型为ext4,block大小为2048b,卷标为MYDATA,为每3个块创建一个inode;
[root@localhost mysdb1]# mke2fs -t ext4 -b 2048 -L MYDATA -m 3 /dev/sdb1
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=MYDATA
OS type: Linux
Block size=2048 (log=1)
Fragment size=2048 (log=1)
Stride=0 blocks, Stripe width=0 blocks
131072 inodes, 1048576 blocks
31457 blocks (3.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=269484032
64 block groups
16384 blocks per group, 16384 fragments per group
2048 inodes per group
Superblock backups stored on blocks:
16384, 49152, 81920, 114688, 147456, 409600, 442368, 802816
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
[root@localhost mysdb1]# mount /dev/sdb1 /mydata
[root@localhost mysdb1]# mount
……
……
gvfsd-fuse on /run/user/1000/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)
/dev/sdb1 on /mydata type ext4 (rw,relatime,seclabel,data=ordered)
然后,我们卸载了/dev/sdb1
[root@localhost mysdb1]# umount /dev/sdb1
[root@localhost mysdb1]# mount
……
……
……
gvfsd-fuse on /run/user/1000/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)
这次,我们根据卷标(-L MYDATA)指定的设备进行只读(-r)挂载:
[root@localhost mysdb1]# blkid /dev/sdb1
/dev/sdb1: LABEL="MYDATA" UUID="baff75a8-916c-42d9-b395-7086d3a63f6a" TYPE="ext4"
[root@localhost mysdb1]# mount -L MYDATA -r /mydata
[root@localhost mysdb1]# mount
……
……
gvfsd-fuse on /run/user/1000/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)
/dev/sdb1 on /mydata type ext4 (ro,relatime,seclabel,data=ordered)
mount还有一个特殊的用法:
~]# mount -o [option] /dev/Dvice Mount_Point
多个选项用逗号,
隔开
option:
- async/sync 指定异步模式/同步模式;cow 即(Copy on Write)写时复制,要操作磁盘上的数据时,需要复制一份原数据单独处理;在同步模式下,处理数据方式是边写边存,所以I/O速度很慢,但可靠性高;在异步模式下,则会写完再存,I/O速度相对快一些,但可靠性较低;
- atime/noatime 是否更新文件访问时间
- diratime/nodiratime 是否更新目录的访问时间(包含于上一选项)
- auto/noauto 是否支持自动挂载
- exec/noexec 是否支持将文件系统商的应用程序执行为进程
- dev/nodev 是否支持在此文件系统上使用设备文件
- suid/nosuid 是否允许文件拥有suid权限
- remount 重新挂载
- ro 只读挂载
- rw 读写挂载
- user/nouser 是否允许普通用户挂载此设备
- acl 启用此文件系统上的acl功能
在不进行指定时,其默认挂载选项为defaults,即 rw,suid,dev,exec,auto,nouser,async
示例:
重新进行读写挂载/dev/sdb1,可以通过指定挂载点重新挂载,也可以指定设备重新挂载,
[root@localhost mysdb1]# mount -o remount,rw /mydata
[root@localhost mysdb1]# mount
……
……
/dev/sdb1 on /mydata type ext4 (rw,relatime,seclabel,data=ordered)
挂载交换分区
swapon 启用交换分区
用法:
~]# swapon [option], Device
选项:
- -a 激活所有交换分区
- -p PRIORITY 指定优先级
swapoff 禁用交换分区
存储状态信息查看
free 内存使用状态
用法
~]# free [option]
选项
- -m 以MB为单位显示
- -G 以GB为单位显示
示例:
[root@localhost mysdb1]# free -m
total used free shared buff/cache available
Mem: 974 633 118 10 222 126
Swap: 2047 298 1749
df 文件系统空间使用状态信息查看
用法
~]# df [option]
查看所有文明系统的空间使用状态
~]# df [option] /dev/Device
查看指定设备文件系统的空间使用状态
选项
- -h 即 human-readable,以用户可读的方式显示
- -i 显示inode使用情况(而不是磁盘块)
- -P 以Posix兼容的格式输出,每条信息都作为一行显示,无论该条信息有多长
示例1:
[root@localhost mysdb1]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda3 18555904 5184072 13371832 28% /
devtmpfs 483160 0 483160 0% /dev
tmpfs 498972 0 498972 0% /dev/shm
tmpfs 498972 14936 484036 3% /run
tmpfs 498972 0 498972 0% /sys/fs/cgroup
/dev/sda1 303780 193696 110084 64% /boot
tmpfs 99796 36 99760 1% /run/user/1000
/dev/sdb1 1998538 9236 1918196 1% /mydata
示例2:
[root@localhost mysdb1]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 18G 5.0G 13G 28% /
devtmpfs 472M 0 472M 0% /dev
tmpfs 488M 0 488M 0% /dev/shm
tmpfs 488M 15M 473M 3% /run
tmpfs 488M 0 488M 0% /sys/fs/cgroup
/dev/sda1 297M 190M 108M 64% /boot
tmpfs 98M 36K 98M 1% /run/user/1000
/dev/sdb1 2.0G 9.1M 1.9G 1% /mydata
示例3:
[root@localhost mysdb1]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda3 9283072 167937 9115135 2% /
devtmpfs 120790 415 120375 1% /dev
tmpfs 124743 1 124742 1% /dev/shm
tmpfs 124743 942 123801 1% /run
tmpfs 124743 16 124727 1% /sys/fs/cgroup
/dev/sda1 153600 338 153262 1% /boot
tmpfs 124743 20 124723 1% /run/user/1000
/dev/sdb1 131072 11 131061 1% /mydata
示例4:
[root@localhost mysdb1]# df -h /dev/sda1
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 297M 190M 108M 64% /boot
du 查看某目录下空间使用情况
用法
~]# du [option] Directory
选项
- -h 即 human-readable,同上
- -s 显示总体空间占用大小的总和summary
示例1:
[root@localhost mysdb1]# du -h /etc
16K /etc/fonts/conf.d
24K /etc/fonts
12K /etc/pki/rpm-gpg
0 /etc/pki/ca-trust/source/anchors
0 /etc/pki/ca-trust/source/blacklist
4.0K /etc/pki/ca-trust/source
204K /etc/pki/ca-trust/extracted/java
376K /etc/pki/ca-trust/extracted/openssl
568K /etc/pki/ca-trust/extracted/pem
1.2M /etc/pki/ca-trust/extracted
1.2M /etc/pki/ca-trust
0 /etc/pki/java
12K /etc/pki/tls/certs
24K /etc/pki/tls/misc
0 /etc/pki/tls/private
48K /etc/pki/tls
124K /etc/pki/nssdb
……
……
……
示例2:
[root@localhost mysdb1]# du -s /etc
41384 /etc
[root@localhost mysdb1]# du -sh /etc
41M /etc
文件系统挂载的配置文件/etc/fstab
文件系统挂载时,都会在文件/etc/fstab 中定义一条信息;在开机时,系统会根据此文件进行加载,因此,我们若想开机自动加载某个文件系统,则必须将其写入/etc/fstab中。
/etc/fstab 中每一条信息包括以下字段:
要挂载的设备或伪文件系统
设备文件名称;LABEL(LABEL=" “);UUID(UUID=” ");伪文件系统名称(proc,sysfs)
挂载点
文件系统类型
挂载选项
转储频率
0:不做备份
1:每天转储
2:每隔一天转储自检次序
0:不自检
1:首先自检,一般只有根文件系统才用1
文件系统的其他概念
超级块:保存整个文件系统分配的块组数目、每个块组中的块数、已用块数、空闲块数等信息;
GDT:位于每个块组中,保存块组的更为详细的信息,如校验码、空闲inode等信息;
Inode:即Index node,索引节点,保存文件的元数据;作为地址指针,可为直接指针、间接指针或三级指针;
Inode bitmap:对“位”标识每一个Inode的占用情况,每一位对应一个Inode;
block:bitmap:对“位”标识每一个block的占用情况,每一位对应一个block;
目录:保存文件名与Inode的对应关系;
下图为文件系统及其中块组的示意图:
假设我们要找到/var/log/messages:
1,首先默认内核已知根目录/的Inode号;所以我们可到元数据区的Inode Table中找到根目录/对应的Inode,根据Inode找到根目录/中数据所在磁盘块(block)从而找到根目录下各子目录/文件与其Inode的对应关系;
2,我们在根目录下找到子目录/var对应的Inode号,然后再次进入元数据区的Inode Table中查找目录/var所在的磁盘块,然后便找到了/var目录下各子目录/文件与其Inode的对应关系;
3,同理,我们可以找到/var/log下的子目录或文件的对应的Inode号,也即找到了messages对应的Inode号,从而在数据区可以找到文件messages所在的磁盘块,从而获得其数据;
硬链接
所谓硬链接,就是指向同一个Inode的不同路径;但不能对目录创建硬链接,也不能跨分区创建硬链接;一个Inode可能有很多个硬链接,假设某个Inode有5个硬链接,也就是说,有五个不同的路径都能到达该Inode,删除其中一个,则路径就少了一个,那么硬链接数也会减一;如果删除5个,则没有路径能到达此文件对应的Inode,硬链接数减为0,就意味着此文件被删除了。而此时,Inode bitmap中此Inode的对应位(标识此Inode的使用状态)会置0,表示此Inode空闲,未被占用,同样的,此Inode所管理的多个block也是空闲的,所以,其对应的block bitmap也会被置0。
符号链接(软链接)
所谓符号链接,也称软连接,指向一个"表示路径的字符串",且链接大小即为字符串大小;可以对目录创建符号链接,也可以跨分区;
ln 创建链接
用法
~]# ln SRC DEST
创建硬链接
~]# ln -s SRC DEST
创建符号链接
选项
- -v 即 verbose ,显示过程
示例1:
创建硬链接:首先查看当前目录下文件信息,hello的硬链接次数为1,hardwares的硬链接次数为3;
[root@localhost work]# ls -l
total 0
drwxr-xr-x. 3 root root 29 Oct 4 23:26 hardwares
-rwxrw-rw-. 1 jeffrey root 0 Sep 10 04:17 hello
由于不能为目录创建硬链接,因此,我们就为hello创建一个硬链接mylink
[root@localhost work]# ln hello mylink
分别查看hello的硬链接数为增加为2;
[root@localhost work]# ls -l
total 0
drwxr-xr-x. 3 root root 29 Oct 4 23:26 hardwares
-rwxrw-rw-. 2 jeffrey root 0 Sep 10 04:17 hello
-rwxrw-rw-. 2 jeffrey root 0 Sep 10 04:17 mylink
我们查看其Inode号,文件hello的Inode与文件mylink相同,均为37304325;
[root@localhost work]# ls -i
52092242 hardwares 37304325 hello 37304325 mylink
示例2
为hello创建符号链接symbollink;
[root@localhost work]# ln -s hello symbollink
[root@localhost work]# ls -l
total 8
drwxr-xr-x. 3 root root 29 Oct 4 23:26 hardwares
-rwxrw-rw-. 2 jeffrey root 39 Oct 4 23:33 hello
-rwxrw-rw-. 2 jeffrey root 39 Oct 4 23:33 mylink
lrwxrwxrwx. 1 root root 5 Oct 4 23:40 symbollink -> hello
[root@localhost work]# cat hello
hello world!
hello world!
hello workd!
[root@localhost work]# cat symbollink
hello world!
hello world!
hello workd!