Inode
Linux文件传统文件系统为Ext2,该文件系统内主要信息有:
superblock:记录此文件系统的整体信息,包括inode/block的总量、使用量、剩余量, 以及文件系统的格式与相关信息等;
inode:记录文件的属性权限类型等信息(统称为Meta data 元数据),一个文件占用一个inode,同时记录此文件的数据所在的block号;
block:实际记录文件的内容,若文件太大,会占用多个block;
释义
目录
目录是特殊的文件,保存了目录内文件与Inode之间的映射。
cp
- 分配一个空闲的inode号,在inode表中生成新条目
- 在目录中创建一个目录项,将名称与inode号关联
- 拷贝数据生成新的文件
rm
- 链接数递减,从而释放的inode号可被重复利用
- 把数据放在空闲列表中
- 删除目录项
- 数据实际上不会被马上删除,但当另一个文件使用block时将被覆盖
情景:提示空间快满,使用rm删除了很大的无用文件后,df仍看到空间不足,为什么,如何解决?
删除大文件方法
cat /dev/null > test.txt && rm -f test.txt
目的:删除大文件同时释放其占用的临时空间。
lsof | grep deleted
用于查找所有已经被删除但仍被某些进程打开的文件,这些文件在
lsof
的输出中会特别标注为(deleted)
,以示它们已经从文件系统中删除,但由于某些进程仍然持有文件描述符,所以它们实际上还没有被释放。COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
cat 12345 username 20r REG 0,1 95843 123456789 /path/to/deleted/file (deleted)
mv
- mv命令的目标和源在相同的文件系统
- 用新的文件名创建对应的目录项
- 删除旧目录条目对应的旧的文件名
- 不影响inode表或磁盘上的数据位置,没有数据被移动
- 源和目标在不同的文件系统,相当于cp和rm
磁盘与目录的容量
常用命令:
df:列出文件系统的所占用的磁盘空间。
- -a :列出所有的文件系统,包括系统特有的/proc等文件系统。
- -h :以易读的形式显示出来(KB,MB,GB等格式)。
- -i :以inode数量来显示。
du:查看文件或目录所占用的磁盘空间。
- -h :以易读的形式显示出来。
- -s :列出总量,不列出每个文件或目录占用空间。
实体链接与符号链接
实体链接:Hard Link 硬链接。不能跨文件系统,不能link目录。源文件被删除后依旧能使用。
符号链接:Symbolic Link 软链接。相当于快捷方式。源文件被删除后不能使用。
常用命令:
ln [选项] 来源文件 链接文件
- -s:加此参数为软链接;不加参数默认为硬链接。
- -f:如果链接文件存在,就将移除旧文件建立新链接文件。
磁盘的使用必须经过分区、格式化、挂载。
查看磁盘分区
lsblk:查询磁盘列表。
-p:显示全路径
blkid:查询设备或文件系统的UUID。
parted:查询磁盘分区表类型与分区信息。
命令:parted 设备名称 print
无需重启检测新加硬盘
Linux系统都是通过SCSI子系统进行管理磁盘,无论是SCSI、SATA、NVME等。
第一步:列出当前系统中所有的SCSI主机总线
[root@wenzi ~]$ls /sys/class/scsi_host/
host0 host1 host2
第二步:使各个 hostx 总线重新扫描其下连接的设备
有几个 hostx 写几次
[root@wenzi ~]$echo "- - -" > /sys/class/scsi_host/host0/scan
[root@wenzi ~]$echo "- - -" > /sys/class/scsi_host/host1/scan
[root@wenzi ~]$echo "- - -" > /sys/class/scsi_host/host2/scan
最后再查看fdisk -l 查看即可
磁盘分区
parted:操作都是实时生效的,无交互式确认
parted [选项] ... [设备 [命令 [参数]...]...]
常用选项:
-l:显示所有硬盘分区信息
-s:不输出提示信息
常用子命令:
align-check TYPE N:检查分区是否满足对齐(最小|最佳)类型的对齐
mklabel 或 mktable LABEl-TYPE:指定磁盘的分区类型 gpt或msdos(mbr)
mkpart PART-TYPE [FS-TYPE] START END:新建分区,指定分区类型,文件系统,开始位置、结束位置
name NUMBER NAME:重命名指定分区
print [devices|free|list,all|NUMBER]:显示
quit:退出
rescue START END:空间碎片整理
resizepart NUMBER END:重置分区大小
rm NUMBER:删除指定分区
select DEVICE:选择设备
unit UNIT:设置默认单位,默认MB,可选B|KB|MB|GB|TB
fdisk:MBR分区表分区工具
fdisk [选项] 硬盘
-b:指定分区大小
-l:显示指定硬盘或分区信息
-o:只显示指定列
-u:指定显示的单位,默认是sectors,可选 cylinders 或 sectors
-t:只显示指定类型的分区表
交互过程中常用选项:
p:输出分区列表
t:更改分区类型
n:创建新分区
d:删除分区
v:校验分区
u:转换单位
w:保存并退出
q:不保存退出
x:高级功能
gdisk:GPT分区表分区工具
gdisk [-l] device
交互过程中常用选项:
c:修改分区名
d:删除分区
i:显示分区详细信息
l:列出所有分区类型
n:新建分区
p:查看分区
t:修改分区类型,默认8300,表示普通分区
q:退出
w:保存退出
x:高级功能
同步分区表
CentOS7/8
partprobe 命令重新加载分区信息。
CentOS6
如:partx -a /dev/sda
磁盘格式化
磁盘格式化=建立文件系统
mkfs.XXX 分区名
包含mke2fs功能,更通用。
例:mkfs.xfs /dev/sda1 、 mkfs.ext4 /dev/sda2
mke2fs -t [ext2或ext3] 分区名
ext系列文件系统专用工具
例:mke2fs -t ext3 /dev/sda1
其它相关
tune2fs [选项] 设备
重新设定ext系列文件系统可调整参数的值
-l:查看指定文件系统信息
-L label:修改卷标
-m N:修改预留给管理员的空间百分比
-j:将ext2升级为ext3
-U uuid:修改uuid号
文件系统检查/修复
xfs文件系统
xfs_info 挂载点\设备名
显示已挂载的xfs文件系统信息
xfs_repair 【-fnd】 分区名称
- -f 后面跟文件,而不是分区
- -n 单纯检查并不修改文件系统数据
- -d 允许修复只读的挂载设备,通常在单人模式,针对/根目录进行检查与修复,然后立即reboot。危险,不要随便使用
xfs_repair /dev/sda3
xfs_repair /dev/centos/home
xfs_repair /dev/mapper/centos_hk1–h2–074-home
ext4文件系统
fsck.xxx [选项] 分区名
包含e2fsck,更通用
- -a:自动修复
- -r:交互式修复错误
- -p 当文件系统修复时,如有需要回复y的动作,自动回复y来继续
- -f 强制检查
例:fsck.ext4 /dev/sda4
ext系列文件系统
e2fsck [选项] 分区名
-y:自动回答为yes
-f:强制修复
-p:自动进行安全的修复文件系统问题
注意:
- 通常只有身为root且文件系统有问题时才使用repair/fsck命令,正常情况下使用,会造成系统损害。通常在单人模式下进行。
- 检查修复已经挂载的文件系统需要先卸载该文件系统,再检查修复,再恢复挂载。
文件系统挂载与卸载
挂载点的意义即通过挂载点进入磁盘分区槽(文件系统)
- 单一文件系统不应被重复挂载在不同挂载点。
- 单一目录不应该重复挂载多个文件系统。
- 要作为挂载点的目录,理论上都应该为空目录。若不是空目录,则旧目录信息会暂时隐藏,显示新挂载文件系统的内容,当卸载此文件系统后旧目录信息会恢复。
查看挂载信息
mount
[root@wenzi ~]#mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
......
/dev/sda1 on /boot type ext4 (rw,relatime,data=ordered)
tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,size=186300k,mode=700)
cat /etc/mtab
[root@wenzi ~]#cat /etc/mtab
sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0
proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0
......
/dev/sda1 /boot ext4 rw,relatime,data=ordered 0 0
tmpfs /run/user/0 tmpfs rw,nosuid,nodev,relatime,size=186300k,mode=700 0 0
cat /proc/mounts
[root@wenzi ~]#cat /proc/mounts
sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0
proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0
......
/dev/sda1 /boot ext4 rw,relatime,data=ordered 0 0
tmpfs /run/user/0 tmpfs rw,nosuid,nodev,relatime,size=186300k,mode=700 0 0
查看正在访问指定文件系统的进程
lsof 挂载点
fuser -v 挂载点
终止所有正在访问指定文件系统的进程
fuser -km 挂载点
挂载
mount -a 根据配置文件 /etc/fstab 的数据将所有未挂载的磁盘都挂载上。
mount 装置文件名 挂载点
mount UUID=” 挂载点
卸载
umount 装置文件名/挂载点
设定开机挂载
开机挂载需要修改 /etc/fstab 文件。文件内容格式:
【装置/UUID】 【挂载点】 【文件系统】 【文件系统参数】 【dump】 【fsck】
/dev/mapper/centos-root / xfs defaults 0 0
UUID=94ac5f77-cb8a-495e-a65b-2ef7442b837c /boot xfs defaults 0 0
注意:
- 根目录/是必须挂载的,并且是第一个被挂载的。
- 挂载点必须是已建立的目录,可任意指定,但一定要遵守FHS目录架构原则。
- 所有挂载点在同一时间只能挂载一次。
- 所有分区在同一时间只能挂载一次。
- 如需卸载挂载点,当前工作目录不能是该挂载目录。
重新挂载
修改 /etc/fstab 文件中的挂载规则后,无法通过mount -a 生效。要执行挂载
mount -o remount 挂载点
挂载光盘/DVD
mount -o loop 光盘或DVD目录 /挂载点
mount -o loop /tmp/centos7.iso /data/centosdvd
创建一个大型文件实现挂载特殊文件loop的挂载
创建一个512M大型空文件
dd if=/dev/zero of=/srv/loopdev bs=1M count=512
格式化此文件
mkfs.xfs -f /srv/loopdev
挂载
mount /srv/loopdev 挂载点
内存置换空间(swap)的建立
swap交换分区是系统RAM的补充。当没有足够的RAM保存系统处理的数据时会将数据写入swap分区,当系统缺乏swap时,内核会因为RAM耗尽而终止进程
系统物理内存RAM | 推荐swap空间 |
<=2GB | 2倍的RAM |
2GB ~ 8GB | 等于RAM |
8GB ~ 64GB | 4GB 至 RAM的0.5倍 |
swapon:启用交换分区
swapon [选项] [目标]
选项:
-a:激活 /etc/fstab 中所有的交换分区
-s:显示已使用的交换分区信息
目标:
-U uuid:指定UUID
device:要使用设备的名称
filename:要使用的文件名称
swapoff:禁用交换分区
swapoff [选项] [目标]
选项:
-a:禁用 /proc/swaps 中所有的交换分区
-v:显示过程
目标:
-U uuid:要使用设备的UUID
device:要使用设备的名称
filename:要使用的文件名称
实体分区建立swap
- 使用 fdisk 或 gdisk 建立分区,GUID为8200,partprobe 重新加载分区。
- 使用 mkswap 分区名 格式化为swap格式。
临时
- 使用 swapon 分区名 使用swap。
- 使用 free 和 swapon -s 这个指令观察内存。
- 使用 swapoff 分区名 关闭swap。
永久
- 在 /etc/fstab 添加相关条目
- 使用 swapon -a 激活交换空间
查看现有磁盘空间,使用/dev/sdb创建新的swap
[root@wenzi ~]#lsblk -p
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
/dev/sda 8:0 0 20G 0 disk
├─/dev/sda1 8:1 0 1G 0 part /boot
├─/dev/sda2 8:2 0 2G 0 part [SWAP]
└─/dev/sda3 8:3 0 17G 0 part /
/dev/sdb 8:16 0 20G 0 disk
/dev/sr0 11:0 1 1024M 0 rom
创建新swap的挂载点 /newswap
[root@wenzi ~]#mkdir /newswap
从/dev/sdb中划分2GB作为swap分区
[root@wenzi ~]#fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x6af4854b.
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):
Using default response p
Partition number (1-4, default 1):
First sector (2048-41943039, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +2G
Partition 1 of type Linux and of size 2 GiB is set
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@wenzi ~]#lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 2G 0 part [SWAP]
└─sda3 8:3 0 17G 0 part /
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 2G 0 part
sr0 11:0 1 1024M 0 rom
格式化为swap文件系统
[root@wenzi ~]#mkswap /dev/sdb1
Setting up swapspace version 1, size = 2097148 KiB
no label, UUID=7b86c860-787e-4626-8dfe-2d0049f60097
编辑/etc/fstab
[root@wenzi ~]#\cat /etc/fstab
...
UUID=7b86c860-787e-4626-8dfe-2d0049f60097 /newswap swap defaults 0 0
挂载swap
[root@wenzi ~]#swapon -a
查看已使用的swap
[root@wenzi ~]#swapon -s
Filename Type Size Used Priority
/dev/sda2 partition 2097148 0 -2
/dev/sdb1 partition 2097148 0 -3
[root@wenzi ~]#lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 2G 0 part [SWAP]
└─sda3 8:3 0 17G 0 part /
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 2G 0 part [SWAP]
sr0 11:0 1 1024M 0 rom
使用策略
/proc/sys/vm/swappiness 的值决定了内存占用达到一定的百分比时,会启动swap。
规则
当内存使用率达到 100-swappiness 时,会启用swap。
swappiness值越大,越倾向于使用swap;为0时,最大限度降低使用swap的可能性,并非禁用swap。
修改
CentOS7/8默认的swappiness值是30,即当内存使用率达到70时,启用swap
[root@wenzi ~]#cat /proc/sys/vm/swappiness
30
[root@wenzi ~]#vim /etc/sysctl.conf
vm.swappiness=0
生效 sysctl -p