第三章 Linux文件管理

1 文件系统目录结构

image-20220501122818741.png

上图就是一个Linux的目录结构图,Linux 的目录结构为倒挂的树状结构,最顶级的目录为根目录 /,其他目录通过挂载可以将它们添加到树中,通过解除挂载可以移除它们,以此类推形成了树状的文件结构,由于其结构很像一棵树的分支,所以该结构又被成为“目录树”。

1.1 目录结构特征

  • /是所有目录的顶点
  • 目录结构像一颗倒挂的树
  • 目录和磁盘分区是没有关联的
  • /下不同的目录可能会对应不同的分区或磁盘
  • 所有的目录都是按照一定的类别有规律的组织和命名的

1.2 常见的文件目录

1.2.1 存放命令相关的目录

方法 说明
/bin 普通用户使用的命令:/bin/ls
/bin/date
/sbin 管理员使用的命令:/sbin/service,poweroff,useradd...

所以看见 bin 路径,就应该意识到存放的是可执行文件

1.2.2 存放用户相关数据的家目录

例如:在 Windows 中不同的用户登录系统显示的桌面壁纸不一样

方法 说明
/home 普通用户的家目录,默认为 /home/username
/root 超级管理员 root 的家目录,普通用户无权操作

注意:环境变量中的东西千万不要删掉,否则会出现一些不可预知的错误

1.2.3 系统文件目录

方法 说明
/usr 相当于 Windows 中 C:Windows
/usr/local 软件安装的目录,相当于 C:Program
/usr/bin 普通用户使用的应用程序(重要)
/usr/sbin 管理员使用的应用程序(重要)
/usr/lib 库文件 Glibc 32bit
/usr/lib64 库文件 Glibc 64bit

1.2.4 启动目录

/boot 存放的系统启动相关的文件,例如:kernel,grub(引导装载程序)

  1. ls /boot # Linux 内核,启动机器时可以选择启动模式

5f3bc53e14195aa5940297ca.png

其中两个绿色的文件就是我们启动系统时,选择的启动模式

1.2.5 配置文件目录

方法 说明
/etc 极其重要,后续所有服务的配置都在这个目录中
/etc/sysconfig/network-script/ifcfg-eth0 网络配置文件
/etc/hostname 系统主机名配置文件,主机名很重要 有些特殊服务要依赖主机名,没有主机名会报错起不来修改了要重启:reboot
/etc/resolv.conf dns 客户端配置文件,域名解析服务器,一般我们不配置 因为网卡的配置好了,会覆盖掉他,网卡的优先级高
/etc/hosts 本地域名解析配置文件,域名解析,先找到自己的 hosts,再去域名解析
  1. /etc/hosts 对应 Windows 中的 C:Windows/system32/drivers/etc/hosts 黑客钓鱼网站

1.2.6 可变的目录与临时目录

方法 说明
/var 存放一些变化文件,比如 /var/log/
下的日志文件,登录日志
/var/tmp 进程产生的临时文件
/var/cache 应用程序缓存数据目录
/var/lib 应用程序状态信息数据
/var/local 专用于为/usr/local下的应用程序存储可变数据
/var/log 日志目录及文件
/var/run 运行中的进程相关数据,通常用于存储进程pid文件
/tmp 系统临时目录(类似于卫生间),谁都可以使用
  1. # 查看登录日志
  2. [root@contos7 ~]# cat /var/log/secure

1.2.7 设备目录文件

方法 说明
/dev 存放设备文件,比如硬盘,硬盘分区,光驱等等
/dev/sd 硬件设备
/dev/null 黑洞设备,只进不去。类似于垃圾回收站
/dev/random 生成随机数的设备
/dev/zero 能源源不断地产生数据,类似于取款机,随时随地取钱
  1. # sda sdb sdc sda1 sdb4
  2. Linux 中磁盘文件叫 sd,第一个硬盘叫 a,第二个叫 b
  3. sda1 表示第一个磁盘的第一个分区,sdb4 表示第二个磁盘的第四个分区(服务可以插很多硬盘)
  4. # 黑洞设备
  5. [root@contos7 ~]# ls >/dev/null
  6. # 生成随机数
  7. [root@contos7 ~]# echo $RANDOM
  8. # 源源不断取数据
  9. [root@contos7 ~]# dd if=/dev/zero of=/opt/test.txt bs=1M count=1024
  10. """
  11. dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换
  12. if=文件名:输入文件名,缺省为标准输入。即指定源文件 < if=input file>
  13. of=文件名:输出文件名,缺省为标准输出。即指定目的文件 < of=output file>
  14. bs=bytes:同时设置读入/输出的块大小为 bytes 个字节
  15. count=blocks:仅拷贝 blocks 个块,块大小等于 ibs 指定的字节数
  16. """

1.2.8 虚拟的文件系统

方法 说明
/proc 反映系统当前进程的实时状态:process
/sys 用于输出当前系统上硬件设备相关信息虚拟文件系统

PS:类似于小汽车的仪表板,能够看到汽车是否有故障,或者是否缺油了

  1. [root@contos7 ~]# ls /proc # 可以看到很多 ID 号,pid 号,进程号都是唯一

1.2.9 库文件目录

方法 说明
/lib 启动时程序依赖的基本共享库文件以及内核模块文件
/lib64 专用于x86_64系统上的辅助共享库文件存放位置

1.2.10 挂载目录

方法 说明
/media 便携式移动设备挂载点
/mnt 临时文件系统挂载点

1.2.11 其他重要目录

方法 说明
/opt 第三方应用程序的安装位置
/srv 系统上运行的服务用到的数据
/selinux selinux相关的安全策略等信息的存储位置

1.2.12 重要的子目录

  • /etc/syconfig/network-scripts/ifcfg-eth0(配置网卡)

    • /etc/init.d/network restart(重启网卡,生效配置)

      1. ifcfg-eth0配置文件参数:
      2. DEVICE=eth0 #此配置文件对应的设备的名称
      3. TYPE=Ethernet #接口类型
      4. ONBOOT=yes #在系统引导过程中,是否激活此接口
      5. NM_CONTROLLED=yes #是否使用networkmanager服务来控制接口
      6. BOOTPROTO=none #激活此接口时使用什么协议来配置接口属性,常用的有dhcp,bootp,static,none
      7. USERCTL=no #是否允许普通用户控制此设备
      8. IPV6INIT=no #是否初始化ipv6
      9. DNS2=223.5.5.5 #备用的DNS
      10. DNS1=10.0.0.2 #主用的DNS
      11. IPADDR=10.0.0.52 #IP地址
      12. NETMASK=255.255.255.0 #子网掩码
      13. GATEWAY=10.0.0.2 #默认网关
      14. HWADDR #设备的MAC地址
    • /etc/resolv.conf(配置DNS服务,但是网卡里的设置优先于这个配置文件。如果重启网卡,网卡ifcfg-eth0会覆盖此文件)

    • /etc/hosts(设定用户IP与名字(或域名)的对应解析表,相当于本地LAN局域网内的DNS,主要作用,开发,产品,测试等人员,用于通过正式的域名测试产品
    • /etc/sysconfig/network(用来配置主机名) /etc/hostname centos7专有
    • /etc/fstab (实现开机自动挂载的一个文件)

      1. 每行定义一个要挂载的文件系统及相关属性:
      1. 6个字段:
      2. 1)要挂载的设备
      3. 2)挂载点
      4. 3)文件系统类型
      5. 4)挂载选项:defaults使用默认挂载选项
      6. 5)转储频率: 0:从不备份
      7. 1:每天备份
      8. 2:每隔一天备份
      9. 6)自检次序: 0:不自检
      10. 1:首先自检,通常只能是根文件系统可用
      11. 2:次级自检
      12. ....直到9为止
    • /etc/rc.local (用于存放开机自启动程序命令的文件,类似于windows中的开机启动项)

    • /etc/inittab 设定系统启动时init进程的运行级别及加载相关的级别对应启动文件设置
    • /etc/init.d 这个目录是用来存放yum或rpm工具安装的软件的默认启动程序的目录(/etc/init.d其实是一个链接文件,它的实际路径是在/etc/rc.d/init.d)
    • /etc/profile 系统全局环境变量永久生效的配置目录(所有shell)
    • /usr/local 这个目录一般是用来存放用户自编安装软件的目录
    • /var/log/messages 系统信息默认的日志文件,非常重要
    • /var/log/secure 记录用户登录的情况(可以用来检查是否有黑客入侵,一般过滤Failed单词)
    • /var/spool/clientmqueue 邮件临时目录
    • /proc/interrupts 查看中断文件
    • /dev/null 这是linux系统中的黑洞文件,存放进去的所有内容,都会被清空
    • /etc/bashrc 为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取
    • /etc/skel 是用来存放新用户配置文件的目录。当我们添加新用户时,这个目录下的所有文件会自动被复制到新添加的用户的家目录下:默认情况下,/etc/skel目录下的所有文件都是隐藏文件:通过修改、添加、删除/etc/skel目录下的文件,我们可以为新创建的用户提供统一的、标准的、初始化用户环境
    • etc/login.defs 这个目录是用来定义创建用户时需要的一些用户的配置信息。如创建用户时,是否需要家目录,uid和gid的范围,用户及密码的有效期限等等
    • /var/local 专用于/usr/local下的应用程序存储可变数据
    • /var/run 运行中的进程相关的数据,通常用于存储进程的pid文件
    • /usr/share/man man的帮助手册所在的路径
    • /etc/sysconfig/network-scripts/route-IFACE 路由的相关配置文件

      1. 支持两种配置方式,但不可混用
      1. 1)每行一个路由条目:TARGET via GW
      2. 2)每三行一个路由条目:ADDRESS=TARGET
      3. NETMASK=MASK
      4. GATEWAY=NEXTHOP
  • 在/etc下创建一个文件名为nologin的文件,这个文件可以使普通用户在登陆的时候,无法登陆

  • /var/spool/cron/ 定时任务配置文件
  • /etc/motd 用户登录系统之后,显示文件中的内容
  • /etc/issue /etc/issue.net 用户登录系统之前,显示文件中的内容
  • /proc/cpuinfo CPU的信息 processor (CPU核数): 0 、physical id (物理CPU颗数): 0
  • /proc/meminfo 内存的信息
  • /proc/loadavg 查看系统的平均负载
  • /proc/mounts 系统挂载信息

1.3 应用程序的组成部分

  1. 二进制程序:/bin,/sbin,/usr/bin,/usr/sbin,/usr/local/bin,/usr/local/sbin
  2. 库文件:/lib,/lib64,/usr/lib,/usr/lib64,/usr/local/lib,/usr/local/lib64
  3. 配置文件:/etc,/usr/local/etc
  4. 帮助文件:/usr/share/man,/usr/share/doc,/usr/local/share/man,/usr/local/share/doc

1.4 Linux下的文件类型

  1. -:普通文件 #普通文件(文本文件,二进制,压缩文件,电影,图片。。。)
  2. d:目录文件
  3. b:块设备 #块设备一般以硬盘、软盘、光驱为主的文件
  4. c:字符设备 #字符设备一般以键盘、串口为主的文件
  5. s:套接字文件 #套接字一般是两个进程之间用来通信的文件
  6. l:链接文件 #类似于windows上面的快捷方式
  7. p:管道文件

2 文件操作命令

2.1 显示当前工作目录

  1. pwd命令 显示当前目录
  2. 主要选项:
  3. -L 大写的L,显示的逻辑路径 /etc/init.d
  4. -P 大写的P,显示的是实际物理路径 /etc/rc.d/init.d 这两个参数了解即可
  5. 主要案例:
  6. [root@db02 ~]# pwd
  7. /root

2.2 绝对和相对路径

  • 绝对路径:从根/为开头的路径就称之为绝对路径
  • 相对路径:不已根为开头的路径就是相对路径
  1. 基名:basename 只取文件名而不要路径
  2. 目录名:dirname 只取路径,不要文件名
  3. 主要案例:
  4. basename /root/xujun1270.txt
  5. xujun1270.txt
  6. dirname /root/xujun1270.txt
  7. /root

2.3 更改目录

  1. cd 切换目录
  2. 主要案例:
  3. cdcd ~ #切换至家目录
  4. cd - #在上一个目录和当前目录来回切换
  5. cd ~xujun #切换至某用户的家目录
  6. cd .. #切换至上一级目录
  7. 相关的环境变量:
  8. PWD:当前目录路径
  9. OLDPWD:上一次目录路径

2.4 列出目录内容

  1. ls 命令可以列出当前目录的内容或指定目录
  2. 主要选项:
  3. -l 列出目录或者文件的详细信息。比如权限、修改时间等等
  4. -a 列出当前目录下所有文件,包括隐藏文件(已点开头的都是隐藏文件)
  5. -A 列出除.和..之外的所有文件
  6. -h 已人类能查看的方式,列出文件的大小
  7. -d 只列出目录的详细信息
  8. -F给不同文件结尾加不同标识
  9. -p给目录结尾加斜线
  10. -t按修改时间排序
  11. -r反转排序
  12. -i查看inode节点
  13. --time-style=long-iso 格式化属性时间
  14. --color=auto auto表示不同的文件类型显示不同的颜色参数
  15. -R 递归列出所有子目录
  16. -S 根据文件大小排序
  17. 主要案例:
  18. 1ls -l #列出目录或者文件的详细信息
  19. -rw-r--r-- 1 root root 1 Aug 5 21:24 xujun.txt
  20. 2ls -la #列出当前目录下所有文件,包括隐藏文件
  21. -rw------- 1 root root 18029 Aug 11 22:05 .bash_history
  22. -rw-r--r-- 1 root root 18 Dec 8 2016 .bash_logout
  23. -rw-r--r-- 1 root root 176 Dec 8 2016 .bash_profile
  24. 3ls -lh #已人类能查看的方式,列出文件的大小
  25. -rw-r--r-- 1 root root 22K Dec 8 2016 install.log
  26. 4ls -ld xujun #只列出目录的详细信息
  27. drwxr-xr-x 5 root root 4096 Aug 11 23:00 xujun
  28. 5ls -lrt #已时间倒叙的方式来列出
  29. -rw-r--r-- 1 root root 205 Feb 5 2017 xujun.txt.bz2
  30. -rw-r--r-- 1 root root 1 Aug 5 21:24 xujun.txt
  31. drwxr-xr-x 5 root root 4096 Aug 11 23:00 xujun

2.5 查看文件状态stat

  1. 主要案例:
  2. [root@db02 ~]# stat xujun.txt
  3. File: `xujun.txt'
  4. Size: 310 Blocks: 8 IO Block: 4096 regular file
  5. Device: 803h/2051d Inode: 916335 Links: 1
  6. Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
  7. Access: 2017-08-14 16:53:53.668136237 +0800 #Access:访问时间,查看文件内容,会改变访问时间
  8. Modify: 2017-08-14 16:53:48.144137021 +0800 #Modify:修改时间,修改文件内容,会改变修改时间
  9. Change: 2017-08-14 16:53:48.144137021 +0800 #Change:改变时间,修改文件、移动文件或改变文件属性,访问时间就会改变

2.6 windows文件转linux文件

2.6.1 使用notepad++软件转换

notepad++官方下载地址

使用notepad++打开文件—-编辑—-文档格式转换—-转为unix—-上传至linux

2194968-20220221150844733-197024555.png

2.6.2 dos2unix

直接使用dos2unix修改格式

在linux上执行,将文件改为unix格式

2194968-20220221153740587-1645426264.png

改为windows:unix2dos filename

2.7 文件通配符模式

2.7.1 通配符

  1. *(代表所有字符,比较常用)
  2. ?(代表任意一个字符)
  3. ~ 当前用户家目录
  4. ~xujun 用户xujun家目录
  5. [abcd] (匹配任何一个字符)
  6. [a-z] (表示az的范围)
  7. [0-9] 匹配数字范围
  8. {}(中间为命令区块组合或者内容序列)
  9. [^xujun] 匹配列表中的所有字符以外的字符

2.7.2 专用字符集合

  1. [[:digit:]] 任意数字 相当于[0-9]
  2. [[:lower:]] 任意小写字母
  3. [[:upper:]] 任意大写字母
  4. [[:alpha:]] 匹配任意字母(包含大小写)
  5. [[:alnum:]] 任意数字或字母
  6. [[:blank:]] 水平空白字符
  7. [[:space:]] 匹配空格
  8. [[:punct:]] 标点符号
  9. [[:print:]] 可打印字符
  10. [[:cntrl:]] 控制(非打印)字符
  11. [[:graph:]] 图形字符
  12. [[:xdigit:]] 十六进制字符

2.8 创建空文件和刷新时间

  1. touch 创建一个空白文件,假如当前目录有同样的文件,则会更新文件的时间戳
  2. 主要选项:
  3. -a 修改access(访问)时间
  4. -m 修改modify(修改)时间 这两个参数了解即可
  5. 主要案例:
  6. root@Ununtu-08:~# touch xujun.txt
  7. root@Ununtu-08:~# ls
  8. xujun.txt

2.9 复制文件和目录

  1. cp命令用于复制文件或目录
  2. #cp用法:
  3. cp 目标
  4. #常用选项
  5. -a 相当于-pdr
  6. -f 强制复制,不提示
  7. -i 覆盖的时候,询问用户是否覆盖
  8. #扩展用法:
  9. cp -a /etc/hosts{,.old}
  10. 主要案列:
  11. cp -a xujun.txt /oldboy

2.10 移动和重命名文件

  1. mv命令可以实现文件或目录的移动和改名
  2. 同一分区移动数据,速度很快,数据位置没有变化
  3. 不同分区移动数据,速度相对慢,数据位置发送了变化
  4. 主要选项:
  5. -f 强制移动,不提示
  6. -i 若目标文件已经存在,则会询问是否覆盖
  7. 主要案列:
  8. mv /xujun/xujun.txt /xujun/xj.txt

2.11 删除文件

  1. rm 删除文件或者目录,这个命令在日常工作中一定要慎用
  2. 主要选项:
  3. -r 递归删除文件或者目录
  4. -f 强制删除不提示
  5. 主要案列:
  6. rm -f xujun.txt

3 目录操作

3.1 显示目录树

  1. tree 显示目录树
  2. 主要选项:
  3. -a 显示所有文件和目录
  4. -d 只显示目录
  5. -L 后面接上数字,表示只显示几层树结构
  6. -f 为每个文件和目录显示完整的路径
  7. -F 可以用来区分文件和目录
  8. -i 不以阶梯状列出文件或目录名称
  9. 主要案例:
  10. [root@db02 ~]# tree -d -L 1 /application/
  11. /application/
  12. ├── apache2.2.17
  13. ├── mysql -> /application/mysql-5.6.35/
  14. └── mysql-5.6.35
  15. 3 directories

3.2 创建目录和删除目录

  1. mkdir 创建目录
  2. 主要选项:
  3. -p 递归创建目录
  4. 主要案例:
  5. mkdir /xujun
  6. mkdir -p /xujun/oldboy
  7. mkdir -p /xujun/oldboy{1,2} #创建多个目录
  8. [root@DNSys ~]# tree -L 1 / >>xujun.txt
  9. [root@DNSys ~]# cd /tmp/
  10. [root@DNSys tmp]# mkdir -p `cat /root/xujun.txt` #创建多级子目录
  1. rmdir 删除空目录
  2. 主要选项:
  3. -p 删除某目录后,如果其父目录为空,则一并删除
  4. 主要案例:
  5. rmdir /oldboy
  6. 当前rm -rf也可以删除目录,并且可以删除有文件的目录

4 文件系统

4.1 文件系统介绍

文件系统filesystem是操作系统内核中负责组织管理磁盘的程序。

在传统的磁盘与档案系统(又称为文件系统filesystem)的应用中,一个磁盘分隔槽/分区只能被格式化称为一个文件系统,所以我们可以说一个filesystem就是一个partition分区。但是由于新技术的利用,列如我们常听到的LVM与软体磁盘整列(又称为软raid),这些技术可以将一个分区格式化为多个文件系统(列如LVM),也能够将多个分区合成一个文件系统(LVM,RAID)!所以说,目前我们在格式化时已经不再说成针对分区来格式化了,通常我们可以称呼一个可被挂载的资料为一个文件系统而不是一个分区。

Linux常见文件系统有xfs、ext4和btrfs文件系统,它们都是日志文件系统(其特点是文件系统将没提交的数据变化保存到日志文件,以便在系统崩溃或者掉电时恢复数据),三者各有优势和劣势:

  • btrfs是个很新的文件系统,它将会支持许多非常高大上的功能,比如透明压缩、可写的COW快照、去重和加密。
  • xfs和btrfs相比较ext3/4而言,在高伸缩性数据存储方面具有优势

PS:windows文件系统格式:FAT32、NTFS

总结:

  1. 操作系统----> 文件系统 文件系统 文件系统
  2. 硬盘--------> 分区1 分区2 分区3

4.2 文件系统工作原理

一个文件的是由两部分内容组成:

  1. 1、文件的元信息,列如权限(rwx)、拥有者、群组、时间参数等
  2. 2、文件的实际内容

文件系统通常会将这两部分的内容分别存放在不同的区块

  1. 1、文件的元信息放置到inode区块中
  2. 2、文件的实际内容则放置到data block区块中
  3. 另外:文件还有一个超级区块(superblock)会记录整个档案系统的整体信息,包括inodeblock的总量、使用量、剩余量等

补充说明:

  1. # 硬盘的最小存取单位 -> 扇区
  2. # 操作系统的最小存取单位 -> block块
  3. 文件存储在硬盘上,硬盘的最小存储单位叫做扇区,每个扇区存储512字节。
  4. 操作系统读取硬盘的时候,不会一个扇区一个扇区的读取,这样效率太低,于是操作系统中的文件系统负责将磁盘的多扇区组织成一个个的block块,这样操作系统就可以一次性读取一个块。即一次性连续读取多个扇区。这种由多个扇区组成的块,是文件存取的最小单位。块的大小,最常见的是4KB,即连续八个sector组成一个block

总结文件系统的三种区块inode、block、superblock的意义如下:

  1. #1、superblock
  2. 记录此filesystem的整体信息,包括inode/block的总量、使用量、剩余量,以及文件系统的格式与相关信息等。
  3. #2、inode
  4. 记录文件元信息,包括文件对应的一个或多个block块号码
  5. 一个文件被分配唯一一个inode
  6. #3、block
  7. 记录文件实际内容
  8. 一个文件过大时可能会被分配多个block块,即一个文件可能对应多个block块的号码,这些号码都存放在该文件的inode

image-20220501165440588.png

我们cat /etc/passwd的整体过程如下:

image-20220501165530582.png

依据上诉存取方式的特点,我们通常称ext文件系统为索引式文件系统。

4.3 扩展阅读

4.3.1 inode信息

文件的inode中文译名为索引节点,是UNIX操作系统中的一种数据结构,其本质是结构体。

Inode负责存储文件的元信息,比如文件的创建者、文件的创建日期、文件的大小inode。

从根本上讲,inode中存放的是除了文件的名字以及文件真实内容之外、所有有关文件的信息/元数据,如下:

  1. inode 编号
  2. 用来识别文件类型
  3. 链接数,即有多少个文件名指向这个inode
  4. 属主的ID
  5. 属主的组ID
  6. 文件的字节数
  7. 文件所使用的的磁盘块的实际数目
  8. 文件的时间戳,共有三个:ctimeinode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
  9. 指向数据块的指针

4.3.2 inode的大小

inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据。另一个是inode区,存放inode所包含的信息。

每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。

查看inode总数和已经使用的数量,可以使用df -i命令。

查看每个inode节点的大小,可以用如下命令:

  1. # 查看ext文件系统信息
  2. [17:11:36 root@nginx-18 ~]# dumpe2fs -h /dev/sda |grep "Inode size"
  3. #查看xfs文件系统信息
  4. [17:11:45 root@nginx-18 ~]# xfs_info /dev/sda3
  5. # isize表示未inode大小。agcount为存储区群组(allocation group)的个数
  6. meta-data=/dev/sda3 isize=512 agcount=4, agsize=1114048 blks
  7. #sectsz指逻辑扇区(sector)的容量大小
  8. = sectsz=512 attr=2, projid32bit=1
  9. = crc=1 finobt=0 spinodes=0
  10. #bsize指block容量大小
  11. data = bsize=4096 blocks=4456192, imaxpct=25
  12. # sunit与swidth与stripe相关
  13. = sunit=0 swidth=0 blks
  14. naming =version 2 bsize=4096 ascii-ci=0 ftype=1
  15. # internal指登录区在文件系统内部,而不在外部
  16. # bsize指占用区块大小,blocks为数量
  17. log =internal bsize=4096 blocks=2560, version=2
  18. = sectsz=512 sunit=0 blks, lazy-count=1
  19. # realtime p区域信息。extsz指extent size
  20. realtime =none extsz=4096 blocks=0, rtextents=0

由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是磁盘还未存满的情况。这时,就无法在磁盘上创建新文件。

4.3.3 inode号码

每个inode都有一个号码,操作系统用inode号码来识别不同的文件。

用户通过文件名打开文件。实际上,系统内部分为三个部分:

  • 首先,系统找到这个文件名对应的inode号码
  • 其次,通过inode号码,获取inode信息
  • 最后,根据inode信息,找到文件数据所在的block,读出数据
  1. 获取文件inode信息
  2. [17:19:39 root@nginx-18 ~]# ls -i xujun.txt
  3. 33574981 xujun.txt

4.3.4 目录项

Linux系统中,目录也是一种文件。打开目录,实际上就是打开目录文件。

目录文件的结构非常简单,就是一系列目录项的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码

  1. ls -i 命令列出整个目录文件,即文件名和inode号码
  2. [17:19:43 root@nginx-18 ~]# ls -i /etc/

4.4 Inode的特殊作用

由于Inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象。

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

所以说为什么每次修改完服务器配置文件后,都需要重新加载一下配置文件?

这是因为每次vim修改完之后,inode号都会改变,系统还是读取原来的inode号的配置文件,所以需要重启服务,重新加载一下配置文件。

4.5 硬链接和软链接

Linux链接分为两种

  • 硬链接 ```shell 【硬连接】:硬连接指通过索引节点号来进行连接。inode是可以对应多个文件名的

扩展阅读

inode信息中有一项叫做”链接数”,记录指向该inode的文件名总数,这时就会增加1。反过来,删除一个文件名,就会使得inode节点中的”链接数”减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域。

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

  1. <br />![image-20220501172804361.png](https://cdn.nlark.com/yuque/0/2022/png/1602714/1651501935233-e8d81b89-c3a3-4600-a99c-1b1328635867.png#clientId=ueaf307d7-e108-4&crop=0&crop=0&crop=1&crop=1&from=ui&id=u4be8b24e&margin=%5Bobject%20Object%5D&name=image-20220501172804361.png&originHeight=235&originWidth=349&originalType=binary&ratio=1&rotation=0&showTitle=false&size=4602&status=done&style=none&taskId=u1486eb7b-5086-4d16-918a-f28fcd0ee1a&title=)
  2. - 软链接
  3. ```shell
  4. 软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。
  5. 如下图所示
  6. 文件2和文件1的inode号码虽然不一样,但是文件2的内容是文件1的路径。读取文件2时,系统会自动将访问者导向文件1。因此,无论打开哪一个文件,最终读取的都是文件1。这时,文件2就称为文件1的"软链接"(soft link)或者"符号链接(symbolic link)。
  7. 这意味着,文件2依赖于文件1而存在,如果删除了文件1,打开文件2就会报错:"No such file or directory"。这是软链接与硬链接最大的不同:文件2指向文件1的路径,而不是文件1的inode号码,文件1的inode"链接数"不会因此发生变化。


image-20220501172909935.png

4.5.1 硬链接总结

  1. 0.对硬链文件内容进行修改,会影响到所有文件名;
  2. 1.硬链接文件与源文件具有相同inode的不同文件名:一个文件只能有一个inode号,但多个文件的inode号可以相同
  3. 2.删除硬链接或者原文件之一,不影响另一个文件名的访问,除非所有的都删除掉,所以硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。
  4. 3.删除所有硬链接,数据会在被磁盘检查或者新数据写入时候删除回收。
  5. 4.通过ln [原文件] [目标文件]设置硬链接
  6. 5.通过rm f 删除硬链接
  7. 6.目录不可创建硬链接,并且硬链接无法跨区
  8. # 示例
  9. [root@localhost ~]# touch small_egon.txt
  10. [root@localhost ~]# ln small_egon.txt big_egon.txt
  11. [root@localhost ~]# ls -i small_egon.txt
  12. 17696460 small_egon.txt
  13. [root@localhost ~]# ls -i big_egon.txt
  14. 17696460 big_egon.txt
  15. [root@localhost ~]# ll small_egon.txt # 两个硬链接文件的硬链接数均为2
  16. -rw-r--r-- 2 root root 0 12 16 17:05 small_egon.txt
  17. [root@localhost ~]# ll big_egon.txt # 两个硬链接文件的硬链接数均为2
  18. -rw-r--r-- 2 root root 0 12 16 17:05 big_egon.txt

4.5.2 软链接总结

  1. #0. 对软链的源文件或目标文件内容进行修改,会影响到所有文件名;
  2. #1. 软链接文件与源文件具有不同的inode号
  3. #2. 删除软连接文件的源文件,软链接文件将无法使用,软链接作用
  4. - 1.软件升级
  5. - 2.企业代码发布
  6. - 3.不方便目录移动
  7. #3. 删除源文件后,软连接文件无效,应该也一起删除掉,以便回收
  8. #4. 执行ln –s [原文件] [目标文件]创建软链接
  9. #5. rm –f 删除软链接
  10. #6、可以对目录创建软链接,并且软连接可以跨分区
  11. [root@localhost ~]# touch 1.txt
  12. [root@localhost ~]# ln -s 1.txt 2.txt
  13. [root@localhost ~]# ls -i 1.txt
  14. 17696462 1.txt
  15. [root@localhost ~]# ls -i 2.txt
  16. 17696463 2.txt
  17. [root@localhost ~]#
  18. [root@localhost ~]# ll 1.txt # 两个软链接文件的硬链接数均为1
  19. -rw-r--r-- 1 root root 0 12 16 17:26 1.txt
  20. [root@localhost ~]# ll 2.txt # 两个软链接文件的硬链接数均为1
  21. lrwxrwxrwx 1 root root 5 12 16 17:26 2.txt -> 1.txt
  22. [root@localhost ~]#
  23. [root@localhost ~]# rm -rf 1.txt # 删掉1.txt,会发现2.txt不可用
  24. [root@localhost ~]# ll 2.txt
  25. lrwxrwxrwx 1 root root 5 12 16 17:26 2.txt -> 1.txt
  26. [root@localhost ~]#
  27. [root@localhost ~]# mkdir /dir1
  28. [root@localhost ~]# ln /dir1 /dir2
  29. ln: "/dir1": 不允许将硬链接指向目录
  30. [root@localhost ~]#
  31. [root@localhost ~]# ln -s /dir1/ /dir2

4.6 实战应用

磁盘有空间但是创建不了文件

实战场景:在一台配置较低的Linux服务器(内存、硬盘比较小)的/data分区内创建文件时,系统提示磁盘空间不足,用df -h命令查看了一下磁盘使用情况,发现/data分区只使用了80% ,还有1.9G的剩余空间,但是无法创建新的文件。当时使用的是root用户,服务器没有被黑。

  1. [root@xxx ~]# df -h
  2. 文件系统 容量已用 可用 已用% 挂载点
  3. /dev/sda310G 8.0G 1.9G 80%/

排查:

  1. [root@xxx ~]# df -i
  2. 文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
  3. /dev/sda3 5242880 52428800 100%/

后来使用df -i查看了一下/data分区的索引节点,发现已经用满,导致系统无法创建新目录和文件。具体原因就是,/data的目录下有非常多的小字节文件,占用的block不多,但是占用了大量的inode。

  1. 解决方案1:删除/data目录中的部分文件,释放出一部分的inode
  2. 解决方案2:在/data备份好一些文件,然后删除这些文件,释放一些inode,然后创建一个目录/data/cache2。在cache2下挂载一个新分区:sda4,下次写数据需要写到新分区cache2目录下。