天天看点

Linux中的文件系统管理

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/gongxifacai_believe/article/details/84108113

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 dir

mount 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