别人的Linux私房菜(8)Linux磁盘与文件系统管理

虚拟机的磁盘通常为:/dev/vd[a-p]

LVM和软件磁盘阵列 software RAID可以将一个分区格式化为多个文件系统或者多个分区格式化为一个文件系统。

索引式文件系统中:如ext2、ext3等

文件系统初始已经将inode和数据区块规划好,不再变动。

在磁盘的整体规划分区过程中,文件系统最前有启动扇区。之后为一个个块(block group)。在block group下有:

超级区块:记录文件系统的整体信息,数据区块与inode的总量(已使用,未使用)。区块大小(1k 2k 4k)。挂载时间。是否挂载有效位数值。

inode:记录文件的属性,一个文件占用一个inode。

文件读写属性,拥有者,大小,建立改变时间,最近读取时间,修改时间,文件uid,指向等。

inode大小在ext2中为128B。(ext4或xfs有256B)。inode记录一个区块使用4B。

inode区域定义了12个直接。1个间接,1个双间接,1个三间接。

以1k每block算,寻址大小为:1k*12+1024B/4B *1k  + (1024B/4B *1k)*1024/4*1k +  ((1024B/4B *1k)*1024/4*1k)*1024/4*1k =16G。

计算受到文件系统的影响会有差异。

数据区块:记录实际的文件内容 ,在ext2文件系统中,每个block的大小影响了最大磁盘容量和单文件的大小限制。

如block大小为1k(2k 4k),则单一文件最大16G,总容量最大2T。大小识别,还受到软件的限制。

文件系统描述说明

记录该区开始与结束位置,每个区段的位置,可以用dumpe2fs观察(ext2~4使用)xfs不能用。

区块对照表

记录使用的和未使用的区块

inode对照表

记录使用和未使用的inode号码

其它的文件系统:如fat格式,

每个区块号码记录在前一个文件区块中,像链表。可能磁盘转一圈无法获得所有的数据。需要碎片整理等。

ls -li列出文件占用的inode号码

建立目录和文件时,文件系统分配一个inode和至少一个区块给目录。

读取文件的流程为:读取相应的目录和区块,直到最后一层的文件。

新增文件首先确定目录权限wx,分配inode对照表和区块对照表,写入inode和数据区块。更新元数据(inode对照表和区块对照表,超级区块)

ext2之后的ext3和ext4加入了日志式文件系统,记录写入或修改文件的步骤,简化一致性检查的过程。e2fsck软件可以进行检查一致性。

系统会将内存中被改过的数据文件(dirty)不定时写回磁盘,保持磁盘与内存数据一致性。通过sync命令强制执行写回,正常关机执行了sync命令。

挂载点为目录,作为进入该文件系统的入口,通过inode判断不同文件名是否为相同文件

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

 cat  /proc/filesystems查看加载到内容的文件系统

别人的Linux私房菜(8)Linux磁盘与文件系统管理别人的Linux私房菜(8)Linux磁盘与文件系统管理

 Linux VFS(Virtual Filesystem Switch)的内核读取文件系统。

xfs文件系统配置:

数据区:包括了inode,数据区块,超级区块等,分成了多个存储区群组(allocation group),和ext系统的block group类似。

文件系统活动登录区:记录文件系统的变化。

实时运行区:文件系统建立过程中,暂时将文件放到这里,分配完毕后,写入数据区。

观察xfs超级区块的内容:

别人的Linux私房菜(8)Linux磁盘与文件系统管理

 df列出文件系统的整体磁盘使用量:

-h大小合理化显示,-i以inode数量显示  -T文件系统名称也列出,-a列出所有文件系统。

 别人的Linux私房菜(8)Linux磁盘与文件系统管理

-a列出的文件系统如/proc等,是系统数据,挂载到内存中不占用磁盘空间。

别人的Linux私房菜(8)Linux磁盘与文件系统管理

/dev/shm目录下的磁盘空间为物理内存的一半,利用内存模拟出来的磁盘,用来加速访问。

 别人的Linux私房菜(8)Linux磁盘与文件系统管理

 du命令,从文件系统中查找文件数据,分析当前目录下文件与目录占用的磁盘空间(单位1k)

相对慢。-s列出总量 -S不包括子目录下的总计(默认包括,则总量多加一次),-a列出所有(默认只列出文件夹下的文件占用) -m以M为单位显示

 别人的Linux私房菜(8)Linux磁盘与文件系统管理

硬链接在某个目录下新增一条文件名,该文件名链接到某inode号码

例如:ln /etc/crontab . 在同一个文件系统里,将硬链接加入,可以通过查看inode发现相同。大小和源文件相同。

删除硬链接,文件本身不删除。没有分配inode,只是写入了关联数据。

硬链接不能再不同的文件系统里链接,也不能链接目录。

符号链接,源文件删除,符号链接无法打开。

例如:ln -s  /etc/crontab /crontab2链接到文件,链接大小为文件名。分配新的inode。和windows的快捷方式类似。

建立新的目录时,新目录的链接数量为2  .  /.   上层的链接目录+1  /..

lsblk列出系统上的磁盘列表

设备文件名,MAJ主要设备代码,MIN次要设备代码,RM是否可卸载,SIZE大小,RO是否只读  TYPE类型 等

-i 使用ascii输出字符,-p列出设备完整名称等。-f列出文件系统名称(UUID /LABEL)

blkid列出设备的UUID(全局唯一标识符 universally unique identifier)

parted列出磁盘分区表类型和分区信息。

例如:parted /dev/sda print

MBR分区使用fdisk软件分区

GPT分区使用gdisk软件分区

n创建新分区等,用?查看软件命令提示。Code表示文件可能的类型。

通过n创建分区,根据提示下一步,l查看Linux文件系统的格式。

写入w,由于磁盘分区正在使用中,无法加载新的分区表。所以查看分区表信息:

cat /proc/partitions可以发现分区表信息没有更新。

通过partprobe -s可以更新Linux内核的分区表信息。

通过d可以删除分区,之后写入执行,然后通过partprobe -s继续更新分区信息

处理正在使用的分区,应先卸载再删除。

fdisk与gdisk类似。在使用前应使用lsblk和blkid等找到磁盘,使用parted xxx print找到文件系统类型对应操作。

分区完毕需要格式化:

磁盘格式化为xfs文件系统:

例如:mkfs.xfs /dev/sda4(-d设置参数  -f强制格式化)

agcount数量和cpu逻辑内核做搭配以增加速度。

mkfs.xfs -f -d agcount=2,su=256k,sw=7 -r extsize=1792k /dev/sda4

RAID将文件细分为小型区块stripe(4k到1M),这些小区块在磁盘阵列里,一个文件被写入多个磁盘,性能较好。会保留数个校验磁盘。

su大小设置和stripe匹配,磁盘阵列8块除掉校验盘剩余7块sw=7.extsize=swidth*7=1792k

mkfs.xfs -f -d agcount=2,sunit=512,swidth=3584 -r extsize=1792k /dev/sda4等等...通过数量单位的格式化。

mkfs.ext4可以将分区格式化为ext4的文件系统。

例如:mkfs.ext4 /dev/sda4  可以格式化为ext4格式

mkfs 【tab】可以查找其他文件系统格式 

也可以可以使用mkfs -t 【文件系统】 【设备】格式化设备

xfs文件系统错乱检验:

例如:xfs_repair /dev/sda4。如果无法检验尝试卸载后再处理。

fsck.ext4进行ext4的文件系统修复

查找每个区块群组的区块数量 如:dumpe2fs -h /dev/sda4 | grap 'Block per group'

之后强制检查一次:fsck.ext4 -b 32768 /dev/sda4

检查过程应在卸载状态

mount 文件系统的挂载:

通过blkid查看到uuid后,可以将文件系统通过:

mount UUID="xxxxxxxxxxxxx" /data/xfs  等类似挂载。

-o 加入挂载时的参数如编码等,账号密码读写权限等

 将根目录重新挂载并加入读写与auto

mount -o remount,rw, auto  /

将某目录暂时挂载到/data/var

mount --bind /var  /data/var

通过umount  data/var#通过挂载点卸载

umount /dev/sda4 #通过设备名卸载

通过文件的MAJOR (主要设备代码)和MINOR(次要设备代码) 的数值来代表设备,通过mknod修改

例如:mknod  /dev/sda4 b 252 10 设置b外接文件设备,p设置FIFO文件设备,c外接输入设备

通过xfs_admin修改xfs的文件系统UUID与Label name

如:umount  /dev/sda4 

uuidgen

xfs_admin -u /dev/sda4#列出UUID

xfs_admin -U xxxxxxxxxxx /dev/sda4#设置UUID

-l列出lable name  -L设置Label name

 tune2fs修改ext4的Label name 和UUID。具体man tune2fs

/etc/fstab#通过mount挂载后,写入该文件,为启动时的配置文件

显示为:设备名,挂载点,文件系统,文件系统参数,是否能被dump备份,是否以fsck检验扇区

实际文件系统被挂载到/etc/mtab和/proc/mounts

remount的rw可以进入单人模式的只读状态修改更新 fstab文件

挂载镜像文件:

使用 mount -o loop /tmp/xxxx.iso /data/centos_dvd将iso文件进行挂载

 通过dd建立大型文件

dd if=/dev/zero of=/srv/loopdev bs=1M count=512

输入为一直输入0的那个设备,输出为文件,每个块的大小为1M。总大小512M

 之后通过mkfs.xfs -f /srv/loopdev格式化

之后通过blkid查看uuid

之后通过mount -o loop UUID="xxxxxxxxx" /mnt进行挂载

之后通过df -h /mnt查看

别人的Linux私房菜(8)Linux磁盘与文件系统管理

创建新的分区后,通过mkswap创建内存交换分区

如:mkswap /dev/sda5

blkid /dev/sda5查看TYPE

通过free查看物理内存和swap

swapon /dev/sda5#启动

swapon -s 查看内存交换分区设备有哪些

 使用文件创建内存交换分区:

dd if=/dev/zero of=/tmp/swap bs=1M count=128

 mkswap /tmp/swap#启动

mkswap  -s查看。

swapoff关闭swap file并设置自动启动

如:swapoff  /tmp/swap /dev/sda5

nano /etc/fstab 设置后,

通过:swapoff  /tmp/swap /dev/sda5

swapon -a

swapon -s

设置启用。