Linux磁盘与文件系统管理
1. 文件系统
1. 1.系统特性
分区完成后格式化的目的:将文件系统格式变成操作系统能够利用的格式
linux文件系统将文件的权限、属性放入inode中,实际数据放入数据区块中,超级区块记录整个文件系统的整体信息
超级区块:记录文件系统的整体信息,包括inode与数据区块的总量、使用量、剩余量,以及文件系统的格式与相关信息等
inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的区块号码
数据区块:实际记录文件的内容,若文件太大,则会占用多个区块
文件属性和权限记录到inode中,假设数据存放位置未2、7、13、15,操作系统根据排列顺序,一口气读取所有区块内容,这种读取方式被称为索引式文件系统
U盘文件系统的格式一般是FAT,没有inode存在,无法将区块在开始就读取出来,每个区块号码都记录在前一个区块中,如果文件存储位置太过分散,则需要读取几轮才能读取完整个文件的内容
需要碎片整理的原因是文件写入的区块太过于离散,此时文件读取的性能很差,碎片整理就是将同一文件所属的区块集合起来
1. 2.linux中ext2文件系统
ext2文件系统从一开始将inode和数据区块划分好,除非重新格式化,否则inode与数据库固定好后就不再改变
ext2文件系统的区块大小有1k、2k、4k
区块限制:
- 大小原则上不能修改(可以格式化)
- 每个区块最多存放一个文件的数据;
- 承上,如果文件大于区块大小,则一个文件会占用多个区块数量
- 承上,文件小于区块,则该区块的剩余容量不能被使用(空间浪费)
1. 3.与目录树的关系
1.目录
文件系统建立一个目录使,文件系统会分配一个inode与至少一块区块给该目录,inode记录该目录的相关权限和属性,并可记录分配到的那块区块的号码
2.目录树
目录树是由根目录开始读起,因此系统通过挂载的信息可以找到挂载点的inode号买得到根目录的inode内容,并依据该inode读取根目录的区块内的文件名数据,再一层一层的往下读取到正确的文件名
1. 4.日志式文件系统
写入的数据仅有inode对照表和数据区块而已,同步更新元数据的步骤没有完成,产生元数据内容与实际数据存放区不一致。
避免文件系统不一致问题的发生,步骤为:
- 准备:当系统要写入一个文件时,会先在日志记录区块记录某个文件准备要写入的信息
- 实际写入:开始写入文件的权限和数据;开始更新metadata数据
- 结束:完成数据与metadata的更新后,在日志记录区块当中完成该文件的记录
1. 5.文件系统的运行
磁盘写入与内存写入的异步处理:
1.系统加载一个文件到内存后,如果该文件没有被修改过,则在内存区段的文件数据会被设置未干净[clean]。
2.如果内存中的文件数据被更改过了,此时该内存中的数据会被设置为脏的[dirty],此时所有的操作都还在内存中执行,并没有写入到磁盘中。
3。系统会不定时的将内存中设置为[dirty]的数据写回磁盘,以保持磁盘与内存数据的一致性。也可以手动强制写入
2. 文件系统的简单操作
2.1. 硬链接和符号链接
1. 硬链接
定义:通过文件系统的inode链接来产生新的文件名,而不是产生新文件
硬链接只是在某个目录下新增一条文件名链接到某inode号码的关联记录
硬链接可以数据的安全性,确保在删除其中一个文件名时,inode和区块都还是存在的,即删除源文件还是可以打开另一个文件的
限制:
- 不能跨文件系统
- 不能链接目录
$ ll -i 文件名 # 查看文件具体信息
2. 符号链接(快捷方式)
定义:在建立一个独立的文件,而这个文件会让数据的读取指向他link的那个文件的档名
当来源档被删除之后,符号链接的文件会打不开
符号链接的文件都是独立的,数据内容存放在来源档的数据区块中,而连接档的大小就是文件名所占用的空间
$ ln [-sf] 来源文件 目标文件
选项与参数:
-s:如果不加任何参数就进行连结,那就是hard link,加-s 就是符号链接
-f:如果目标文件存在,就主动将目标文件移除在建立
3.关于目录的link数量
一个空目录至少会存在.
和..
这两个目录,所以创建一个新的目录/tmp/testing
至少存在三个东西:
- /tmp/testing
- /tmp/testing/.
- /tmp/testing/…
所以创建空目录时会导致上层目录的链接数增加一个
相关命令自行查询,本小节还有许多东西未写,以后用到在查
3. 磁盘的分区、格式化、检验与挂载
新增磁盘的动作:
- 对磁盘进行分区,建立patition;
- 对该patition进行格式化,建立系统可用的文件系统;
- 对文件系统进行检验
- 建立挂载点,并挂载
3.1.观察磁盘分区状态
lsblk(list block device),列出所有储存装置
$ lsblk [-dfimpt] [device]
选项与参数:
-d:仅列出磁盘本身,并不会列出该磁盘的分区数据
-f:同时列出该磁盘内的文件系统名称
-i:使用 ASCII的线段输出,不要使用复杂的编码(再某些环境下很有用)
-m:同时输出该装置在/dev底下的权限数据(rwx的数据)
-p:列出该装置的完整文件名!而不是仅列出最后的名字而已。
-t:列出该磁盘装置的详细数据,包括磁盘队列机制、预读写的数据量大小等
# 不加任何参数即列出本系统下所有磁盘与磁盘内的分区信息
$ blkid #列出装置得UUID等参数
$ parted device_name print # 列出磁盘得分区表类型与分区信息 如 /dev/vda
3.2. 磁盘分区:gdisk/fdisk
分区时,应使用parted检查分区表格式,再判断使用fdisk/gdisk来分区,或直接使用parted分区
MBR分区表使用fdisk分区,GPT分区表使用gdisk分区
$ gdisk # 装置名称 如/dev/vda
# 按?查看命令,一般情况下按q可以不保留退出,别按下w即可
# 如果是选择新增分区,在Last sector处,如果不打算全部分给一个区,需要通过 +容量 得方式区控制区大小
最后需要将分区写入磁盘分区表
最后更新核心的分区表信息
$ partprobe [-s]
参数:
-s:屏幕显示讯息
3.3. 磁盘格式化(建置文件系统)
1. XFS 文件系统
当又xfs文件系统错乱时才需要使用这个指令
$ mkfs.xfs [-b bsize] [-d parms] [-i parms] [-L label] [-f] [-r parms] 装置名称
选项与参数:
关于单位:底下只要谈到『数值』时,没有加单位则为 bytes值,可以用k,m,g,t,p (小写)等来解释
比较特殊的是s这个单位,它指的是sector的『个数』喔!
制为Linux的4k喔!
-b:后面接的是 block容量,可由512到64k,不过最大容量限制
-d:后面接的是重要的 data section的相关参数值,主要的值有:
agcount=数值:设定需要几个储存群组的意思(AG),通常与CPU有关
agsize=数值:每个AG设定为多少容量的意思,通常agcount/agsize只选一个设定即可
fil1e :指的是「格式化的装置是个文件而不是个装置』的意思!(例如虚拟磁盘)
size=数值: data section的容量,亦即你可以不将全部的装置容量用完的意思
su=数值 :当有 RAID时,那个stripe 数值的意思,与底下的 sw 搭配使用
sw=数值 :当有RAID时,用于储存数据的磁盘数量(须扣除备份碟与备用碟)
sunit=数值 :与su相当,不过单位使用的是『几个sector(512bytes大小)』的意思
swidth=数值 :就是su*sw的数值,但是以『几个sector(512bytes大小)」来设定
-f:如果装置内已经有文件系统,则需要使用这个-f 来强制格式化才行!
-i:与inode有较相关的设定,主要的设定值有:
size=数值 :最小是256bytes最大是2k,一般保留256就足够使用了!
interna1=[O | 1]: log 装置是否为内建?预设为1内建,如果要用外部装置,使用底下设定
logdev=device : log装置为后面接的那个装置上头的意思,需设定internal=0才可!
size=数值 :指定这块登录区的容量,通常最小得要有512个block,大约2M以上才行!
-L:后面接这个文件系统的标头名称Label name的意思!
-r:指定realtime section的相关设定值,常见的有:
extsize=数值:就是那个重要的 extent 数值,一般不须设定,但有RAID 时,最好设定与 swidth的数值相同较佳!最小为4K最大为1G。
# sunit=512 agcount=2 swidth=3584
$ mkf s.xfs -f -d agcount=2,sunit=512,swidth=3584 -r extsize=1792K /dev/vda4
2. EXT4 文件系统mkfs.ext4
$ mkfs.ext4 [-b size] [-L label] 装置名称
选项与参数:
-b:设定block 的大小,有1K,2K,4K的容量,
-L:后面接这个装置的标头名称。
#
$ mkfs.ext4 /dev/vda5
3.4. 文件系统检验
1.xfs_repair 处理XFS文件系统
$ xfs_repair [-fnd] 装置名称
选项与参数:
-f:后面的装置其实是个文件而不是实体装置
-n:单纯检查并不修改文件系统的任何数据(检查而已)
-d:通常用在单人维护模式底下,针对根目录(/)进行检查与修复的动作!很危险!不要随便使用
xfs_repai可以检查/修复文件系统,修复时该文件系统不能被挂载,可以先卸载,再处理。
根目录如法被卸载,根目录出现问题时需要进入单人模式或就救援模式,然后通过其他办法解决
2.fsck.ext4 处理EXT4文件系统
$ fsck.ext4 [-pf] [-b superblock] 装置名称
选项与参数:
-p :当文件系统在修复时,若有需要回复 y的动作时,自动回复 y来继续进行修复动作。
-f:强制检查!一般来说,如果fsck没有发现任何unclean的旗标,不会主动进入细部检查的,如果您想要强制fsck 进入细部检查,就得加上-f旗标啰
-D:针对文件系统下的目录进行优化配置。
-b :后面接superblock的位置!一般来说这个选项用不到。但是如果你的superblock因故损毁时,透过这个参数即可利用文件系统内备份的 superblock来尝试救援。一般来说,superblock 备份在:lK block放在8193,2K block放在16384,4K block放在32768
无论时xfs_repair或fsck.ext4,都是用来检测与修正文件系统错误的指令,如果在正常情况下使用此指令,可能会造成对系统的危害。
执行xfs_repair或fsck.ext4时,被检查的partition务必不可挂载到系统上,即是需要在卸除的状态。
3.5. 文件系统挂载与卸除
挂载点是目录,是进入磁盘分区槽(文件系统)的入口,挂载前处理:
- 单一文件系统不应该被重复挂载在不同的挂载点(目录)上;
- 单一目录不应该重复挂载多个文件系统
- 要作为挂载点的目录,理论上应该都是空目录
如果挂载的目录不是空的,挂载文件系统后,原目录下的东西就会暂时消失,等新挂载系统被卸除后,原目录的内容会在次显示。
不输入参数即是查看目录树
$ mount [option]
选项与参数:
-a:依照配置文件/etc/fstab的数据将所有未挂载的磁盘都挂载上来
-1:单纯的输入mount会显示目前挂载的信息。加上-1可增列Labe1名称!
-t:可以加上文件系统种类来指定欲挂载的类型。常见的 Linux支持类型有: xfs,ext3,ext4,reiserfs,vfat,iso9660(光盘格 式),nfs,cifs,smbfs (后三种为网络文件系统类型)
-n:在默认的情况下,系统会将实际挂载的情况实时写入letc/mt ab 中,以利其他程序的运作。但在某些情况下(例如单人维护模式)为了避 免问题会刻意不写入。此时就得要使用-n选项。
-o:后面可以接一些挂载时额外加上的参数!比方说账号、密码、读写权限等:
async, sync:此文件系统是否使用同步写入(sync)或异步( async)的内存机制,请参考文件系统运作方式。预设为async.
atime,noatime:是否修订文件的读取时间(atime)。为了效能,某些时刻可使用noatime
ro,rw:挂载文件系统成为只读( ro)或可擦写(rw)
auto,noauto:允许此 filesystem被以mount -a自动挂载(auto)
dev,nodev:是否允许此filesystem 上,可建立装置文件?dev为可允许
suid,nosuid:是否允许此filesystem含有suid/sgid的文件格式?
exec,noexec :是否允许此filesystem上拥有可执行 binary
文件?
user,nouser:是否允许此filesystem让任何使用者执行mount ?一般来说,mount仅有root可以进行,但下达user参数,则可让
一般user也能够对此partition进行mount
defaults :默认值为:rw,suid,dev,exec,auto,nouser,and async
remount :重新挂载,这在系统出错,或重新更新参数时,很有用!
有的文件系统需要进行挂载测试
挂载xfs/ext4/vfat等文件系统
挂载CD或DVD光盘
挂载vfat中文随身碟(USB磁盘)
1.重新挂载根目录与挂载不特定目录
根目录的挂载参数需要改变,根目录出现只读状态
1.重启
2.mount -o remount,rw,auto /
2.装置文件卸除
$ umount [-fn] 装置文件或挂载点
选项与参数:
-f:强制卸除!可用在类似网络文件系统(NFS)无法读取到的情况下
-1:立刻卸除文件系统,比 -f 还强!
-n:不更新letc/mt ab 情况下卸除。
使用df或mount查看是否存在目录树
#查看磁盘信息
$ mount /home
# 查看磁盘信息
$ df -h /home
3.6. 磁盘/文件系统参数修订
修改文件西的一些相关信息,如lable name
指令
- mknod
- xfs_admin
- tune2fs
具体指令用法需要用到时查阅
4 设定开机挂载
系统自动在开机时进行挂载