本文为《鸟哥的Linux私房菜》学习笔记系列,如有问题欢迎打扰
文件系统
ext2 文件系统构成
- 超级区块:记录此文件系统的整体信息(inode,数据区块的总量、剩余量、使用量等)
- inode:记录文件的属性,及文件数据所在区块的号码。一个文件占用1个
- 数据区块:记录文件实际内容
- BootSector,Block Group1,Block Group2,Block Group3...
- 区块群组:inode和数据区块太大时,不方便管理,因此分成多个区块,每个区块由对应的区段组成:
- superblock
- 数据区块和inode的总量
- 未使用和已使用的数据区块与inode的数量
- 数据区块与inode的大小
- 文件系统的挂载时间、最近写入数据时间、最近一次检验磁盘的时间等文件系统相关信息
- 一个有效位数值,若此文件系统已被挂载,有效位为0;若未被挂载,则为1
- 文件系统描述
- 描述每个区块群组的开始与结束
- 及说明每个区段(超级区块、对照表、inode对照表)分别介于哪一个区块之间
- 区块对照表
- 记录哪些区块是空的
- inode对照表
- 记录使用与未使用的inode号码
- inode table:
- 文件读写属性
- 文件拥有者及群组
- 文件大小
- 文件创建、修改、读取等时间信息
- 数据区块号(12直接,1间接,1双间接,1三间接)
- Data Block
- 存放实际数据,block大小影响着最大单一文件的大小和最大文件系统容量
- superblock
- 查询ext系列超级区块信息
dumpe2fs [-bh]
- 显示文件(夹)等的inode编号
ll -di / /etc /etc/passwd
- 列出文件系统的整体磁盘使用量
df [-hi]
- 查看文件系统的磁盘使用量
du [-sm]
Linux文件系统的运行
- 异步处理
- 当文件加载到内存后,若未被修改,则内存区段的文件被标记为Clean
- 若被修改过,则被标记为Dirty
- 系统会时不时地将Dirty数据写回到磁盘中
- sync命令可手动强制写入磁盘
- 不正常关机时,由于数据未写回到磁盘,因此重新启动后可能会花很多时间进行磁盘校验,甚至导致文件系统的损坏(非磁盘损坏)
- 挂载点意义
- 一定是目录,该目录为进入该文件系统的入口
- ...
XFS
硬链接与符号连接
- 硬链接
- 一条链接到某inode号码的关联记录
- 导致有多个文件名对应到同一个inode号码
- 若有两个文件名链接到同一个inode号码,删除其中一个文件后,另一个文件不受影响
- 除了文件名,两个文件一模一样
- 不能跨文件系统,不能链接目录
- 软链接(符号链接)
- 是一个新文件
- 这个文件会让数据的读取指向它链接的那个文件的文件名
- 大小为绝对路径的字符数
链接数
- 即与同一个inode关联的文件的数量
目录的链接数
- 空目录的链接数为2,空目录有:
- /tmp/test
- /tmp/test/.
/tmp/test/..
ln [-sf] ln passwd passwd-hd #硬 ln -s passwd passwd-so #软
磁盘的分区、格式化、检验与挂载
观察磁盘分区状态
- 列出系统上所有磁盘列表(list blcok device)
lsblk [-dfimpt] [device]
- 列出设备的UUID等参数(block id)
blkid
- 列出分区表类型和分区信息
parted device_name print
磁盘分区:gdisk/fdisk
MBR使用fdisk分区,GPT使用gdisk分区
gdisk 设备名
fdisk 设备名
磁盘格式化(创建文件系统)p238
综合指令(make filesystem)mkfs XFS
mkfs.xfs [-b bsize] [-d parms] ... 设备名
-b 后接区块容量512~64k
...
ext4
mkfs.ext4 [-b bsize] ... 设备名
文件系统校验
xfs_repair [-fnd] 设备名
fsck.ext4 [-pf] [-b 超级区块] 设备名
文件系统的挂载与卸载
注意点
- 单一文件系统不应重复挂载到不同目录
- 单一目录不应重复挂载多个文件系统
- 要作为挂载点的目录,理论上应该都是空目录
- 如果原本挂载点不为空,则挂载后原本的数据/目录会被暂时隐藏,新分区被卸载后会重新出现
mount
mount -a #依照配置文件/etc/fstab的数据将所有未挂载的磁盘都挂载上
mount [-l] #显示挂载信息
mount [-t 文件系统] UUID='' 挂载点 #建议使用
LABEL=''
设备文件名
#现在系统太聪明,可能不需要加上-t参数,他会自动匹配合适的文件系统
-n #默认情况下,系统会将实际情况及时写入/etc/mtab中,以利于其他程序运行
#但在某些情况下(如单人维护模式),为了避免问题会刻意不写入,所以要使用-n
-o #后接额外参数。如账号,密码,读写权限等
umount
umount [-fn] 设备名/挂载点 #有时候设备会有其他方式挂载,因此用挂载点卸载更直接
磁盘/文件系统参数自定义
lsblk #查看major和minor数值`
mknod 设备文件名 [bcp] [Major] [Minor] #b:设置设备名为一个外接储存设备,如磁盘
#c:设置设备名为一个外接输入设备,如鼠标键盘
#p:设置设备名为一个FIFO文件
xfs_admin
tune2fs [-l]#读出超级区块的数据 [-L Label]#修改LABEL name [-U UUID]#修改UUID
设置启动挂载
/etc/fstab 及/etc/mtab
/etc/fstab是系统启动时使用的配置文件,格式为:
[设备/UUID等] [挂载点] [文件系统] [文件系统参数] [...] [...]
文件系统参数:async/sync auto/noauto rw/ro exec/noexec
实际文件系统的挂载记录到/etc/mtab与/proc/mounts中
每次修改系统文件的挂载时,也会同时修改这两个文件
特殊设备loop挂载(镜像文件不刻录就挂载使用)
挂载CD/DVD镜像文件
mkdir /data/dvd
mount -o loop /tmp/CentOS-aoauwhfo-DVD.iso /data/dvd
df /data/dvd
umount /data/dvd
制作loop设备文件
- 建立大文件:
dd if=/dev/zero of=/srv/loopdev bs=1M count=512
- 格式大文件:
mkfs.ext4 /srv/loopdev #即创建文件系统
- 挂载:
sudo mount -o loop /srv/loopdev /mnt #使用UUID挂载时,报 找不到 UUID=fd16089d-5202-403b-8066-5e46c6255a57
- 此时这个挂载只是暂时的,为了将它一直挂载,需要修改/etc/fstab内容
- 在/etc/fstab中加入一行
/srv/loopdev /mnt/mymountDirectory ext4 defaults,loop 0 0
- 先将其卸载
umount /mnt/
- 创建目录
mkdir /mnt/mymountDirectory
mount -a
swap的创建
...
对文件系统的观察与操作
- 块的内部空隙的空间浪费
parted
...
LVM
创建
需要在物理分区的基础上创建
若此时有一个物理分区sda6,其格式为LVM,则:
- 在其上建立physical volume:
pvcreate /dev/sda6
- 在此pv上创建卷组:
vgcreate myvg /dev/sda6
- 在此卷组上创建逻辑卷:
lvcreate -L 2G -n mylogicalvolume myvg
- 查看信息(其他类似命令):
pvdisplay /dev/sda6
- 创建文件系统,与物理分区相似,如:
mkfs -t ext4 /dev/myvg/mylogicalvolume
扩容
待扩容卷组:myvg
额外空间:/dev/sda5(需提前将其创建为pv)
- 扩容卷组myvg:
vgextend myvg /dev/sda5
- 扩容逻辑卷:
lvextend -L +3G /dev/myvg/mylogicalvolume
- 扩容完成后,此时分区大小确实已扩容,但文件系统还未扩容
- 文件系统扩容:
resize2fs [-f] /dev/myvg/mylogicalvolume
减容
建议先卸载挂载点,否则可能损害文件系统
类似扩容,可直接:lvreduce -L -1G /dev/myvg/mylogicalvolume