linux备忘录-文件系统管理

Extx 文件系统原理

block group

每个分区(partition)的组成为 boot sector -> block group -> block group -> block group -> ...

而每个block group的组成为 super block -> 文件系统描述 -> 区块对应表(block bitmap) -> inode对应表(inode bitmap) -> inode Table -> Data Block

文件系统描述

描述每个block group开始和结束的block号码。以及每一个区段(superblock、bitmap、inodemap、datablock)分别介于哪一个block号码之间。

block bitmap

用于描述block的使用情况,哪些block为空,哪些block已经在使用。

inode bitmap

用于描述inode的使用情况,哪些inode没在用,哪些inode已经在使用。

通过dumpe2fs观察文件系统

dumpe2fs [-bh] 装置文件名
dumpe2fs -h 仅列出superblock的数据

superblock inode block

  1. superblock 记录文件系统的整体信息,如inode/block的总量、使用量、剩余量、以及文件系统的格式和相关信息。

superblock记录着

  1. block和inode的总量。
  2. 未使用和已经使用的block和inode数量。
  3. block和inode的大小
  4. 文件系统的挂载时间,最近一个写入数据的时间,最近一个检查硬盘的时间。
  5. 文件系统是否被挂载的标志 valid bit。未挂载为0、挂载为1。
    一般,superblock的大小为1024bytes。
    除了第一个block goup具有superblock,其他不一定具有superblock。若其他blockgroup有,则只是**对superblock的备份。
  • block
  1. inode 记录档案的属性,一个档案占用一个inode,同时记录此档案的数据所在的block号

inode 记录着

  1. 档案的权限 rwx
  2. 档案的拥有者和群组
  3. 档案的容量
  4. 档案的三个时间ctime,atime,mtime
  5. 档案的特殊权限 SUID、SGID、SBIT
  6. 档案真正的内容指向,指向block区
    inode的大小和数量在格式化后就不能变。
    每个inode的大小为128bytes。
    每个档案占用一个inode。
    文件系统能够建立的档案数量与inode的数量有关。
    inode记录block号码的区域定义为12个直接、一个间接、一个双间接和一个三间接记录区。
    block直接为 -> 数据block
    block间接为 -> 间接block -> 数据block
    block双间接为 -> 间接block -> 间接block -> 数据block
    block三间接为 -> 间接block -> 间接block -> 间接block -> 数据block
  1. block 实际记录档案的内容,若档案太大,会占用多个block

每个block的大小可以为1kB2KB4kB
原则上,block的大小和数量格式化后就不能改变。
每个block只能放置一个档案的内容。
档案大会占用多个block,档案小会占用一个block,并浪费block其余空间。

文件与目录

目录

每个目录的block记录着目录下的文件名和对应的inode号

日志文件系统

例如,文档创建开始记录日志,文档创建结束记录日志,这种方式有利于数据一致性检查

挂载相关

硬盘的文件系统目录树 结合的方式称为 挂载。文件系统必须挂载到目录树的某个目录后,才能被使用。

文件系统最顶层目录的inode号 一般为 2

通过ls -l /lib/modules/$(uname -r)/kernel/fs 可以查看linux支持的文件系统

通过cat /proc/filesystems 可以查看linux目前加载的文件系统。

VFS(virtual filesystem switch) 会帮助我们管理文件系统。

iso的挂载和制作

iso的挂载

通过命令 mount -o loop /tmp/xx.iso /mnt 进行挂载。

制作大档案进行挂载(制作iso映像)

dd if=/dev/zero of=/home/loopdev bs=1M connt=512 制作/home/loopdev大小为512M的档案,内容为空。
if 指定 input file
of 指定 output file
bs 指定每个block的大小
count 指定有多少个block

然后进行格式化
mkfs -t ext3 /home/loopdev

然后进行挂载
mount -o loop /home/loop/dev /media/cdrom

查看过载情况
df 或 mount

建立 swap partition

  1. 通过fdisk分割磁盘块,并需要修改system id

通过 fdisk的 t 修改系统ID

  1. 通过mkswap进行格式化

mkswap /dev/hdc7
free

  1. 通过swapon将swap启动

swapon /dev/hdc7
free

  1. 通过free观察内存的用量
  2. 通过swapoff关掉swap file

知识点

数据更改后只会从clean变成dirty,数据从内存到硬盘是异步的。可通过sync命令同步写入到硬盘。

linux会将常用的档案或数据放在主存储器的缓冲区,以加快文件系统的读写,因此linux的物理内存最后都会别用光。

挂载注意:

单一文件系统不应该重复挂载到不同挂载点。
单一目录不应该重复挂载多个文件系统。
挂载点目录理论上应该为空目录。

挂载的一些限制:

根目录/必须挂载,而且必须先于其他挂载点挂载。
挂载点必须为已经建立的目录
挂载点同一时间只能挂载一次
partition同一时间只能挂载一次
不能再挂载点目录进行取消挂载

目录 /etc/fstab/etc/mtab 是开机挂载相关的目录

/etc/fstab 后面的两个数字的意义
第一个数字 是否进行dump备份

0 不做dump备份
1 每天进行dump备份
2 不定日期进行dump备份
第二个数字 是否以fsck检查扇区
0 不检查
1 最早被检验
2 检验,不是最早,一般根目录设定为1最早进行检验。

通过 mount -a/etc/fstab 进行测试,否则影响开机
通过 df 查看 挂载信息。

单人模式下根目录 是只读的。可通过 mount -n -o remount,rw / 重新挂载改成读写。

linux支持的文件系统在 /lib/modules/$(uname -r)/kernel/fs
/etc/filesystems 系统指定的测试挂载文件系统类型
/proc/filesystems 系统已经加载的文件系统类型 d

当通过ls /dev下面的装置时,group后面的是 major号minor号。可以称为主装置号和次装置号。例如

/dev/hda major为 3 minor为 0~63
/dev/hdb major为 3 minor为 64~127
/dev/sda major为 8 minor为 0~15
/dev/sdb major为 8 minor为 16~31

基本上,linux2.6之后,硬件文件名都能被系统实时产生。要手动处理装置档案,可通过 mknod命令

文件系统命令

  1. dumpe2fs (观察文件系统的各部分,superblock inode block等)
  2. df (查看目前挂载的装置,查看整体磁盘使用量)

df -h 以GB、MB等方式显示
df -h /etc 查看/etc的可用磁盘容量。
df -ih 显示可用的inode数量。

  1. e2fsck (进行数据一致性检查,inode bitmap、block bitmap、superblock等元数据的一致性)
  2. sync (在内存中dirty的数据同步写入硬盘)
  3. du (查看文件系统磁盘使用量,默认以kB为单位)

du -a 档案的容量也列举出来
du -s /* 目录的容量

  1. ln (制作链接档)

ln srcfile dst_linkfile 创建硬链接
ln -s srcfile dst_linkfile 创建软链接
硬链接不占用inode和block,软链接占用inode和block
du -sd;df -i 查看当前目录的总大小和inode使用情况

  1. fdisk (进行磁盘分区,仅对装置起作用,只有root才能执行)

df / 找出根目录所在磁盘
fdisk /dev/sda 对/dev/sda进行操作
fdisk -l 列出所有装置的分区情况

  1. partprobe (强制让核心重新捕捉partition table)

在fdisk进行分区后使用

  1. mkfs (格式化分区 make file system)

mkfs [-t 文件系统格式] 装置文件名

  1. mke2fs (自定义格式户分区)

mke2fs -b [1024|2048|4096] 指定block大小
mke2fs -j 创建ext3文件系统,默认为ext2
mke2fs -L LABEL 设定文件系统的label
mke2fs -i size 设定每多少字节分配一个inode

  1. fsck (进行文件系统检测修复)

fsck -t type 指定文件系统类型
fsck -A 依据/etc/fstab的内容,对需要的装置扫描一遍。
fsck -a 自动修复,不需要老按y
fsck -C 扫描过程中使用直方图显示进度
fsck -f 强制检查clean的地方
最好在卸载情况下扫描

  1. mount (挂载命令)

mount -a 根据/etc/fstab对未挂载的文件系统进行挂载
mount -l 显示目前的挂载信息,及label
mount -t type 指定文件系统类型
mount -n 默认会将挂载信息写入/etc/mtab,-n则不写入
mount -L 通过label进行挂载
mount -o 后接挂载参数
mount 装置文件名 挂载点
mount /dev/sda5 /mnt
mount -t iso9660 /dev/cdrom /media 挂载光盘
mount -t vfat /dev/fd0 /media 挂载软盘
mount -p loop /root/xxx.iso /mnt 挂载iso映像文件。
fdisk -l 找出U盘的装置文件名
mount -t vfat -o iocharset=cp950 /dev/sda1 /mnt/flash 挂载U盘,不能是NTFS格式
mount -o remount,rw,auto / 重新挂载根目录,并加入参数rw,auto
mount --bind /home /mnt/home 将某个目录挂载到其他目录
mount -L "LABEL" /mnt 通过Label进行挂载
挂载参数 -o
async/sync 设定磁盘是否以异步方式运作,默认为async异步
auto/noauto 是否注定测试挂载
rw/ro 设定读写还是只读
exec/noexec 设定是否可执行
user/nouser 是否允许用户通过mount挂载
suid/nosuid 是否允许suid的存在
usrquota 启动文件系统支持磁盘配额
grpquota 启动文件系统支持群组磁盘配额
defaults 默认参数

  1. umount (取消挂载)

umount [-fn] 装置文件名或挂载点
umount -f 强制取消挂载
umount -n 不更新 /etc/mtab

  1. mknod (手动设置装置档案)

mknod 装置文件名 [bcp] [major] [minor]
参数 b 为设定装置名称成为一个周边存储设备档案,例如硬盘。
参数 c 为设定装置名称成为一个周边输入设备档案,例如鼠标、键盘。
参数 p 为设定装置名称成为一个FIFO档案。
mknod /dev/hdc10 b 22 10
mknod /tmp/testpipe p

  1. e2label (格式化之后修改文件系统的label)

e2label 装置文件名 newLabelName
e2label /dev/hdc10 "my_label" 修改/dev/hdc10的LABEL为my_label
dumpe2fs -h /dev/hdc10 可以查看文献系统的label

  1. tune2fs ()

tune2fs [-jlL] 装置号
tune2fs -l 类似于 dumpe2fs -h
tune2fs -j 将ext2升级为ext3
tune2fs -L 修改文件系统的LABEL

  1. hdparm (侦测和修改IDE接口的硬盘参数)

hdparm -Tt /dev/sda 可以测试SATA硬盘的读取效能

  1. mkswap (格式化swap分区)
  2. swapon (加载swap分区)
  3. swapoff (卸载swap分区)
  4. parted

parted 装置 [指定[参数]]
parted /dev/sda print 列出分割表信息
parted /dev/sda mkpart logical ext3 19.2GB 19.7GB //创建逻辑分区
parted /dev/sda rm 8 删除8号分区

其他知识点

硬链接

硬链接不能跨文件系统
硬链接不能对目录进行

参考

鸟哥的Linux私房菜 第三版

原文地址:https://www.cnblogs.com/smallpi/p/7294588.html