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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/rdgfdd/article/details/82941845

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

文件系统挂载与卸载

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

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


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)

umount 卸载已经挂载的文件系统


用法1:根据挂载设备名来进行卸载

~]# umount /dev/Device

用法2:根据挂载点进行卸载

~]# umount Mount_Point

在卸载时,很可能该文件系统正在被访问,因此我们可以将所有访问该文件系统的进程全部终止,然后再卸载:

~]# fuer -v Mount_Point
查看挂载点所挂载的文件系统上正在执行的进程;

~]# fuer -km Mount_Point
终止所有正在访问该挂载点上文件系统的进程

挂载交换分区


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!

下面是一些练习来巩固今天所学内容:

1,创建一个20G的文件系统,块大小为2048,文件系统为ext4,卷标为TEST,要求此分区开机后自动挂载到/testing目录且默认有acl挂载选项;

首先,划分20G大小的分区;

[root@localhost ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): p

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x905e52a2

   Device Boot      Start         End      Blocks   Id  System

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-41943039, default 2048): 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +41940000
Partition 1 of type Linux and of size 20 GiB is set

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.

然后,在此分区上创建文件系统;

[root@localhost ~]# mke2fs -t ext4 -b 2048 -L TEST /dev/sdb1
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=TEST
OS type: Linux
Block size=2048 (log=1)
Fragment size=2048 (log=1)
Stride=0 blocks, Stripe width=0 blocks
1310720 inodes, 10485000 blocks
524250 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=278921216
640 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, 1327104, 
	2048000, 3981312, 5619712, 10240000

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): y
done

最后,在/etc/fstab中写入新建文件系统的信息,开机后才能自动挂载:

 LABEL=TEST  /testing ext4 defaults  0 0

2,创建一个5G的文件系统,卷标为HUGE,要求此分区开机自动挂载到/mogdata目录,文件系统类型为ext3;

方法与上述类似;

3,写一个脚本,完成如下功能:
(1)列出当前系统识别到的所有磁盘设备
(2)若磁盘数量为1,则显示其空间使用信息;否则,显示最后一个磁盘上的空间使用信息;

首先,我们写一个脚本test9.sh,内容如下:

#!/bin/bash
#
num=$(fdisk -l /dev/[sh]d[a-z] | grep "^Disk /dev/[sh]d[a-z]" | wc -l)
if [ $num -eq 1 ];then
	fdisk -l /dev/[sh]da
else
	fdisk -l $(fdisk -l /dev/[sh]d[a-z] | grep -o  "^Disk /dev/[sh]d[a-z]" | tail -1 | cut -d' ' -f2)
fi

接着,我们执行此脚本:

[root@localhost jeffrey]# bash test9.sh

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x905e52a2

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    41942048    20970000+  83  Linux

猜你喜欢

转载自blog.csdn.net/rdgfdd/article/details/82941845