Linux中的文件系统管理

1、格式化

低级格式化:分区之前进行,划分磁道、形成簇,硬件制造商出厂之前做;
高级格式化:分区之后对分区进行,创建文件系统。

2、元数据区和数据区

文件系统分为元数据区和数据区。
元数据区存放文件元数据(inode (index node)),元数据指文件的大小、权限、属主属组、时间戳、数据块指针,而不包含文件名,文件名在目录上存放,inode存放inode编号和数据块指针,数据区的目录存放文件名和inode编号的对应关系。文件名存放在上级目录中。
删除文件的操作即是将此文件inode指向的所有data block标记为未使用状态,将此文件的inode标记为未使用,以及修改data block和inode位图。
复制文件的操作即是新建文件。而移动文件的操作,在同一文件系统中,改变的仅是其路径映射,inode还是那个值,在不同文件系统中,复制数据至目标文件,并删除原文件。
符号链接文件:存储数据块指针的空间当中存储的是真实文件的访问路径,不占据磁盘的数据区域,是一种特殊文件类型。
设备文件:存储数据指针的空间当中存储的是设备号(major, minor),不占据磁盘的数据区域,是一种特殊文件类型。
位图索引(bitmap index):每一位对应一个数据块或者一个inode,在块组级别实现,数据块位图索引位为1代表该数据块已占用,为0代表该数据块未占用,inode位图索引位为1代表该inode已占用,为0代表该inode未占用。
超级块:定义一共有多少个块组,每个块组从哪个编号开始,哪个编号结束。

3、超级块

超级块(superblock)的作用是存储文件系统的大小,有多少是空的,已经填满的占多少,以及它们各自的总数等等。要使用一个分区来进行数据访问,第一个要访问的就是超级块,如果超级块损坏了,磁盘就不可用了。
超级块占用第1号物理块,是文件系统的控制块,超级块包括:文件系统的大小、空闲块数目、空闲块索引表、空闲i节点数目、空闲i节点索引表、封锁标记等。超级块是系统为文件分配存储空间、回收存储空间的依据。
所以为了防止超级块数据损坏,就需要对超级块数据进行备份,以便于损坏时可以恢复。

4、文件系统

Linux的内核级文件系统:ext2(无日志功能),ext3(CentOS 5默认文件系统),ext4(CentOS 6默认文件系统),xfs(CentOS 7默认文件系统,为企业级64位文件系统,单个文件大小没有上限)reiserfs(反删除性能好,文件删掉找回比较容易),btrfs(实验阶段,没有生产可用)。
内核级文件系统的组成部分:
(1)文件系统驱动:由内核提供;
(2)文件系统管理工具:由用户空间的应用程序提供。
光盘文件系统:iso9660。
网络文件系统:nfs,cifs(smbfs)。
集群文件系统:gfs2,ocfs2。
内核级分布式文件系统:ceph。
用户空间的分布式文件系统:mogilefs,moosefs,glusterfs。
Windows的文件系统:vfat(fat32),ntfs。
伪文件系统:proc,sysfs,tmpfs,hugepagefs。
Unix的文件系统:UFS, FFS(快速文件系统), JFS(日志文件系统)。
交换分区文件系统:swap。
根据其是否支持日志功能还可分为:
日志型文件系统:ext3,ext4,xfs;
非日志型文件系统:ext2,vfat。

5、硬链接与符号链接

链接文件:访问同一个文件的不同路径。
(1)硬链接:指向同一个inode的多个文件路径;
硬链接特性:
1)目录不支持硬链接,为了避免循环链接;
2)硬链接不能跨文件系统,不同文件系统inode是独立计数的;
3)创建硬链接会增加inode引用计数;ls -l结果中权限后面的数字即为inode引用计数;当inode的引用计数减少到0,表明没有文件名指向这个inode,系统就会回收这个inode号码以及其所对应的block区域。
注意:硬链接文件和原文件大小相同。
创建硬链接:ln src link_file

目录文件的链接数
创建目录时,默认会生成两个目录项:".“和”…"。前者的inode号码就是当前目录的inode号码,等同于当前目录的硬链接。后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的硬链接。所以,任何一个目录的硬链接总数,总是等于2加上它的子目录总数(含隐藏目录),这里的2是父目录对其的硬链接和当前目录下"."的硬链接。

(2)符号链接:指向一个文件路径的另一个文件路径,权限是777,即lrwxrwxrwx。
符号链接特性:
1)符号链接与原文件是两个各自独立的文件,各有自己的inode;对原文件创建符号链接不会增加引用计数;
2)支持对目录创建符号链接,可以跨文件系统;
3)删除符号链接文件不影响原文件,但删除原文件,符号链接指定的路径即不存在,此时会变成无效链接;
注意:符号链接文件的大小是其指向的文件的路径字符串的字节数,删除原文件后,符号链接指向的文件会闪,当创建了与原文件相同名字的文件,不管是不是原文件的内容,符号链接也可以指向了。
创建符号链接:ln -s src link_file
-v:verbose 创建硬链接和符号链接都支持-v选项,显示过程。

如果链接的是目录,或者原文件与链接文件在不同的文件系统,使用符号链接。如果原文件与链接文件在同一个文件系统,可以使用符号链接或硬链接。

6、文件系统管理工具

创建文件系统的工具mkfs:mkfs.ext2,mkfs.ext3,mkfs.ext4,mkfs.xfs,mkfs.vfat。
检测及修复文件系统的工具fsck:fsck.ext2,fsck.ext3,fsck.ext4,fsck.xfs,fsck.vfat。
查看文件系统属性的工具:dumpe2fs,tune2fs。
调整文件系统特性的工具:tune2fs。

!cat 调用最近一次的cat命令

(1)ext系列文件系统的管理工具
mkfs.ext2,mkfs.ext3,mkfs.ext4:可以向后兼容,即可以兼容较老版本;
mkfs -t ext2 = mkfs.ext2:前面命令转换为后面命令执行;
eg. mkfs.ext2 /dev/sda3:格式化会破坏原文件系统上的所有文件;
mke2fs:make ext file system,ext系列文件系统的专用管理工具;
mke2fs [OPTIONS] device
-t {ext2|ext3|ext4}:指明要创建的文件系统类型;
mkfs.ext4 = mkfs -t ext4 = mke2fs -t ext4
ext3独有的显示方式:SEC_TYPE="ext2" TYPE="ext3"
-b {1024|2048|4096}:指明文件系统的块大小;
-L LABEL:指明卷标;
-j:创建有日志功能的文件系统ext3;
mke2fs -j = mke2fs -t ext3 = mkfs -t ext3 = mkfs.ext3 = mke2fs -O has_journal
-i #:bytes-per-inode,指明inode与字节的比率;即每多少字节创建一个inode,此字节数不应该小于块大小;
-N #:直接指明要给此文件系统创建的inode的数量;
-m #:指定预留空间占整个分区空间的百分比,默认为5;
-O [^] FEATURE:以指定的特性创建目标文件系统;不加 ^代表启用此特性,加 ^代表关闭此特性。
(2)e2label命令:管理ext系列文件系统的卷标,卷标的查看与设定
查看:e2label device
设定:e2label device LABEL
(3)tune2fs命令:查看或修改ext系列文件系统的某些属性
注意:块大小创建后不可修改。
tune2fs [OPTIONS] device
-l:查看指定文件系统的超级块信息;
[root@localhost ~]# tune2fs -l /dev/sda3:查看/dev/sda3中超级块中的内容;
# tune2fs -l DEVICE
# dumpe2fs -h DEVICE
修改指定文件系统的属性:
-j:ext2 --> ext3;无损升级,数据不损坏;
-L LABEL:修改卷标;
-m #:调整预留空间百分比;
-O [^]FEATURE:开启或关闭某种特性;不用重新格式化即可完成调整;特性前加 ^,表示关闭此种特性;
tune2fs -O ^has_journal /dev/sda3:将ext3格式转换为ext2格式;
tune2fs -O has_journal /dev/sda3:将ext2格式转换为ext3格式;
-o [^]mount_options:开启或关闭某种默认挂载选项;
tune2fs -o acl /dev/sda3:对分区启用acl;
tune2fs -o ^acl /dev/sda3:对分区禁用acl。
-U UUID:修改UUID。
(4)dumpe2fs命令:显示ext系列文件系统的属性信息
dumpe2fs [-h] device
-h 显示超级块信息。
(5)用于实现文件系统检测的工具
因进程意外中止或系统崩溃、系统断电等原因导致写入操作非正常终止时,可能会造成文件损坏,此时,应该检测并修复文件系统,建议离线进行。
工具:fsck,e2fsck。
ext系列文件系统的专用检测工具:e2fsck
e2fsck [OPTIONS] device
-y:对所有问题自动回答为yes;
-f:即使文件系统处于clean状态,也要强制进行检测;
fsck
-t fstype:指明文件系统类型,fsck -t ext4 = fsck.ext4;
-a:无须交互而自动修复所有错误;
-r:交互式修复错误。
(6)xfs文件系统
CentOS 6安装xfs文件系统:# yum -y install xfsprogs
xfs文件系统创建:
mkfs.xfs /dev/sda3:创建xfs文件系统;
mkfs.xfs -f /dev/sda3:已有文件系统强制覆盖;
fsck.xfs:检测xfs文件系统;
(7)blkid命令
blkid [OPTION]... [DEVICE]:查看指定块设备的属性信息;
blkid -L LABEL:根据LABEL定位设备,可以查看到卷标名所对应的磁盘分区;
blkid -U UUID:根据UUID定位设备,可以查看到UUID所对应的磁盘分区;

[root@localhost ~]# e2label /dev/sda3 MYDATA
[root@localhost ~]# blkid -L MYDATA
/dev/sda3

(8)swap文件系统
Linux上的交换分区必须使用独立的文件系统,即独立的磁盘分区,且文件系统的System ID必须为82。
创建swap分区的特定工具:mkswap命令。前提:要先调整设备分区类型为8E。
只有类型为82swap的分区才可以用mkswap命令创建swap设备。
mkswap [OPTIONS] device
-L LABEL:指明卷标;
-f:强制。
(9)vfat系统
Windows无法识别Linux的文件系统。因此,存储设备需要两种系统之间交叉使用时,应该使用Windows和Linux同时支持的文件系统fat32(vfat)。Windows叫fat32,Linux叫vfat。
# mkfs.vfat device

7、文件系统的挂载

根文件系统之外的其它文件系统要想能够被访问,都必须通过关联至根文件系统上的某个目录来实现,此关联操作即为挂载,此目录即为挂载点。
挂载点:mount_point,用于作为另一个文件系统的访问入口。
注意:1)要使用事先存在的目录作为挂载点;2)应该使用未被或不会被其它进程使用到的目录作为挂载点;3)挂载点下原有的文件将会被隐藏。
mount命令:
mount DEVICE MOUNT_POINT
DEVICE:所要挂载的磁盘分区;
MOUNT_POINT:挂载点,另一个文件系统的访问入口;
固定挂载点:/mnt,/media;
mount [-nrw] [-t vfstype] [-o options] device dir
命令选项:
-a:自动挂载所有(/etc/fstab文件中定义的)支持自动挂载的设备;
-r:readonly,只读挂载;光驱(不是刻录机)只能只读挂载;
-w:read and write, 读写挂载;
-n:默认情况下,设备挂载或卸载的操作会同步更新至/etc/mtab文件中,-n用于禁止此特性;
-t vfstype:指明要挂载的设备上的文件系统的类型,多数情况下可省略,此时mount会通过blkid来判断要挂载的设备的文件系统类型;
-L LABEL:挂载时以卷标的方式指明设备:mount -L LABEL dir
-U UUID:挂载时以UUID的方式指明设备:mount -U UUID dirmount UUID='uuid' dir
-o options:挂载选项,挂载后目录或文件系统应当具有什么特性;
sync/async:同步/异步操作;异步IO是指,数据写操作先于内存完成,而后再根据某种策略同步至持久设备中;
atime/noatime:文件或目录在被访问时是否立即更新其访问时间戳;
diratime/nodiratime:目录在被访问时是否更新其访问时间戳;
remount:重新挂载,通常用于不卸载的情况下重新指定挂载选项;
acl:在此设备支持使用facl功能,默认不支持;
# mount -o acl device dir
# tune2fs -o acl device
ro:只读 -o ro = -r
rw:读写 -o rw = -w
dev/nodev:此设备上是否允许创建设备文件;默认允许;
exec/noexec:是否允许运行此设备上的程序文件;
auto/noauto:是否支持自动挂载,即是否支持使用mount -a选项自动挂载,自动挂载操作需要写入fstab文件中,写明挂载到何处;
user/nouser:是否允许普通用户挂载此文件系统;
suid/nosuid:是否允许程序文件上的suid和sgid特殊权限生效;
relatime/norelatime:是否参考文件的修改或改变时间来更新inode的访问时间;
defaults:默认选项为rw,suid,dev,exec,auto,nouser,async和relatime。
绑定操作:可以实现将目录绑定至另一个目录上,作为其临时访问入口。
mount --bind 源目录 目标目录或者mount -B 源目录 目标目录
umount 源目录或目标目录:解除绑定

查看当前系统所有已挂载的设备:
# mount:mount命令的结果是显示所有已挂载的文件系统、伪文件系统和cgroup文件系统;
# cat /etc/mtab:当前系统上的挂载和卸载结果会写入此文件,该命令等同于
# cat /proc/mounts

光盘设备文件:IDE:/dev/hdc,SATA:/dev/sr0;

[root@localhost ~]# ll /dev
lrwxrwxrwx. 1 root root           3 Dec  7 15:56 cdrom -> sr0

sr0是虚拟机虚拟出的SATA接口,用于存放光盘,老版本的虚拟机可能会虚拟出hdc,是IDE接口。
符号链接文件:/dev/cdrom,/dev/cdrw,/dev/dvd,/dev/dvdrw;
挂载并卸载光盘设备:
mkdir /media/cdrom
mount -r /dev/cdrom /media/cdrom
umount /dev/cdrom
挂载U盘:事先识别U盘的设备文件;
挂载本地的回环设备(本地的一个文件作为设备):多见于挂载.iso镜像文件
# mount -o loop /PATH/TO/SOME_LOOP_FILE MOUNT_POINT

设定除根文件系统以外的其它文件系统能够开机时自动挂载:/etc/fstab文件。开机时运行一个脚本,该脚本会找到该文件中的设备,一一进行挂载,然后显示登录提示符。每行定义一个要挂载的文件系统及相关属性,共有6个字段:
1)要挂载的设备:
设备文件;LABEL 卷标;UUID(CentOS 7目前使用的方式);伪文件系统(如sysfs, proc, tmpfs等,给名称即可,会自动识别在哪,怎么挂的);
2)挂载点 :swap类型的设备的挂载点为swap;
3)文件系统类型;
4)挂载选项:defaults:使用默认挂载选项(mount命令中的选项);
如果要同时指明多个挂载选项,彼此间以逗号分隔(如defaults,acl,noatime,noexec)
5)转储频率(备份频率):
0:从不备份;
1:每天备份;
2:每隔一天备份;
6)自检次序:
0:不自检,额外创建的文件系统都无须自动自检;
1:首先自检,通常只能是根文件系统需要首先自检;
2:次级自检,不同的设备可以使用同一个自检次序;

mount -a: 可重新加载/etc/fstab文件中的所有挂载项,自动挂载定义在此文件中的所有支持自动挂载的设备,已挂载的不管,未挂载的现在自动挂载,挂载选项defaults为支持自动挂载。

/etc/fstab文件LABEL方式指定挂载如下,并有挂载选项acl:

#
# /etc/fstab
# Created by anaconda on Fri Nov 11 09:39:19 2016
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=2435469a-8504-42b3-8453-c8cb16538bf8 /                       ext4    defaults        1 1
UUID=49f88d8c-1545-4bb3-8e1f-6b3a315d8435 /boot                   ext4    defaults        1 2
UUID=67626ef9-2332-4fb2-a63a-88b4bf1488bc /home                   ext4    defaults        1 2
UUID=d14a0467-bb20-4466-a512-9b3e1c5b06cb /var                    ext4    defaults        1 2
UUID=1ad1cc93-9630-47df-9a67-00c57dd08b42 swap                    swap    defaults        0 0
LABEL=MYDATA                              /mydata                 ext4    defaults,acl    0 0
~                                                                                                   

8、文件系统的卸载

umount命令:umount DEVICE或者umount MOUNT_POINT
注意:挂载点没有被进程访问时方可卸载,正在被进程访问到的挂载点无法被卸载。
查看被哪个或哪些进程所占用:
# lsof MOUNT_POINT
# fuser -v MOUNT_POINT
终止所有正在访问某挂载点的进程:
# fuser -km MOUNT_POINT:如果bash占用该挂载点,该命令将退出当前bash。

[root@localhost ~]# mount -r /dev/cdrom /media
[root@localhost ~]# cd /media
[root@localhost media]# umount /media
umount: /media: target is busy.
 (In some cases useful info about processes that use the device is found by lsof(8) or fuser(1))
[root@localhost media]# lsof /media
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
bash    4009 root  cwd    DIR   11,0     2048 1856 /media
lsof    6240 root  cwd    DIR   11,0     2048 1856 /media
lsof    6241 root  cwd    DIR   11,0     2048 1856 /media
[root@localhost media]# fuser -v /media
USER        PID ACCESS COMMAND
/media:              root     kernel mount /media
root       4009 ..c..  bash

9、交换分区的启用和禁用

创建交换分区的命令:mkswap。
启用交换分区:swapon
swapon [OPTION] [DEVICE]
-a:激活定义在/etc/fstab文件中的所有swap设备;
-p PRIORITY:指定优先级(用数字来表示);
禁用交换分区:swapoff
swapoff [OPTION]... [DEVICE]
-a:禁用所有交换分区;

例:1、创建一个10G的分区,并格式化为ext4文件系统; 
(1)block大小为2048;预留空间为2%,卷标为MYDATA;
(2)挂载至/mydata目录,要求挂载时禁止程序自动运行,且不更新文件的访问时间戳;
(3)可开机自动挂载;
2、创建一个大小为1G的swap分区,并启动之;
Answer:
1、mke2fs         10G
(1)mke2fs -t ext4 -b 2048 -m 2 -L MYDATA /dev/sda6
(2)mount -o noexec,noatime /dev/sda6 /mydata
(3)向/etc/fstab文件中加入挂载条目
2、mkswap  /dev/sda7                        该/dev/sda7分区大小为1G
swapon  /dev/sda7

10、内存及交换分区的使用信息查看

(1)free
查看当前内存使用状况,包括物理内存和交换内存。
-m:以MB为单位显示;
-g:以GB为单位显示,不够1GB显示为0。
显示结果:Mem为物理内存的使用情况行,Swap为交换分区的使用情况行;
-/+ buffers/cache:表示物理内存在不考虑缓冲和缓存占据的空间时的使用情况;
buffers:缓冲,用来缓冲写;
cache:缓存,用来缓存读;

11、文件系统空间占用等信息查看

(1)df命令
disk free,查看磁盘的使用状态,主要是挂载后的磁盘。
df [OPTION]... [FILE]...
-l:仅显示本地文件系统的相关信息,而不显示网络文件系统;
-h:human-readable;
-i:显示inode的使用状态而非默认的磁盘空间使用信息;

[root@localhost ~]# df
Filesystem     1K-blocks    Used Available Use% Mounted on     不管block是几K,只显示1K block
/dev/sda2       60760940 4085244  53566168   8% /
devtmpfs          919992       0    919992   0% /dev
tmpfs             934328     144    934184   1% /dev/shm
tmpfs             934328    9128    925200   1% /run
tmpfs             934328       0    934328   0% /sys/fs/cgroup
/dev/sda3       10190100   57284   9592144   1% /home
/dev/sda1         999320  133136    797372  15% /boot
/dev/sda5        6061632 1385144   4345532  25% /var
tmpfs             186868      16    186852   1% /run/user/0
/dev/sr0         7587292 7587292         0 100% /media

[root@localhost ~]# df -l
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda2       60760940 4085272  53566140   8% /
devtmpfs          919992       0    919992   0% /dev
tmpfs             934328     144    934184   1% /dev/shm
tmpfs             934328    9132    925196   1% /run
tmpfs             934328       0    934328   0% /sys/fs/cgroup
/dev/sda3       10190100   57284   9592144   1% /home
/dev/sda1         999320  133136    797372  15% /boot
/dev/sda5        6061632 1385160   4345516  25% /var
tmpfs             186868      16    186852   1% /run/user/0
/dev/sr0         7587292 7587292         0 100% /media

[root@localhost ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        58G  3.9G   52G   8% /
devtmpfs        899M     0  899M   0% /dev
tmpfs           913M  144K  913M   1% /dev/shm
tmpfs           913M  9.0M  904M   1% /run
tmpfs           913M     0  913M   0% /sys/fs/cgroup
/dev/sda3       9.8G   56M  9.2G   1% /home
/dev/sda1       976M  131M  779M  15% /boot
/dev/sda5       5.8G  1.4G  4.2G  25% /var
tmpfs           183M   16K  183M   1% /run/user/0
/dev/sr0        7.3G  7.3G     0 100% /media

[root@localhost ~]# df -i
Filesystem      Inodes  IUsed   IFree IUse% Mounted on
/dev/sda2      3866624 134506 3732118    4% /
devtmpfs        229998    391  229607    1% /dev
tmpfs           233582      7  233575    1% /dev/shm
tmpfs           233582    548  233034    1% /run
tmpfs           233582     13  233569    1% /sys/fs/cgroup
/dev/sda3       655360    387  654973    1% /home
/dev/sda1        65536    338   65198    1% /boot
/dev/sda5       393216   5399  387817    2% /var
tmpfs           233582     23  233559    1% /run/user/0
/dev/sr0             0      0       0     - /media

(2)du命令
查看某目录空间占用情况。
du [OPTION]... [FILE]...
-s: sumary,显示目录下所有文件的大小之和;
-h: human-readable

[root@localhost ~]# ls -ldh /usr
drwxr-xr-x. 13 root root 4.0K Nov 11 09:40 /usr
[root@localhost ~]# du -s /usr
3972704	/usr
[root@localhost ~]# du -sh /usr
3.8G	/usr

(3)dd命令:convert and copy a file
实现文件底层复制,cp通过文件系统复制,dd通过块复制,复制更底层,所以效率更高。
用法:dd if=/PATH/FROM/SRC of=/PATH/TO/DEST
bs=#:block size, 复制单元大小,单位字节;
count=#:复制多少个bs;

dd if=/etc/fstab of=/tmp/fstab
dd if=/etc/fstab of=/tmp/fstab.2 bs=1 count=100

磁盘拷贝:dd if=/dev/sda of=/dev/sdb
备份MBR:dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1
用于清除磁盘上的分区:dd if=/dev/zero of=/dev/sda bs=512 count=1
破坏MBR中的bootloader:MBR共512字节,前446字节是bootloader,64字节是分区表:dd if=/dev/zero of=/dev/sda bs=256 count=1
两个特殊设备:/dev/null:数据黑洞,/dev/zero:吐零机。

12、inode

(1)inode概述
文件存储在硬盘上,硬盘的最小存储单位叫扇区,每个扇区存储512字节(0.5KB)。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个块(block)。这种由多个扇区组成的块是文件存储的最小单位。块的大小,最常见的是4KB,即连续八个扇区组成一个block。
文件数据都存储在块中,我们必须找到一个地方存储文件的元数据信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种存储文件元数据信息的区域就叫做inode,中文译名为“索引节点”。
inode包含文件的元数据信息,具体有以下内容:
文件的字节数;文件拥有者的User ID;文件的Group ID;文件的读、写、执行权限;文件的时间戳(共有3个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间);链接数(即有多少个文件名指向这个inode);文件数据block的位置。可以使用stat命令来查看某个文件的inode信息。
总之,除了文件名以外的所有文件信息,都存在inode之中。
inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域:一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。
每个inode节点的大小,一般是128字节或256字节。inode节点的总数在格式化时就给定,一般是每1KB或者2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。
查看每个硬盘分区的inode总数和已经使用的数量,可以使用df -i命令。查看每个inode节点的信息可以使用:dumpe2fs -h /dev/sda3 | grep "Inode size"。由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况,这时就无法在硬盘上创建新文件。
每个inode都有一个号码,操作系统用inode号码来识别不同的文件。需要说明的是,Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或绰号。表面上,用户通过文件名打开文件。实际上,系统内部这个过程分成3步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码获取inode信息;最后,根据inode信息找到文件数据所在的block,读出数据。
使用ls -i命令,可以看到文件名对应的inode号码:ls -i abc.txt。Unix/Linux系统中,目录(directory)也是一种文件,打开目录,实际上就是打开目录文件。
目录文件的结构非常简单,就是一系列目录项的列表。每个目录项由两部分组成:所包含文件的文件名以及该文件名对应的inode号码。
ls命令只列出目录文件中的所有文件名:ls /etc
ls -i命令列出整个目录文件,即文件名和inode号码:ls -i /etc
如果要查看文件的详细信息,就必须根据inode号码,访问inode节点,读取信息。
ls -l命令列出文件的详细信息:ls -l /etc
(2)inode的特殊作用
由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象:

  1. 有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点就能起到删除文件的作用。
  2. 移动文件或重命名文件,只是改变文件名,不影响inode号码。
  3. 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。

第3点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过inode号码识别运行中的文件,不通过文件名。更新的时候,新版文件以同样的文件名生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的inode则被回收。
(3)实际中的应用示例
【问题描述】
在一台配置较低的Linux服务器(内存、硬盘比较小)的/data分区内创建文件时,系统提示磁盘空间不足,用df -h命令查看了一下磁盘使用情况,发现/data分区只使用了66%,还有12G的剩余空间,按理说不会出现这种问题。后来用df -i查看了一下/data分区的索引节点(inode),发现已经用满(IUsed=100%),导致系统无法创建新目录和文件。
【查找原因】
/data/cache目录中存在数量非常多的小字节缓存文件,占用的Block不多,但是占用了大量的inode。
【解决方案】
【方案一】删除/data/cache目录中的部分文件,释放出/data分区的一部分inode。
【方案二】用软链接将空闲分区/opt中的newcache目录链接到/data/cache,使用/opt分区的inode来缓解/data分区inode不足的问题:
[root@localhost ~]# ln -s /opt/newcache /data/cache

你可能感兴趣的:(Linux,深入Linux系统架构)