宁波网站商城建设,湖南网站建设有限公司,文创产品设计方案模板,四川建设网app下载Linux Filesystem Management1 文件系统是什么2 文件系统的组成3 inode详解1. inode到底是什么2. inode的内容3. inode的大小4. inode的号码5. 硬链接6. 软链接4 存储区域5 常见文件系统的类型1. 根文件系统2. 虚拟文件系统3. 真文件系统4. 伪文件系统5. 网络文件系统1 文件系统…
Linux Filesystem Management1 文件系统是什么2 文件系统的组成3 inode详解1. inode到底是什么2. inode的内容3. inode的大小4. inode的号码5. 硬链接6. 软链接4 存储区域5 常见文件系统的类型1. 根文件系统2. 虚拟文件系统3. 真文件系统4. 伪文件系统5. 网络文件系统1 文件系统是什么 
操作系统中负责管理和存储 文件信息的软件机构称为文件管理系统简称文件系统。 
通常文件系统是用于存储和组织文件的一种机制便于对文件进行方便的查找与访问。文件系统是对文件存储设备的空间进行组织和分配负责文件存储并对存入的文件进行保护和检索的系统。 它负责为用户建立文件存入、读出、修改、转储文件控制文件的存取当用户不再使用时撤销文件等。 
随着文件种类的增多扩增了更多的文件系统为了对各种文件系统进行统一的管理与组织。 
文件系统的基本数据单位是文件它主要是对磁盘上面的文件进行组织管理组织的方式不同形成的文件系统也会不同。 
2 文件系统的组成 
在Linux中一切皆文件不仅普通的文件和目录块设备、管道、socket等等都是由文件系统管理的。在Linux中的文件系统会给每个文件分配两个数据结构索引节点index node和目录项directory entry它们都主要是被用来记录文件的元信息和目录层次结构。 
inode索引节点用来记录文件的元信息比如inode编号、文件大小、访问权限、创建时间、修改时间、数据在磁盘的位置等。索引节点是文件的唯一标识它们之间一一对应也同样都是被存储在硬盘当中索引节点也是会占用磁盘的存储空间的。dentry目录项用来记录文件的名字索引节点指针以及与其他目录项的层级关联关系。多个目录项关联起来就会形成目录结构但是它与索引节点不相同的是目录项是由内核维护的一个数据结构不是存放在磁盘中而是缓存在内存里面。目录项包括文件名和inode节点号。inode映射表inode bitmap位图记录着哪些inode使用了哪些没有使用。block映射表block bitmap记录着哪些block使用了哪些没有使用。 
其中目录也是文件也是用索引节点唯一标识和普通文件不同的是普通文件在磁盘里面保存着的是文件数据而目录文件在磁盘里面保存子目录或者文件。 
目录和目录项分别指的是什么 目录是一个文件它是被持久化的存储在磁盘里面而目录项是内核中的一个数据结构缓存在内存里面。 
如果查询目录就会频繁的从磁盘读取效率会很低所以内核就会把已经读过的目录用目录项这个数据结构先缓存在内存里面等到下次读取到相同的目录的时候就只需要从内存里面去读取这样就大大提升了文件系统的效率。 
3 inode详解 
1. inode到底是什么 
文件储存在硬盘上硬盘的最小存储单位叫做扇区Sector。每个扇区储存512字节相当于0.5KB。 
操作系统读取硬盘的时候不会一个个扇区地读取这样效率太低而是一次性连续读取多个扇区即一次性读取一个块block。这种由多个扇区组成的块是文件存取的最小单位。块的大小最常见的是4KB即连续八个 sector组成一个 block。 
文件数据都储存在块中那么很显然我们还必须找到一个地方储存文件的元信息比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode中文译名为索引节点。 
每一个文件都有对应的inode里面包含了与该文件有关的一些信息。 
2. inode的内容 
inode包含文件的元信息具体来说 文件的字节数文件拥有者的User ID文件的Group ID文件的读、写、执行权限文件的时间戳共有三个 ctime指inode上一次变动的时间 mtime指文件内容上一次变动的时间 atime指文件上一次打开的时间。链接数即有多少文件名指向这个inode文件数据block的位置 可以用stat命令查看某个文件的inode信息 
[rootdbc-server-554 zabbix]# stat zabbix_svr.batFile: ‘zabbix_svr.bat’Size: 1284            Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 2047802     Links: 1
Access: (0744/-rwxr--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2023-02-13 17:21:32.333045796 0800
Modify: 2023-02-13 17:21:24.964098992 0800
Change: 2023-02-13 17:21:24.976098905 0800Birth: -3. 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命令 
[rootdbc-server-554 zabbix]# df -i
Filesystem                 Inodes   IUsed     IFree IUse% Mounted on
devtmpfs                   980823     500    980323    1% /dev
tmpfs                      985192       1    985191    1% /dev/shm
tmpfs                      985192     932    984260    1% /run
tmpfs                      985192      16    985176    1% /sys/fs/cgroup
/dev/mapper/centos-root  26214400  783278  25431122    3% /
/dev/mapper/DBCVG-DBCLV 244195328 1615546 242579782    1% /mnt/DBC_Data
/dev/sda2                  524288      31    524257    1% /boot
/dev/sda1                       0       0         0     - /boot/efi
/dev/mapper/centos-home 189169664   11452 189158212    1% /home
tmpfs                      985192       1    985191    1% /run/user/0
tmpfs                      985192       8    985184    1% /run/user/424. inode的号码 
每个inode都有一个号码操作系统用inode号码来识别不同的文件。 Unix/linux系统内部不使用文件名而使用inode号码来识别文件。对于系统来说文件名只是inode号码便于识别的别称或者绰号。 
表面上用户通过文件名打开文件。实际上系统内部这个过程分成三步 首先系统找到这个文件名对应的inode号码 其次通过inode号码获取inode信息 最后根据inode信息找到文件数据所在的block读出数据。 使用ls -i命令可以看到文件名对应的inode号码 
[rootdbc-server-554 zabbix]# ls -il
total 24
2047779 -rw-r--r-- 1 root root 8243 Feb 14 17:20 CA_500.xml
2047106 -rw-r--r-- 1 root root 5183 Feb 14 17:17 CA_mediawebhook_441_500.rar
2047802 -rwxr--r-- 1 root root 1284 Feb 13 17:21 zabbix_svr.bat5. 硬链接 
一般情况下文件名和inode号码是一一对应关系每个inode号码对应一个文件名。但是Unix/Linux系统允许多个文件名指向同一个inode号码。这意味着可以用不同的文件名访问同样的内容对文件内容进行修改会影响到所有文件名但是删除一个文件名不影响另一个文件名的访问。这种情况就被称为硬链接hard link。 
ln命令可以创建硬链接 
运行上面这条命令以后源文件与目标文件的inode号码相同都指向同一个inode。inode信息中有一项叫做链接数记录指向该inode的文件名总数这时就会增加1。 
6. 软链接 
除了硬链接以外还有一种特殊情况。 文件A和文件B的inode号码虽然不一样但是文件A的内容是文件B的路径。读取文件A时系统会自动将访问者导向文件B。因此无论打开哪一个文件最终读取的都是文件B。这时文件A就称为文件B的软链接soft link或者符号链接symbolic link。 这意味着文件A依赖于文件B而存在如果删除了文件B打开文件A就会报错“No such file or directory”。这是软链接与硬链接最大的不同文件A指向文件B的文件名而不是文件B的inode号码文件B的inode链接数不会因此发生变化。 
ln -s命令可以创建软链接 
ln -s [OPTION]... TARGET... DIRECTORY 硬链接和软链接  A为文件 ① 软连接B指向文件A如果A删除则B失效此处再一次强调了软连接为符号链接即不指向实际文件 ② 硬链接B指向文件inode如果A删除B仍可使用 
4 存储区域 
当磁盘进行格式化的时候会被分成三个存储区域分别为超级块、索引节点、数据块区。 
超级块superblock用来存储文件系统的详细信息包括inode/block的总量、使用量、剩余量块个数、块大小、空闲块等以及文件系统的格式。索引节点区用来存储索引节点。数据块区用来存储文件或目录数据。 
我们不可能把超级块和索引节点区全部加载到内存在这样内存是撑不住的所以只有当需要使用的时候才会将它加载进内存它们加载进入内存的时机是不同的。 超级块当文件系统挂载时进入内存当中索引节点区当文件系统被访问时进入内存中。 5 常见文件系统的类型 
linux中文件系统可以粗略分为  
1. 根文件系统 
根文件系统(rootfs)是内核启动时所 mount(挂载)的第一个文件系统内核代码映像文件保存在根文件系中而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。 
根文件系统的根目录/下有很多子目录  
2. 虚拟文件系统 
从上面的分类图中我们可以知道Linux中有很多文件系统并且是共存的。那么在Linux中是怎么做到让一切都是文件呢这是由于有一层虚拟文件系统软件抽象层的存在这个软件抽象层为用户屏蔽了底层文件系统的差异向上层提供了统一地访问接口。如图  
无论最下层的文件系统是什么我们最上层的用户端尽管使用系统调用接口(open、write、read等)或glibc接口(fopen、fwrite、fread等)来操作就可访问文件系统里的文件使得一切都是文件成为可能。 
① VFS VFSVirtual Filesystem Switch称为虚拟文件系统或虚拟文件系统转换是一个内核软件层在具体的文件系统之上抽象的一层用来处理与Posix文件系统相关的所有调用表现为能够给各种文件系统提供一个通用的接口使上层的应用程序能够使用通用的接口访问不同文件系统同时也为不同文件系统的通信提供了媒介。 
VFS并不是一种实际的文件系统它只存在于内存中不存在任何外存空间VFS在系统启动时建立在系统关闭时消亡。 
VFS由超级块、inode、dentry、vfsmount等结构来组成。 
② VFS在linux架构中的位置 从用户的使用角度Linux下的文件系统中宏观上主要分为三层 1上层的文件系统的系统调用System-call  2虚拟文件系统VFSVirtual File System层 3挂载到VFS中的各种实际文件系统 Linux系统的User使用GLIBCPOSIX标准、GUN C运行时库作为应用程序的运行时库然后通过操作系统将其转换为系统调用SCIsystemcall interfaceSCI是操作系统内核定义的系统调用接口这层抽象允许用户程序的IO操作转换为内核的接口调用。  
3. 真文件系统 
真文件系统其实是实际存储设备的文件系统挂载于EEPROM、 Nor FLASH、 NAND FLASH、 eMMC 等存储器中 
Linux存在几十个文件系统类型ext2ext3ext4xfsbrtfszfs等等 
真文件系统包括 ext文件系统扩展文件系统extended filesystem使用虚拟目录来操作硬件设备在物理设备上按定长块存储数据。采用index索引节点的系统来存放虚拟目录中所存储文件的信息索引节点位每个物理设备创建一个单独的表(索引节点表)来存储这些文件信息虚拟目录中每个文件在索引节点表中都有一个条目。ext中extended部分来自其跟踪的每个文件的额外数据包括文件名文件大小文件属主属组访问权限指向存储文件的每个硬盘块上的指针。限制文件不能好过2G  ext2文件系统是ext的扩展在ext基础上增加了文件的创建时间修改时间和最后访问时间允许最大文件2TB后期版本增加到32T。改变了文件在数据块中的存储方式ext系统常见问题在文件写到物理设备数据块分散在整个设备中碎片化需要更长的时候查找特定文件的块降低了文件系统性能。ext2通过按组分配磁盘块来减轻碎片化。限制容易因为系统崩溃或断电时损坏  日志文件系统为linux增加了一层安全性他不再使用之前将数据直接写入存储设备再更新索引节点表的做法而是先将文件的更改写到临时文件日志journal在数据成功写到存储设备和索引节点表后再删除对应的日志条目。如果写入时系统崩溃或断电日志文件下次会读取日志文件并处理上次未写入的数据。linux有三种广泛的日志方法包括  数据模式索引节点和文件都会被写入日志丢失数据风险低但性能差 有序模式只有索引节点会被写入日志文件数据成功写入后才删除性能和安全取得折中 回写模式只有索引节点会被写入日志但不控制文件数据何时写入丢数据风险高但比不用日志好性能好安全性差   ext3文件系统采用和ext2相同的索引节点表结构但给每个存储设备增加了一个日志文件默认情况下ext3使用有序模式的日志功能可以修改为其他两种模式。限制无法恢复误删文件没有内建压缩功能不支持加密文件  ext4文件系统是ext3的扩展除了支持压缩加密还支持一个称为区段(extent)的特性。区段在存储设备上按块分配空间但索引节点表只保存起始块位置由于无需列出所有用来存储的文件中数据的数据块可以在索引表中节省一些空间。还引入了块预分配技术如果想在设备给一个要变大的文件预留空间ext4可以为文件分配所需的块而不仅仅是那些现在已经用到的块。用0填满预留数据块不会分配给其他文件  ReiserFS文件系统支持回写日志模式linux最快的日志文件系统之一有两个有意思的特性一是在线调整已有文件系统大小二是尾部压缩技术tailpacking该技术将一个文件的数据填入另一个文件数据块的空白处  JFS文件系统采用有序日志方法基于区段的文件分配  XFS日志文件系统采用回写日志模式允许在线调整文件系统大小但只能扩大不能缩小  写时复制文件系统 COW(copy-on-write),兼顾了安全性和性能如果要修改数据会使用科隆或写快照修改过的数据不会直接覆盖当前数据而是放入文件系统的另一个位置即便修改已完成也不会覆盖。  ZFS文件系统COW是ZFS由Sun公司研发用于opensolaris由于没有使用GPL许可所以无法成为linux默认文件系统  Btrfs文件系统B树文件系统在Reiser4上改进可靠性因其稳定性、易用性及能够动态调整已挂载文件系统大小成为最流行的文件系统OpenSUSE将其作为默认文件系统  
4. 伪文件系统 
Linux内核提供了sysfs、procfs、devtmpfs等伪文件系统伪文件系统存在于内存不占用硬盘。以文件地形式向用户提供一些系统信息用户读写这些文件就可以读取、修改系统的一些信息。 
① procfs procfs是 进程文件系统的缩写包含一个伪文件系统(启动时动态生成的文件系统)用于通过内核访问进程信息。这个文件系统通常被挂载到 /proc 目录。 
由于 /proc 不是一个真正的文件系统它也就不占用存储空间只是占用有限的内存。 
/proc目录的内容如下 
[rootdbc-server-554 zabbix]# ls /proc/
1      16     20738  26     2981  3027   3273  34   377   517   680  82    903   97           iomem         schedstat
10     1635   20739  27     2983  3029   3291  349  38    518   69   826   905   972          ioports       scsi
10090  1658   21     2741   2985  3035   3292  35   39    519   693  827   906   977          ipmi          self
10148  1686   21665  28     2986  3045   3295  351  4     52    696  830   908   9793         irq           slabinfo
1025   1687   22     28180  2988  3049   3297  352  4043  520   7    831   909   990          kallsyms      softirqs
10925  1688   2236   29     2991  3056   3298  353  41    521   717  838   913   acpi         kcore         stat
11     1689   2237   2948   2993  3057   3299  354  42    522   741  839   914   asound       keys          swaps
12     1690   2238   29532  2994  3063   33    355  43    523   742  84    932   buddyinfo    key-users     sys
13     1699   2239   2957   2995  3068   3302  356  4342  53    769  840   9329  bus          kmsg          sysrq-trigger
1324   17     2240   2958   2997  3070   3303  357  44    54    77   841   934   cgroups      kpagecount    sysvipc
1339   1700   2241   2965   2998  3091   3304  358  46    55    8    842   935   cmdline      kpageflags    timer_list
1349   1701   2242   2966   3000  31     3308  359  48    56    80   8421  936   consoles     loadavg       timer_stats
135    1763   2243   2967   3001  31159  3309  36   487   57    807  843   937   cpuinfo      locks         tty
1352   1779   2244   2969   3003  3132   3314  360  488   58    808  844   939   crypto       mdstat        uptime
1355   1790   2245   2970   3004  3149   3317  361  49    59    809  845   941   devices      meminfo       version
1356   18     23     2971   3005  3169   3320  362  499   6     81   870   942   diskstats    misc          vmallocinfo
1360   19     2399   2972   3006  32     3326  369  50    607   810  874   943   dma          modules       vmstat
1365   19029  24     2973   3007  325    3332  37   500   636   811  875   944   driver       mounts        zoneinfo
138    1968   2400   2974   3010  3250   3338  370  51    65    812  878   949   execdomains  mtrr
14     2      2441   2975   3011  3253   3339  371  513   651   813  880   950   fb           net
1423   20735  25     2976   3013  3255   3343  372  514   6522  814  8969  961   filesystems  pagetypeinfo
1444   20736  2526   2978   3014  3258   3361  373  515   66    816  9     9629  fs           partitions
15558  20737  2540   2980   3015  3269   3391  374  516   67    817  902   967   interrupts   sched_debug其中这些以数字命名的文件夹就是与进程相关的部分这些数字就是进程的PID号。 
我们可以访问系统信息如读取CPU相关信息 
[rootdbc-server-554 zabbix]# cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 60
model name      : Intel(R) Core(TM) i7-4790 CPU  3.60GHz
stepping        : 3
microcode       : 0x28
cpu MHz         : 800.024
cache size      : 8192 KB
physical id     : 0
siblings        : 8
core id         : 0
cpu cores       : 4
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm epb invpcid_single ssbd rsb_ctxsw ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt dtherm ida arat pln pts md_clear spec_ctrl intel_stibp flush_l1d
bogomips        : 7195.84
clflush size    : 64
cache_alignment : 64
address sizes   : 39 bits physical, 48 bits virtual
power management:...查看内核支持的文件系统类型 
[rootdbc-server-554 zabbix]# cat /proc/filesystems
nodev   sysfs
nodev   rootfs
nodev   ramfs
nodev   bdev
nodev   proc
nodev   cgroup
nodev   cpuset
nodev   tmpfs
nodev   devtmpfs
nodev   debugfs
nodev   securityfs
nodev   sockfs
nodev   dax
nodev   bpf
nodev   pipefs
nodev   configfs
nodev   devpts
nodev   hugetlbfs
nodev   autofs
nodev   pstore
nodev   efivarfs
nodev   mqueuefuseblk
nodev   fuse
nodev   fusectlxfsext3ext2ext4vfat
nodev   rpc_pipefs
nodev   overlay
nodev   binfmt_misc② sysfs sysfs是一个基于内存的文件系统它的作用是将内核信息以文件的方式提供给用户程序使用。sysfs 文件系统被挂载在 /sys 挂载点上。/sys目录下的内容如 
[rootdbc-server-554 zabbix]# ls /sys/
block  bus  class  dev  devices  firmware  fs  hypervisor  kernel  module  powersysfs 与 proc 相比有很多优点最重要的莫过于设计上的清晰。sysfs 的设计原则是一个属性文件只做一件事情 sysfs 属性文件一般只有一个值直接读取或写入。 
整个 /proc/scsi目录在2.6内核中已被标记为过时(LEGACY)它的功能已经被相应的 /sys 属性文件所完全取代。新设计的内核机制应该尽量使用 sysfs 机制而将 proc 保留给纯净的“进程文件系统”。 
③ devtmpfs devtmpfs 的功用是在 Linux 核心 启动早期建立一个初步的 /dev令一般启动程序不用等待 udev(udev 是Linux kernel 2.6系列的设备管理器。它主要的功能是管理/dev目录底下的设备节点。)缩短 GNU/Linux 的开机时间。 
在devtmpfs出现之前/dev/下面的设备节点应该都是udev-daemon收到内核的事件后用mknod程序或者直接调mknod()系统调用创建出来的现在基本上不走udev了几乎所有的设备文件(比如/dev/sda1)都是内核直接创建的。 
5. 网络文件系统 
NFS(Network File System) 即网络文件系统 能使使用者访问网络上别处的文件就像在使用自己的计算机一样。其工作原理是使用客户端/服务器架构   服务器程序向其他计算机提供对文件系统的访问其过程称为输出。NFS客户端程序对共享文件系统进行访问时把它们从NFS服务器中“输送”出来。文件通常以块为单位进行传输。