我们接着第一篇文章讲起。

文件系统挂载与卸载

创建完文件系统,我们需要将新建的文件系统挂载到根文件系统上的某个目录上,进而我们便可以通过该目录来访问该文件系统。建立这种关联关系的过程称为挂载,所挂载的目录称为挂载点;若解除这种关联关系,则称之为卸载;

由于在某一目录下挂在新设备后,该目录原有文件会被临时隐藏,因此要尽量以空目录作为挂载点;


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的对应关系;

下图为文件系统及其中块组的示意图:

linux磁盘与文件系统管理的那些事儿(2)-LMLPHP

linux磁盘与文件系统管理的那些事儿(2)-LMLPHP

假设我们要找到/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!
10-05 14:53