目录
1.inode记录的数据
文件的属性、拥有者与用户组、文件大小、mtime、atime、ctime、定义文件特性的标识、文件真正内容指向
每个inode 大小固定
每个文件仅会占用一个inode
系统读取文件时会先找到inode
2.超级区块的记录
数据区块与inode总量
未使用与已使用的inode与数据区块数量
数据区块与inode的大小
文件系统挂载时间、最近一次写入数据的时间、最近一次检验磁盘的时间等文件系统的相关信息
一个有效位数值,若此文件系统已被挂载,则有效位为0,否则为1
dumpe2fs -b 设备文件名 列出保留为坏道的部分(迷...)
-h 设备文件名 仅列出superblock 的数据,不会列出其他的区段内容
3.数据区块的记录
记录数据的实际内容
每创建一个目录,文件系统会分配一个inode 与至少一个区块
4.磁盘分区并不是越大越好,如果文件系统空间很大,数据写入将会变成填入式,导致文件写入的区块很分散,读取时磁盘转动幅度大,读取性能会降低
5.linux文件系统的运行
简单的说,一个文件加载到内存后,会被标记为 clean ,当数据改动后,则会变为 dirty ,系统会不定时的将内存中的dirty数据写回磁盘
系统会将常用的文件数据放入内存的缓冲区,以加速文件系统的读写操作
因此,linux的物理内存最后会被用光,这是正常现象,可加速系统性能
可手动写回数据,正常关机也会写回,非正常关机则不会
6.挂载(文字简介)
将文件系统与目录树结合的操作为挂载(目录树的介绍可查看第五章最后)
一个可以被挂载的数据通常称为文件系统而不是硬盘分区
挂载点一定是目录
xfs文件系统的顶层目录inode一般为128号,inode同为128且文件属性不同,则挂载点也不同
7.linux支持的文件系统
通过
ls -l /lib/modules/$(uname -r)/kernel/fs
查看,通过
cat /proc/filesystems
查看已加载到内存中支持的文件系统
8.XFS文件系统简介
对linux支持度最完整的ext系列格式化超慢,采用预先规划的方法,适合小磁盘容量
而xfs这个被开发来用于高容量磁盘以及高性能文件系统之用的日志式文件系统相当适合现在的系统环境
xfs文件系统的三个部分:
数据区:与ext系列的区块群组类似,不过xfs中的inode与区块是动态分配的,不是预先规划的
文件系统活动登陆区:系统所有操作会在这个区块记录,文件系统因某些缘故挂掉后,系统会拿这个登陆区来检验修复
实时运行区:有文件要被建立时,xfs会在这个区段里面找一个或数个extent区块,将文件放置于此,待文件属性分配完毕后再写入到inode与区块中
通过 tune2fs 查看ext 文件系统的信息
通过 xfs_info 观察文件系统的描述数据(无法使用此命令的问题已放入 问题总结)
先通过
[root@zjwLinux ~]# df -T /
Filesystem Type 1K-blocks Used Available Use% Mounted on
/dev/nvme0n1p5 xfs 244199936 6915460 237284476 3% /
查看 / 的分区及文件系统(xfs_info 命令需要下载,见 “问题总结” 文章)
[root@zjwLinux ~]# xfs_info /dev/nvme0n1p5
meta-data=/dev/nvme0n1p5 isize=512 agcount=16, agsize=3817488 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=1 inobtcount=1
data = bsize=4096 blocks=61079808, imaxpct=25
= sunit=4 swidth=32 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=29824, version=2
= sectsz=512 sunit=4 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
第一行的 isize 为 inode容量,agcount 为存储区群组16个,agsize 为每个存储区群组有3817488个区块
第二行 sectsz为逻辑扇区容量
第五行bsize 为区块的容量 4K
第六行 sunit和 swidth 与磁盘阵列的stripe相关性较高
第八行 internal 指的是这个登陆区的位置在文件系统内,占用了 4K*29824的容量
第十行 realtime 里面的 extent 容量为 4K ,目前未使用
9.磁盘与目录的容量
df 列出文件系统的整体磁盘使用量
-a 列出所有的文件系统,包括系统特有的/proc 等
-k 以KBytes 的容量显示各文件系统
-m 以MBytes显示
-h human-readable
-H 切换十进制
-T 连同文件系统名一起显示
-i 不用容量显示,用inode数量显示
du 查看文件系统的磁盘使用量
-a 列出所有文件与目录容量
-h
-s 仅列出总量,不列出每个个别目录占用量
-S 不包括子目录的总计
-k
-m
[root@zjwLinux ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
dev 8133472 0 8133472 0% /dev
run 8144020 1420 8142600 1% /run
/dev/nvme0n1p5 244199936 6930856 237269080 3% /
tmpfs 8144020 380 8143640 1% /dev/shm
tmpfs 8144020 8 8144012 1% /tmp
/dev/nvme0n1p3 1046512 72332 974180 7% /boot
tmpfs 1628804 32 1628772 1% /run/user/1000
Filesystem 代表该文件在哪个硬盘分区
1K-blocks 单位为1KB
Mounted on 挂载点
10.文件链接
硬链接
在这之前需要知道的是文件的内容是由inode的记录指向的,而硬链接则是多个文件名对应同一个inode,所以硬链接的两个文件是同一个文件,属性内容都相同,删除其中一个,inode与区块都存在,可通过另外一个来操作
ln 源文件 目标文件
硬链接的限制:不能跨文件系统,不能链接目录
符号链接
与硬链接不同,这是一个单独的文件,有独立的inode,这个文件会让数据指向它链接的那个文件的文件名,源文件被删除后,符号链接就会打不开。链接文件的大小等于被链接文件名,如
[root@zjwLinux ~]# ln -s /etc/vimrc testvimrc
[root@zjwLinux ~]# ls -l testvimrc
lrwxrwxrwx 1 root root 10 Jul 4 15:38 testvimrc -> /etc/vimrc
10即为 /etc/vimrc 名称所占字节数
ln 默认硬链接
-s 符号链接
-f 若目标文件存在,则主动删除目标文件重新建立
当建立新的目录时,目录的链接数为2,上层目录链接数加1
12.磁盘分区观察
lsblk 列出存储设备
-d 仅列出磁盘本身,不会列出磁盘的分区数据
-f 同时列出该磁盘内的文件系统名称
-i 使用ASCII字符输出
-m 同时输出设备在/dev 下的rwx信息
-p 列出设备的完整文件名
-t 列出该磁盘设备的详细数据,包括磁盘阵列机制、欲读写数据量大小等
blkid 列出设备的UUID(lsblk -f 也可以)
parted devicename paint 查看磁盘相关信息
[root@zjwLinux tmp]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
nvme1n1 259:0 0 476.9G 0 disk
├─nvme1n1p1 259:1 0 260M 0 part
├─nvme1n1p2 259:2 0 16M 0 part
├─nvme1n1p3 259:3 0 100G 0 part
├─nvme1n1p4 259:4 0 375.7G 0 part
└─nvme1n1p5 259:5 0 1000M 0 part
nvme0n1 259:6 0 465.8G 0 disk
├─nvme0n1p1 259:7 0 16M 0 part
├─nvme0n1p2 259:8 0 215.7G 0 part
├─nvme0n1p3 259:9 0 1G 0 part /boot
├─nvme0n1p4 259:10 0 16G 0 part [SWAP]
└─nvme0n1p5 259:11 0 233G 0 part /
默认输出下会仅列出最后的名字,省略 /dev
MAJ:MIN:主要与次要设备代码,内核识别的设备通过这两个代码实现
RM:是否为可卸载设备如光盘、USB磁盘等
RO:是否为只读设备
TYPE:磁盘(disk)、分区(partition)、只读存储器(rom)等
13.磁盘分区(我的为gpt分区,所以使用gdisk)
切忌随便按 w
Command (? for help): p
Disk /dev/nvme0n1: 976773168 sectors, 465.8 GiB //总扇区
Model: Samsung SSD 980 500GB
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): E73421BB-3890-4E5F-9001-BCA16B47B8F3
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 976773134
Partitions will be aligned on 8-sector boundaries
Total free space is 15 sectors (7.5 KiB)
Number Start (sector) End (sector) Size Code Name
1 34 32767 16.0 MiB 0C01 Microsoft reserved ...
2 32768 452483071 215.7 GiB 0700 Basic data partition
3 452483072 454580223 1024.0 MiB EF00
4 454580224 488134655 16.0 GiB 8300
5 488134656 976773119 233.0 GiB 8300
分区编号 开始扇区 结束扇区
由于我在分区时没有预留空间,导致无法进行新增分区操作,不过流程大致如此
首先新增分区命令为n,在command中键入n执行分区命令
Command (? for help): n
Partition number (6-128, default 6):
分区编号,默认对应于原先磁盘分区
Command (? for help): n
Partition number (6-128, default 6):
First sector (976773120-976773134, default = 976773120) or {+-}size{KMGTP}:
开始扇区,默认为之前分区结束扇区+1
Command (? for help): n
Partition number (6-128, default 6):
First sector (976773120-976773134, default = 976773120) or {+-}size{KMGTP}:
Last sector (976773120-976773134, default = 976773127) or {+-}size{KMGTP}:
结束扇区,不需要我们手动输入扇区号码,只需通过+-容量大小,系统自动帮我们计算扇区
Command (? for help): n
Partition number (6-128, default 6):
First sector (976773120-976773134, default = 976773120) or {+-}size{KMGTP}:
Last sector (976773120-976773134, default = 976773127) or {+-}size{KMGTP}: +1G
Last sector (976773120-976773134, default = 976773127) or {+-}size{KMGTP}:
注意,当想要新增的容量大于剩余容量时,需要重新输入
Command (? for help): n
Partition number (6-128, default 6):
First sector (976773120-976773134, default = 976773120) or {+-}size{KMGTP}:
Last sector (976773120-976773134, default = 976773127) or {+-}size{KMGTP}: +1G
Last sector (976773120-976773134, default = 976773127) or {+-}size{KMGTP}: +1K
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300):
选择文件系统,默认是linux文件系统的8300(swap为8200。回车即可完成创建
Command (? for help): p
Disk /dev/nvme0n1: 976773168 sectors, 465.8 GiB
Model: Samsung SSD 980 500GB
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): E73421BB-3890-4E5F-9001-BCA16B47B8F3
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 976773134
Partitions will be aligned on 8-sector boundaries
Total free space is 13 sectors (6.5 KiB)
Number Start (sector) End (sector) Size Code Name
1 34 32767 16.0 MiB 0C01 Microsoft reserved ...
2 32768 452483071 215.7 GiB 0700 Basic data partition
3 452483072 454580223 1024.0 MiB EF00
4 454580224 488134655 16.0 GiB 8300
5 488134656 976773119 233.0 GiB 8300
6 976773120 976773121 1024 bytes 8300 Linux filesystem
查看一下新增分区 6
删除分区:在command行中输入p查看分区信息,利用命令d来删除对应编号的分区
MBR文件系统的fdisk与GPT类似
利用 partprobe 在不重启系统的情况下更新linux内核的分区信息
partprobe -s (不加 -s 则不会显示信息)
14.磁盘格式化(创建文件系统)
XFS文件系统格式化:
mkfs.xfs -b 接区块容量
-d 接data section的相关参数值
agcount= 设置需要几个存储群组,通常与CPU个数相同
(可用 grep 'processor' /proc/cpuinfo 查看CPU)
agsize= 每个存储群组容量,通常 agcount与agsize选一个就好
file 格式化的设备是个文件,而不是真正的设备,如虚拟磁盘
size= data section的容量
su= 当有RAID时,stripe的数值
sw= 当有RAID时,用于保存数据的磁盘数量(须扣除备份盘与备用盘)
sunit= 与与su一样,不过单位是几个sector
swidth= 就是su*sw,不过单位为几个sector
-L 接文件系统的标头名称
-r 指定realtime section的相关设置值
一般来说默认就行
ext4文件系统格式化:
mkfs.ext4 -b 设置区块大小
-L 接标头名
15.文件系统的检验
当文件系统发生错乱时,可通过文件系统的恢复命令来恢复
XFS文件系统
xfs_repair -f 后面的是文件而非实体设备
-n 单纯检查
-d 通常用在单人维护下,针对 / 进行检查与修复,不要随意使用
ext4文件系统
fsck.ext4 -p 文件修复过程中自动执行 yes
-f 强制检查
-D 针对文件系统下的目录进行最佳化配置
-b 接备份的超级区块位置,可利用文件系统内备份的超级区块来尝试恢复损坏的超级区块
16.文件系统的挂载与卸载
注意:单一文件系统不应该被重复挂载在不同的挂载点
单一目录不应该重复挂载多个文件系统
作为挂载点的目录理论上都应该是空白目录(若不是空白目录,挂载上去后,原内容将会暂时消失,并非覆盖,待文件系统卸载后内容将重现)
mount -a 按照 /etc/fstab 将所有未挂载的磁盘都挂载
-l 增列Label名称 (执行了一下发现没有变化...)
-t 接文件系统的种类来指定欲挂载类型如 xfs、ext系列等
-n 默认情况下系统会将挂载信息及时写入 /etc/fstab ,此命令不会写入
-o 接额外参数
async,sync 是否非同步写入,同步写入,默认async非同步
atime,noatime 是否修改文件读取时间
ro,rw 挂载为只读,可读写(若挂载为只读,即使文件系统文件有w都无法写)
auto,noauto 是否可以被自动挂载
dev,nodev 是否允许可以建立设备文件
suid,nosuid 是否允许含有 suid/sgid 的文件格式
exec,noexec 是否允许拥有可执行二进制文件
user,nouser 是否允许让任何user执行mount
defaults 默认值为 rw,suid,dev,exec,auto,nouser,async
remount 重新挂载,用于系统出错或更新参数
mount -n -o remount,rw / 用于进入单人维护模式后根目录只读挂载
mount -o loop 文件所在位置 挂载点 用于挂载特殊设备如iso等
挂载文件系统时可用设备文件名,也可用UUID(可用blkid查看)
mount 设备文件名(也可以 UUID="") 挂载点
光驱的挂载类似,一挂载就无法退出光盘,需要卸载(现在的电脑一般都没有光驱了)
USB挂载,如果是中文文件名,需要加上 -o codepage=950, iocharset=utf8(或者big5)
950是中文语系的代码,iocharset为设置中文是utf-8编码还是Big5
当根目录出现只读状态时,则需要用到 mount -o remount,rw,auto /
可以利用 mount将一个目录暂时挂载到另外一个目录上,与符号链接的作用一样,但是有些程序运行不支持符号链接 mount --bind 源目录 目标目录
umount -f 强制卸载
-l 立刻卸载,比 -f 还强
-n 不更新 /etc/mtab 的情况下卸载
利用挂载点来卸载 umount /data/var
17,自定义硬盘/文件系统参数
mknod 设备文件名 b [Major] [Minor]
设置设备名称成为一个外接存储设备文件
c 设置设备名称成为一个外接输入设备文件
p 成为一个FIFO文件
Major为主要设备代码 Minor为次要设备代码
首先需要用 ls -l 查看设备代码,建立设备文件时要正确设置设备代码
利用 xfs_admin 修改XFS文件系统的UUID与标头
xfs_admin -lu 设备文件名
列出标头与UUID
-L 标头 设备文件名
-U UUID 设备文件名
设置标头与UUID
利用uuidgen 可自动产生一个 UUID
可通过 mount LABEL=或UUID= 挂载点 来挂载
利用 tune2fs 修改 ext4的标头与UUID
tune2fs -L(-U)
-l 类似dumpe2fs -h的功能
18.挂载(设置为自动挂载)
挂载的一些限制:首先根目录一定要第一个挂载(对应于安装linux时,所有磁盘分区都格式化后,先挂载根目录分区到 /mnt,然后再在/mnt中创建其他目录作为挂载点挂载其他分区);所有挂载点与硬盘分区在同一时间内只能挂载一次;卸载前必须将工作目录移出挂载点
将文件系统设置为开机自动挂载,则要在 /etc/fstab 中配置
UUID="" 挂载点 文件系统 文件系统参数(默认) dump(0) fsck(0)
设置完后,一定要 mount -a 一下,看看是否挂载成功
若分区太大,可以建立大文件格式化并挂载成为另一个分区,就跟windows的磁盘分区一样
以鸟哥的例子来看,在 /srv/loopdev 建立一个空的文件
dd if=/dev/zero of=/srv/loopdev bs=1M count=512
if为 input file,of为output file,bs为block size,count为block的个数
建立完后,格式化,mount -o loop 挂载。若想开机自动挂载则再写入 /etc/fstab (写入时用文件名,系统查询时仅会查询区块设备)
19.创建内存交换分区
使用物理分区创建:
与正常分区流程一样
gdisk 磁盘
mkswap 设备文件名
swapon 设备文件名
使用大文件创建:
在/tmp中创建一个 128MB的文件
dd if=/dev/zero of=/tmp/swap bs=1M count=128
mkswap ...
swapon ...
创建完交换分区后可以用 free [-h] 查看内存使用情况,或者 swapon -s 查看
卸载交换分区挂载的操作为 swapoff
注意,用大文件的方式创建交换分区时,写入 /etc/fstab时不可用UUID
20.磁盘空间的浪费
ls 命令查看到的第一行的 total 即为消耗总容量(该目录下所有数据消耗的实际区块数量*区块大小),大部分情况下目录下数据容量总和应该小于total的量(total统计的是该目录下所有文件的占用量)
21.利用parted 分区
虽然GPT用gdisk,MBR用fdisk,但是当需要用到脚本文件进行全部分区时,就需要用到parted!
parted 设备 命令 参数
新增分区:mkpart [primary|logical|Extended] [ext4|xfs|vfat] 开始容量 结束容量
显示分区:print
删除分区:rm [partition]
具体命令可以键入 parted 进入命令行,输入help查看
首先可用 parted 设备 print 查看磁盘信息,与gdisk或fdisk类似
(鸟哥的例子)例如在 /dev/vda下分出一个 512MB容量的分区
parted /dev/vda mkpart primary fat32 36.0GB 36.5GB
从36G到36.5G正好512M
格式化为vfat
mkfs -t vfat /dev/vda7 或者 mkfs.vfat /dev/vda7
暂挂于 /data/win
mount /dev/vda7 /data/win