简介
在RHEL7中文件系统是一个即基础有重要的系统功能,Linux当中所有的配置都是由文件组成的,当然这也包括内核之类的,可想而知如果能了解Linux系统的文件系统的运作模式是多么重要的一步,如果完全了解了这一系统无论是Kail、Ubuntu等都是大同小异的,而磁盘管理则对用于存放文件的硬盘进行管理,相当于Windows当中的分区与分配盘符。该篇文章将会讲述文件系统和磁盘管理的相关配置与使用
文件系统
背景知识:
文件存储在硬盘上,硬盘的最小存储单位叫做“扇区”(Sector)。每个扇区储存512字节(相当于0.5KB)。
操作系统读取硬盘的时候,不会一个个扇区的读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个“块”(block)。这种由多个扇区组成的“块”,是文件存取的最小单位。“块”的大小,最常见的是4KB,即连续八个sector组成一个block。
文件数据都储存在“块”中,那么很显然,我们还必须找到一个地方储存文件的“元信息”,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为”索引节点“。
每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。
-
系统文件的最小存储单位为块
a:小文件比较多的应用服务存储上使用块小比较好;
b:存储大容量文件时,块大比较好;
c:每个文件系统的开始位置的那个块就称为超级块(superblock)#查看文件系统相关信息,需要按照文件系统类型来查看 dumpe2fs /dev/sda1 # tune2fs和dumpe2fs只能打开ext3/ext4等文件类型 xfs_info /dev/sda1 # 查看xfs文件类型
-
文件或目录在硬盘上的存储分为属性存储(inode)和内容存储(block)
a:inode记录文件的相关属性以及文件内容放置在哪个块中(指针功能)
b:块放的就是文件内容,对于目录存放就是其下文件或目录的关联性# 使用stat查看文件信息 [root@localhost ~]# stat anaconda-ks.cfg File: ‘anaconda-ks.cfg’ Size: 1832 Blocks: 8 IO Block: 4096 regular file Device: fd00h/64768d Inode: 33574978 Links: 1 Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2019-07-05 21:37:26.290997768 +0800 Modify: 2019-07-05 21:34:34.896787279 +0800 Change: 2019-07-05 21:34:34.896787279 +0800 Birth: - # 使用ls查看inode [root@localhost ~]# ls -i 33574978 anaconda-ks.cfg 51533268 Desktop # 使用df查看硬盘的inode的占用情况(相当于硬盘空间),当磁盘的inode被占满时将无法创建文件 [root@localhost ~]# df -i Filesystem Inodes IUsed IFree IUse% Mounted on /dev/mapper/centos-root 8910848 142833 8768015 2% / /dev/sda1 524288 340 523948 1% /boot # 使用inode删除文件 [root@localhost ~]# ls -i 33574978 anaconda-ks.cfg 51533268 Desktop 33575008 test.c [root@localhost ~]# find ./* -inum 33575008 -delete
-
文件的读取(文件系统的解析)
首先由根目录获取该文件上层目录的所在的inode,再由该目录所记录文件关联性获取对应文件的inode,然后找到这个对应文件的相关属性和数据存放的地方,同时判断文件权限,有权限情况下,读取对应块中的内容
# 查找根目录下所有文件的inode和权限信息 [root@localhost ~]# ls -lia / total 32 64 dr-xr-xr-x. 18 root root 257 Dec 15 2020 . 64 dr-xr-xr-x. 18 root root 257 Dec 15 2020 .. 2975300 -rw------- 1 root root 17 Dec 15 2020 .bash_history 451369 lrwxrwxrwx. 1 root root 7 Jul 5 2019 bin -> usr/bin --------------------------省略部分------------------------------- 16777288 drwxrwxrwt. 17 root root 4096 Dec 26 12:00 tmp 33754614 drwxr-xr-x. 13 root root 155 Jul 5 2019 usr 50331713 drwxr-xr-x. 21 root root 4096 Jul 22 2019 var # 查找指定文件的inode和权限信息 [root@localhost ~]# ls -liad /etc/crontab /etc/. 16777281 drwxr-xr-x. 139 root root 8192 Dec 26 10:55 /etc/. 17192969 -rw-r--r--. 1 root root 451 Jun 10 2014 /etc/crontab
-
文件删除
删除掉的是指针,大容量的数据删除也很快。要进行数据恢复,原则上若无新数据写入,原来的数据块未被清除,这个数据是可以恢复的!找到对应的地址,数据连接是可以重新建立的。 -
空间满的问题(examples说明)
创建一个10M左右的分区,然后使用dd命令用1K大小的文件将它占满# dos标签类型的硬盘会受到,3P+1E的限制(3个主分区(primary),1个扩展分区(extended)) # 超过4个分区的需要在扩展分区的基础上使用l来创建逻辑分区 [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. Device does not contain a recognized partition table Building a new DOS disklabel with disk identifier 0x1704f6e1. Command (m for help): m # 进入菜单选择 Command action a toggle a bootable flag b edit bsd disklabel c toggle the dos compatibility flag d delete a partition g create a new empty GPT partition table G create an IRIX (SGI) partition table l list known partition types m print this menu n add a new partition o create a new empty DOS partition table p print the partition table q quit without saving changes s create a new empty Sun disklabel t change a partition's system id u change display/entry units v verify the partition table w write table to disk and exit x extra functionality (experts only) Command (m for help): n # 创建新的分区 Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): Using default response p Partition number (1-4, default 1): 1 First sector (2048-2097151, default 2048): Using default value 2048 Last sector, +sectors or +size{K,M,G} (2048-2097151, default 2097151): +10M Partition 1 of type Linux and of size 10 MiB is set Command (m for help): w # 保存写入,如果不需要保存输入q The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. # 写入内核,如果出现error需要重启系统才能是写分区 [root@localhost ~]# partprobe [root@localhost ~]# fdisk -l Disk /dev/sdb: 1073 MB, 1073741824 bytes, 2097152 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: 0x1704f6e1 Device Boot Start End Blocks Id System /dev/sdb1 2048 22527 10240 83 Linux # 格式化分区,-N是指定inode数量,一般业务不需要,详情可通过man mkfs.ext4查看 [root@localhost ~]# mkfs.ext4 -N 20 /dev/sdb1 mke2fs 1.42.9 (28-Dec-2013) Filesystem label= OS type: Linux Block size=1024 (log=0) Fragment size=1024 (log=0) Stride=0 blocks, Stripe width=0 blocks 32 inodes, 10240 blocks # 只能分配32个inode 512 blocks (5.00%) reserved for the super user First data block=1 Maximum filesystem blocks=10485760 2 block groups 8192 blocks per group, 8192 fragments per group 16 inodes per group Superblock backups stored on blocks: 8193 Allocating group tables: done Writing inode tables: done Creating journal (1024 blocks): done Writing superblocks and filesystem accounting information: done # 挂载到/mnt下 [root@localhost ~]# mount /dev/sdb1 /mnt # 下面需要用到脚本touch_file.sh进行测试,后面会给出 # 也可以用dd if=/dev/zero of=n bs=1K count=1单个文件创建 [root@localhost mnt]# vim /tmp/touch_file.sh [root@localhost mnt]# sh /tmp/touch_file.sh ... 17 18 19 20 21 touch: cannot touch ‘21’: No space left on device 22 ... [root@localhost mnt]# df -hi Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sdb1 32 32 0 100% /mnt [root@localhost mnt]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sdb1 9.0M 172K 8.2M 3% /mnt # 有空间却无法创建文件
#!/bin/bash #function:touch 100000 files #author:hellen #time:20140401 cd /mnt for ((i=1;i<=25;i=i+1)) do echo $i touch $i done
-
区别
a:ext2 ext3 —inode 128字节 ext4 256字节
b:文件系统大小和文件大小
ext2 16TB 2TB
ext3 16TB 2TB
ext4 1EB 16TB
Xfs 18EB 9EB (64位文件系统)
c:日志功能(ext2 无,ext3和ext4有,ext4也可灵活关闭,xfs日志指定位置)-o^has_journal
d:文件索引方式不同(ext4 :extents ext3 ext2:blockmaps),文件读写效率变高!
e:多块分配和延迟分配
f :fsck变快(大系统中会有很大效果,fsck会去扫描在用的inode)
g:默认启用barrier(-o barrier=0 关闭) 类似DB的日志功能,日志落地才能commit1
h:xfs_repair -L /dev/sda1
磁盘管理
-
磁盘的物理组成
硬盘是由硬盘片组成分为单盘和多盘(多个盘片)。磁道(track),同盘片相同半径的一个圆。扇区(sector),512字节。扇区是硬盘片上最小物理存储量!
两个硬盘片上的同一个磁道就是一个柱面(cylinder),柱面是分区时的最小单位。一个柱面约为8MB的数据
-
分区要点
a:MBR(master boot recorder)主引导区
一块硬盘第0磁道上MBR前446字节包含可启动系统的引导加载程序的第一个部分,后跟包含分区表的64字节。在分区表中有关于四个主分区的信息的空间;分区开始位置,结束位置以及指出存储在其中的信息类型的代码。
b:3P+1E 4P
MBR 最多4个分区的记忆
主分区 扩展分区 逻辑分区
注:分区限制的演示在文件系统的第5点的演示当中有说明 -
新建分区和删除分区
a:fdisk -l 和df -h // 剩余空间的判断
b:fdisk /dev/sdc // b d l n p q t w
c:tune2fs -c 0 -i 0 /dev/sdb1 // 对分区进行检查
注1:创建分区的演示在文件系统的第5点的演示当中有说明
注2:删除分区时只需要输入d然后选择需要删除的分区即可(需要先卸载先前的挂载)
-
格式化系统和挂载
mkfs.[ext2/ext3/ext4] /dev/sdb1 # 使用ext2、ext3、ext4格式化分区 tune2fs -[option] /dev/sdb1 # 对分区进行参数的检查 df -h # 查看分区挂载情况 mount /dev/sdb1 /mnt # 挂载分区,/etc/mtab 查看挂载情况 mkfs.ext4 -L "firstp" /dev/sdb1 # 设置磁盘标签 mount -L firstp /mnt # 使用磁盘标签进行挂载 tune2fs -L "firstp" /dev/sdb1 # 设置磁盘标签 umount /dev/sdb1 # 以分区来卸载 umount /mnt # 以挂载路径来卸载
-
磁盘的一些相关的操作命令
fdisk -l # 查看磁盘的分区状况 du -sh # 查看当前目录下所有文件所占的磁盘空间 mount -a # 将/etc/fstab的所有内容重新加载
/etc/fstab 系统启动时自动挂载的分区(创建分区后需要手动添加,否则重启系统后将无法自动挂载)
a:新建分区随机启动
b:/etc/fstab出错时的处理# /etc/fstab写错或者是出现错误时系统进入了命令行模式,进行以下操作 mount -n -o remount,rw / # 挂载根目录 xfs_admin -u /dev/sdb1 # 修改/dev/sdb1的UUID mkdir /opt/backup # 创建/opt/backup init 6 # 重启系统 # 为避免/etc/fstab出错,每次修改完后需要使用mount -a来检验有没有出错
注:UUID (-U):通用唯一标识符,如60ab619d-0db0-4d74-9951-c7bd3f67ed85。UUID通常是在创建文件系统时生成的,并且永不改变。可以通过tune2fs -l /dev/sdb1 或dumpe2fs /dev/sdb1来查看对应的分区的UUID号
-
fsck的模拟试验
文件系统只读时的处理read-only 卸载设备 umount /dev/sdb1 急救模式下的处理 # 对于根文件系统 fsck -c -y /dev/sdb1 xfs_repair -L /dev/sda1 # 修复系统分区
磁盘管理练习
试验习题
a:利用剩余空间创建三个分区(1G 100M 32M)
b:1G的分区做成随机启动,挂在/data目录下
c:利用32M分区模拟分区空间满的情况(节点数满)
d:100M做成加密分区,并且做成随机启动挂载,无需密码输入
e:/etc/fstab被破坏后的恢复
f:fsck模拟试验 (可选题)
swap分区
-
交换分区概念
交换分区,用于扩展系统的物理内存.交换分区为swap分区,系统内存使用紧张时,会将内存中不常用的数据暂时交换到swap分区中! -
交换分区的管理
Partition ID: 0x82(交换分区ID,fdisk /dev/sdb时输入t进行修改)
使用swapon 激活交换分区
使用swapoff 取消激活编辑/etc/fstab文件,以便在引导时自动激活交换分区
激活交换分区:swapon /dev/sdb1
启用交换分区:swapon -a
查看已激活的交换分区:swapon -s -
swap分区的增加
a:直接加分区格式为swap格式(2、3,推荐使用,速度更快)
b:建立虚拟内存文件,格式为swap1)dd if=/dev/zero of=/mnt/test.swap bs=1M count =100 ( 建立一个100M的文件) 2)mkswap /mnt/test.swap (标识为SWAP文件) 3)swapon /mnt/test.swap (激活SWAP文件) 4)修改/etc/fstab文件,增加以下内容: 5)/mnt/test.swap swap swap default 0 0 6)swapon -s 或free 或cat /proc/swaps 查看。
-
实例讲解
a:实验开始前请先确认好你的swap情况
1)free -m
b:创建swap区域(分区或文件)
1)建新分区 ID指定为82 2)如果是用文件的话,用如下格式建立swap虚拟文件 dd if=/dev/zero of=/tmp/swap bs=10M count=100
c:格式化swap
1)设备 mkswap /dev/sdb1 2)文件 mkswap /tmp/swap
d:再次确认free
e:激活swap1)分区:swapon /dev/sdb1 2)文件:swapon /tmp/swap
f:再次确认free