Linux基础之文件管理(高级)下等相关内容-97

 

文件管理之(高级)

五 文件管理之:字符处理命令

5.1 sort命令

用于将文件内容加以排序
   -n # 依照数值的大小排序
   -r # 以相反的顺序来排序
   -k # 以某列进行排序
   -t # 指定分割符,默认是以空格为分隔符
准备文件,写入一段无序的内容
[root@localhost ~]# cat >> file.txt <<EOF
b:3
c:2
a:4
e:5
d:1
f:11
EOF

例1
[root@localhost ~]# sort file.txt
a:4
b:3
c:2
d:1
e:5
f:11

例2
[root@localhost ~]# sort -t ":" -n -k2 file.txt
d:1
c:2
b:3
a:4
e:5
f:11

例3
[root@localhost ~]# sort -t ":" -n -r -k2 file.txt
f:11
e:5
a:4
b:3
c:2
d:1

5.2 uniq 命令

用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用
   -c # 在每列旁边显示该行重复出现的次数。
   -d # 仅显示重复出现的行列。
   -u # 仅显示出一次的行列。
准备文件,写入一段无序的内容
[root@localhost ~]# cat > file.txt <<EOF
hello
123
hello
123
func
EOF

例1
[root@localhost ~]# sort file.txt
123
123
func
hello
hello

例2
[root@localhost ~]# sort file.txt | uniq
123
func
hello

例3
[root@localhost ~]# sort file.txt | uniq -c
   2 123
   1 func
   2 hello
   
例4
[root@localhost ~]# sort file.txt | uniq -d
123
hello

5.3 cut 命令

cut命令用来显示行中的指定部分,删除文件中指定字段
   -d # 指定字段的分隔符,默认的字段分隔符为"TAB";
   -f # 显示指定字段的内容;
[root@localhost ~]# head -1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]# head -1 /etc/passwd | cut -d ":" -f1,3,4,6
root:0:0:/root

5.4 tr命令

替换或删除命令
   -d # 删除字符
例1
[root@localhost ~]# head -1 /etc/passwd |tr "root" "ROOT"
ROOT:x:0:0:ROOT:/ROOT:/bin/bash
[root@localhost ~]#
[root@localhost ~]# head -1 /etc/passwd |tr -d "root"
:x:0:0::/:/bin/bash

例2
[root@localhost ~]# echo "hello egon qq:378533872" > a.txt
[root@localhost ~]# tr "egon" "EGON" < a.txt
hEllO EGON qq:378533872

5.5 wc命令

统计,计算数字
   -c # 统计文件的Bytes数;
   -l # 统计文件的行数;
   -w # 统计文件中单词的个数,默认以空白字符做为分隔符
例1
[root@localhost ~]# ll file.txt
-rw-r--r--. 1 root root 25 8月 12 20:09 file.txt
[root@localhost ~]# wc -c file.txt
25 file.txt

例2
[root@localhost ~]# cat file.txt
hello
123
hello
123
func
[root@localhost ~]# wc -l file.txt
5 file.txt
[root@localhost ~]# grep "hello" file.txt |wc -l
2

例3
[root@localhost ~]# cat file.txt
hello
123
hello
123
func
[root@localhost ~]# wc -w file.txt
5 file.txt

六 文件管理之:打包压缩

1. 什么是打包压缩
   打包指的是将多个文件和目录合并为一个特殊文件
   然后将该特殊文件进行压缩
   最终得到一个压缩包
   
2. 为什么使用压缩包
   1.减少占用的体积
   2.加快网络的传输
   
3. Windows的压缩和Linux的有什么不同
   windows: zip rar(linux不支持)
   linux: zip tar.gz tar.bz2 .gz
   如果希望windows的软件能被linux解压,或者linux的软件包被windows能识别,选择zip.
   PS: 压缩包的后缀不重要,但一定要携带.
   
4. Linux下常见的压缩包类型
   格式   压缩工具
   .zip     zip压缩工具
   .gz     gzip压缩工具,只能压缩文件,会删除源文件(通常配合tar使用)
   .bz2     bzip2压缩工具,只能压缩文件,会删除源文件(通常配合tar使用)
   .tar.gz 先使用tar命令归档打包,然后使用gzip压缩
   .tar.bz2 先使用tar命令归档打包,然后使用bzip压缩
   ps:windows下支持.rar,linux不支持.rar
   
5. 打包压缩方法
方法一:
       # 1、打包
       [root@localhost test]# tar cvf etc_bak.tar /etc/ # c创建 v详细 f打包后文件路径
       ps:
       打包的目标路径如果是绝对路径,会提示:tar: 从成员名中删除开头的“/”,不影响打包,
       添加-P选项便不再提示:tar cvPf ...
       可以cd 到 /etc下然后tar cvf etc_bak.tar *打包,这样去掉了一层文件夹

       # 2、压缩
       [root@localhost test]# gzip etc_bak.tar # 文件体积变小,并且加上后缀.gz
       ps:
       gzip -> gunzip
       bzip2-> bunzip2

       # 3、上述两步可以合二为一
       [root@localhost test]# tar czvf etc1_bak.tar.gz /etc/ # 选项z代表gzip压缩算法
       [root@localhost test]# tar cjvf etc1_bak.tar.bz2 /etc/ # 选项j代表bzip2压缩算法
   
   方法二:
  #zip压缩
       选项:
       -r #递归压缩 压缩目录
       -q #静默输出
       # 示例1、
       [root@localhost ~]# zip /test/bak.zip a.txt b.txt c.txt # zip后的第一个参数是压缩包
       路径,其余为被压缩的文件
       adding: a.txt (stored 0%)
       adding: b.txt (stored 0%)
       adding: c.txt (stored 0%)
       [root@localhost ~]# ls /test/
       bak.zip
       # 示例1、
       [root@localhost ~]# zip -rq etc.zip /etc # 加上-q后压缩过程不再提示
       
6. 解压缩
   #1、针对xxx.tar.gz 或者 xxx.tar.bz2,统一使用
   [root@localhost test]# tar xvf 压缩包 -C 解压到的目录 # 无需指定解压算法,tar会自动判断
   #2、针对xxx.zip,用unzip
   选项:
   -l #显示压缩包的列表信息
   -q #静默输出
   -d #解压到指定的目录
   [root@localhost test]# unzip -q xxx.zip -d /opt
   
7. 拓展
打包压缩通常用于备份文件,文件的名字必须见名知意且应该带上时间、主机名之类
时间命令date

#选项
   -d #根据你的描述显示日期
   -s #修改日期
   %H #小时,24小时制(00~23)
   %M #分钟(00~59)
   %s #从1970年1月1日00:00:00到目前经历的秒数
   %S #显示秒(00~59)
   %T #显示时间,24小时制(hh:mm:ss)
   %d #一个月的第几天(01~31)
   %j #一年的第几天(001~366)
   %m #月份(01~12)
   %w #一个星期的第几天(0代表星期天)
   %W #一年的第几个星期(00~53,星期一为第一天)
   %y #年的最后两个数字(1999则是99)
   %Y #年,实际
   %F #显示日期(%Y-%m-%d)
   
   示例
   [root@localhost ~]# date
   2020年 08月 12日 星期三 20:55:48 CST
   [root@localhost ~]# date +%F
   2020-08-12
   [root@localhost ~]# date +%Y-%m-%d
   2020-08-12
   [root@localhost ~]#
   [root@localhost ~]# date +%y-%m-%d
   20-08-12
   [root@localhost ~]# date +%T
   00:01:03
   [root@localhost ~]# date +%H:%M:%S
   00:01:11
   [root@localhost ~]#
   [root@localhost ~]# date +%w
   3
   [root@localhost ~]# date +%s
   1597236988
   [root@localhost ~]# date +%d
   12
   [root@localhost ~]# date +%W
   32
   [root@localhost ~]# date +%j
   225
   [root@localhost ~]# date -d "-1 day" +%F
   2020-08-11
   [root@localhost ~]# date -d "1 day" +%F
   2020-08-13
   [root@localhost ~]# date -d "+1 day" +%F
   2020-08-13
   [root@localhost ~]# date -d "3 years" +%F
   2023-08-12
   [root@localhost ~]# date -d "+3 years" +%F
   2023-08-12
   [root@localhost ~]# date -d "+3 hours" +%F_%H:%M:%S
   2020-08-12_23:58:06
   [root@localhost ~]# date -s 20201111
   2020年 11月 11日 星期三 00:00:00 CST
   [root@localhost ~]# date -s 11:11:11
   2020年 11月 11日 星期三 11:11:11 CST
   [root@localhost ~]# date -s "20201111 11:11:11"
   2020年 11月 11日 星期三 11:11:11 CST
   [root@localhost ~]# date +%F
   2020-11-11
   [root@localhost ~]# date +%T
   11:11:29
   
   再看备份
   [root@localhost ~]# tar czvf `date +%F`_bak.tar.gz /etc
   [root@localhost ~]# tar czvf `date +%F_%H_%M_%S`_bak.tar.gz /etc # 如果带有时分
   秒,不要用冒号分隔,因为文件名的命名里不能带有冒号

七 文件系统

7.1 文件系统介绍

文件系统filesystem是操作系统内核中负责组织管理磁盘的程序。
在传统的磁盘与档案系统(又称为文件系统filesystem)的应用中,一个磁盘分割槽/分区只能被格式化
成为一个文件系统,所以我们可以说一个filesystem就是一个partition分区。但是由于新技术的利用,
例如我们常听到的LVM与软体磁盘阵列(software raid,又称软raid),这些技术可以将一个分区格式化
为多个文件系统(例如LVM),也能够将多个分区合成一个文件系统(LVM, RAID)!所以说,目前我们在格
式化时已经不再说成针对分区来格式化了,通常我们可以称呼一个可被挂载的资料为一个文件系统而不
是一个分区!。
linux常见文件系统有xfs、ext4 和 btrfs 文件系统,它们都是日志文件系统(其特点是文件系统将没
提交的数据变化保存到日志文件,以便在系统崩溃或者掉电时恢复数据),三者各有优势和劣势:
   btrfs (B-tree 文件系统) 是个很新的文件系统(Oracel 在2014年8月发布第一个稳定版),它将
   会支持许多非常高大上的功能,比如 透明压缩( transparent compression)、可写的COW 快照
   (writable copy-on-write snapshots)、去重(deduplication )和加密(encryption )。因
   此,Ceph 建议用户在非关键应用上使用该文件系统。 更多的参考包括 (1)(2)(3)。
   xfs 和 btrfs 相比较ext3/4而言,在高伸缩性数据存储方面具有优势。
   Ceph 的这篇文章 明确推荐在生产环境中使用 XFS,在开发、测试、非关键应用上使用 btrfs。
   
   ps:windows文件系统格式: FAT32、NTFS

总结
操作系统---------》文件系统 文件系统 文件系统
硬盘------------》 分区1 分区2 分区3

7.2 文件系统工作原理

文件系统如何工作的呢?
须知一个文件的由两部分内容组成:
- 1、文件的元信息,例如权限(rwx)、拥有者、群组、时间参数等。
- 2、文件的实际内容

文件系统通常会将这两部份的分别存放在不同的区块
- 1、文件的元信息放置到inode区块中
- 2、文件的实际内容则放置到data block区块中。
# 强调:每个inode 与block 都有自己的编号

另外,文件还有一个超级区块(superblock)会记录整个档案系统的整体信息,包括inode与block的总
量、使用量、剩余量等。
补充说明:
# 硬盘的最小存取单位-》扇区
# 操作系统的最小存取单位-》block块
文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector),每个扇区储存512字节(相当于
0.5KB)。
操作系统读取硬盘的时候,不会一个扇区一个扇区地读取,这样效率太低,于是操作系统中的文件系统负责将
磁盘的多扇区组织成一个个的block块,这样操作系统就可以一次性读取一个"块"(block),即一次性连续
读取多个扇区。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续
八个 sector组成一个 block。
总结文件系统的三种区块inode、block、superblock的意义如下:
#1、superblock:
记录此filesystem的整体信息,包括inode/block的总量、使用量、剩余量, 以及文件系统的格式与相关
信息等;
#2、inode:
(1) 记录文件元信息,包括文件对应的一个或多个block块号码
(2) 一个文件被分配唯一一个inode
#3、block:
(1) 记录文件实际内容
(2) 一个文件过大时可能会被分配多个block快,即一个文件可能对应多个block块的号码,这些号码都存放
在该文件的innode里

举例
[root@localhost ~]# ls -di /
64 /
[root@localhost ~]# ls -di /etc
8388673 /etc
[root@localhost ~]# ls -i /etc/passwd
8769396 /etc/passwd
[root@localhost ~]#

cat /etc/passwd的整体过程如下

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

7.3 扩展阅读

7.3.1 inode信息

文件的inode中文译名为"索引节点",是 UNIX 操作系统中的一种数据结构,其本质是结构体。
Inode负责储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小inode 。
从根本上讲, inode 中存放的是除了文件的名字以及文件真实内容之外、所有有关文件的信息/元数据
(metadata),如下
   ● inode 编号
   ● 用来识别文件类型,以及用于 stat C 函数的模式信息
   ● 链接数,即有多少文件名指向这个inode。
   ● 属主的ID (UID)
   ● 属主的组 ID (GID)
   ● 文件的字节数
   ● 文件所使用的磁盘块的实际数目
   ● 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,
   atime指文件上一次打开的时间。
   ● 指向数据块的指针

可以用stat命令,,查看某个文件的inode信息:
[root@localhost ~]# stat egon.txt
文件:"egon.txt"
大小:0 块:0 IO 块:4096 普通空文件
设备:803h/2051d Inode:16813492 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2022-12-16 16:25:29.664259627 +0800
最近更改:2022-12-16 16:25:29.664259627 +0800
最近改动:2022-12-16 16:25:29.664259627 +0800
创建时间:-
# 三种时间解释
atime : access time 访问文件内容的时间。对文件进行一次读操作,它的访问时间就会改变。例如像:
cat、more等操作,但是像之前的stat还有ls命令对atime是不会有影响的。
mtime : modify time 修改文件内容的时间。文件的内容被最后一次修改的时间,我们经常用的ls -l
命令显示出来的文件时间就是这个时间,当用vim对文件进行编辑之后保存,它的mtime就会相应的改变;比
如:如:echo aa >> a.sh 或vim a.txt 修改内容
ctime : change time 指inode上一次文件属性变动的时间。当文件的状态被改变的时候,状态时间就
会随之改变,例如当使用chmod、chown等改变文件属性的操作是会改变文件的ctime的。chmod +x
a.txt
例1:使用cat命令查看文件后,文件atime变更
[root@localhost ~]# touch egon.txt
[root@localhost ~]# stat egon.txt
文件:"egon.txt"
大小:0 块:0 IO 块:4096 普通空文件
设备:803h/2051d Inode:16813492 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2022-12-16 16:25:29.664259627 +0800
最近更改:2022-12-16 16:25:29.664259627 +0800
最近改动:2022-12-16 16:25:29.664259627 +0800
创建时间:-
[root@localhost ~]# cat egon.txt
[root@localhost ~]# stat egon.txt
文件:"egon.txt"
大小:0 块:0 IO 块:4096 普通空文件
设备:803h/2051d Inode:16813492 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2022-12-16 16:29:26.162262768 +0800
最近更改:2022-12-16 16:25:29.664259627 +0800
最近改动:2022-12-16 16:25:29.664259627 +0800
创建时间:-
[root@localhost ~]#

例2:使用vim命令写文件w后,文件atime、mtime、ctime都会变更。如果vim打开后只是查看没有写
的话,只会变更atime。

例3:
[root@localhost ~]# stat egon.txt
文件:"egon.txt"
大小:9 块:8 IO 块:4096 普通文件
设备:803h/2051d Inode:17696455 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2022-12-16 16:35:21.943267492 +0800
最近更改:2022-12-16 16:35:46.131267813 +0800
最近改动:2022-12-16 16:35:46.131267813 +0800
创建时间:-
[root@localhost ~]# chmod 000 egon.txt
[root@localhost ~]# stat egon.txt
文件:"egon.txt"
大小:9 块:8 IO 块:4096 普通文件
设备:803h/2051d Inode:17696455 硬链接:1
权限:(0000/----------) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2022-12-16 16:35:21.943267492 +0800
最近更改:2022-12-16 16:35:46.131267813 +0800
最近改动:2022-12-16 16:36:43.423268574 +0800
创建时间:-
[root@localhost ~]#

7.3.2 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节点的大小,可以用如下命令:
# 查看ext文件系统信息
sudo dumpe2fs -h /dev/hda | grep "Inode size"
# 查看xfs文件系统信息
xfs_info /dev/sda1
[root@localhost ~]# xfs_info /dev/sda1
# isize表示为inode大小;agcount为存储区群组(allocation group)的个数;
meta-data=/dev/sda1 isize=512 agcount=4, agsize=65536 blks
# sectsz指逻辑扇区(sector)的容量大小;
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
# bsize指block容量大小;
data = bsize=4096 blocks=262144, imaxpct=25
# sunit与swidth与stripe相关
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
# internal指登录区(log p)在文件系统内部,而不在外部
# bsize指占用区块大小,blocks为数量;
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
# realtiem p区域信息;extsz指extent size;
realtime =none extsz=4096 blocks=0, rtextents=0
由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。这时,
就无法在硬盘上创建新文件。

7.3.3 inode号码

每个inode都有一个号码,操作系统用inode号码来识别不同的文件。
这里值得重复一遍,Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件
名只是inode号码便于识别的别称或者绰号。表面上,用户通过文件名,打开文件。实际上,系统内部
这个过程分成三步:
   首先,系统找到这个文件名对应的inode号码;
   其次,通过inode号码,获取inode信息;
   最后,根据inode信息,找到文件数据所在的block,读出数据。
使用ls -i命令,可以看到文件名对应的inode号码,例如:
   ls -i demo.txt

7.3.4 目录项

Linux系统中,目录(directory)也是一种文件。打开目录,实际上就是打开目录文件。
目录文件的结构非常简单,就是一系列目录项(dirent)的列表。每个目录项,由两部分组成:所包含
文件的文件名,以及该文件名对应的inode号码。
ls命令只列出目录文件中的所有文件名:
ls /etc

ls -i命令列出整个目录文件,即文件名和inode号码:
ls -i /etc

如果要查看文件的详细信息,就必须根据inode号码,访问inode节点,读取信息。ls -l命令列出文件的
详细信息。
ls -l /etc

7.3.5 FAT文件系统

U盘使用的档案系统一般为FAT格式。FAT这种格式的档案系统并没有inode存在,所以FAT没有办法将
这个档案的所有block在一开始就读取出来。每个block号码都记录在前一个block当中,他的读取方式
有点像底下这样:

上图中我们假设档案的资料依序写入1->7->4->15号这四个block 号码中, 但这个档案系统没有办法一
口气就知道四个block 的号码,他得要一个一个的将block 读出后,才会知道下一个block 在何处。如果
同一个档案资料写入的block 分散的太过厉害时,则我们的磁盘读取头将无法在磁盘转一圈就读到所有
的资料, 因此磁盘就会多转好几圈才能完整的读取到这个档案的内容!
常常会听到所谓的『碎片整理』吧? 需要碎片整理的原因就是档案写入的block太过于离散了,此时档
案读取的效能将会变的很差所致。 这个时候可以透过碎片整理将同一个档案所属的blocks汇整在一
起,这样资料的读取会比较容易啊! 想当然尔,FAT的档案系统需要三不五时的碎片整理一下,那么
Ext2是否需要磁盘重整呢?
由于Ext2 是索引式档案系统,基本上不太需要常常进行碎片整理的。但是如果档案系统使用太久, 常
常删除/编辑/新增档案时,那么还是可能会造成档案资料太过于离散的问题,此时或许会需要进行重整
一下的。

7.4 Inode的特殊作用

由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象。
   1. 有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作
   用。
   2. 移动文件或重命名文件,只是改变文件名,不影响inode号码。
   3. 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系
   统无法从inode号码得知文件名。
   
[root@localhost ~]# ls -i egon.txt
17696455 egon.txt
[root@localhost ~]# vim egon.txt # vim编辑器写文件,会改变inode号
[root@localhost ~]# ls -i egon.txt
17696461 egon.txt
[root@localhost ~]#
[root@localhost ~]# mv egon.txt EGON.txt # 重命名文件不会影响inode号
[root@localhost ~]# ls -i EGON.txt
17696461 EGON.txt
[root@localhost ~]#

问:为什么每次修改完服务器配置文件后,都需要重新加载一下配置文件?
答:因为vim每次修改完后,Inode号都会变,系统还是读取的原来inode号的配置文件,每次修改
完服务器的配置文件,都要重启服务,重新读一下配置文件。

7.5 硬链接和软链接

Linux链接分两种
   1、一种被称为硬链接(Hard Link)
       【硬连接】:硬连接指通过索引节点号来进行连接。inode是可以对应多个文件名的
       # 扩展阅读
       inode信息中有一项叫做"链接数",记录指向该inode的文件名总数,这时就会增加1。反过来,删除一
       个文件名,就会使得inode节点中的"链接数"减1。当这个值减到0,表明没有文件名指向这个inode,
       系统就会回收这个inode号码,以及其所对应block区域。
       这里顺便说一下目录文件的"链接数"。创建目录时,默认会生成两个目录项:"."和".."。前者的
       inode号码就是当前目录的inode号码,等同于当前目录的"硬链接";后者的inode号码就是当前目录
       的父目录的inode号码,等同于父目录的"硬链接"。所以,任何一个目录的"硬链接"总数,总是等于2
       加上它的子目录总数(含隐藏目录),这里的2是父目录对其的“硬链接”和当前目录下的".硬链接“。

    2、另一种被称为软链接,即符号链接(Symbolic Link)
软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是
       一个文本文件,其中包含的有另一文件的位置信息。
       如下图所示
       文件2和文件1的inode号码虽然不一样,但是文件2的内容是文件1的路径。读取文件2时,系统会自动
       将访问者导向文件1。因此,无论打开哪一个文件,最终读取的都是文件1。这时,文件2就称为文件1
       的"软链接"(soft link)或者"符号链接(symbolic link)。
       这意味着,文件2依赖于文件1而存在,如果删除了文件1,打开文件2就会报错:"No such file or
       directory"。这是软链接与硬链接最大的不同:文件2指向文件1的路径,而不是文件1的inode号码,
       文件1的inode"链接数"不会因此发生变化。

硬链接知识点提炼
0.对硬链文件内容进行修改,会影响到所有文件名;
1.硬链接文件与源文件具有相同inode的不同文件名:一个文件只能有一个inode号,但多个文件的inode号
可以相同
2.删除硬链接或者原文件之一,不影响另一个文件名的访问,除非所有的都删除掉,所以硬连接的作用是允许
一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。
3.删除所有硬链接,数据会在被磁盘检查或者新数据写入时候删除回收。
4.通过ln [原文件] [目标文件]设置硬链接
5.通过rm –f 删除硬链接
6.目录不可创建硬链接,并且硬链接无法跨区
# 示例
[root@localhost ~]# touch small_egon.txt
[root@localhost ~]# ln small_egon.txt big_egon.txt
[root@localhost ~]# ls -i small_egon.txt
17696460 small_egon.txt
[root@localhost ~]# ls -i big_egon.txt
17696460 big_egon.txt
[root@localhost ~]# ll small_egon.txt # 两个硬链接文件的硬链接数均为2
-rw-r--r-- 2 root root 0 12月 16 17:05 small_egon.txt
[root@localhost ~]# ll big_egon.txt # 两个硬链接文件的硬链接数均为2
-rw-r--r-- 2 root root 0 12月 16 17:05 big_egon.txt
软链接知识提炼
#0. 对软链的源文件或目标文件内容进行修改,会影响到所有文件名;
#1. 软链接文件与源文件具有不同的inode号
#2. 删除软连接文件的源文件,软链接文件将无法使用,软链接作用
- 1.软件升级
- 2.企业代码发布
- 3.不方便目录移动
#3. 删除源文件后,软连接文件无效,应该也一起删除掉,以便回收
#4. 执行ln –s [原文件] [目标文件]创建软链接
#5. rm –f 删除软链接
#6、可以对目录创建软链接,并且软连接可以跨分区
[root@localhost ~]# touch 1.txt
[root@localhost ~]# ln -s 1.txt 2.txt
[root@localhost ~]# ls -i 1.txt
17696462 1.txt
[root@localhost ~]# ls -i 2.txt
17696463 2.txt
[root@localhost ~]#
[root@localhost ~]# ll 1.txt # 两个软链接文件的硬链接数均为1
-rw-r--r-- 1 root root 0 12月 16 17:26 1.txt
[root@localhost ~]# ll 2.txt # 两个软链接文件的硬链接数均为1
lrwxrwxrwx 1 root root 5 12月 16 17:26 2.txt -> 1.txt
[root@localhost ~]#
[root@localhost ~]# rm -rf 1.txt # 删掉1.txt,会发现2.txt不可用
[root@localhost ~]# ll 2.txt
lrwxrwxrwx 1 root root 5 12月 16 17:26 2.txt -> 1.txt
[root@localhost ~]#
[root@localhost ~]# mkdir /dir1
[root@localhost ~]# ln /dir1 /dir2
ln: "/dir1": 不允许将硬链接指向目录
[root@localhost ~]#
[root@localhost ~]# ln -s /dir1/ /dir2
[root@localhost ~]#

7.6 实战应用

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

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

常识: 只要权限够,磁盘上有空间一定可以创建文件。 这个是错的。
排查:
[root@xxx ~]# df -i
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/sda3 5242880 52428800 100%/

后来用df -i查看了一下/data所在的分区的索引节点(inode),发现已经用满(IUsed=100%),导致系统无
法创建新目录和文件。
查找原因:
/data/cache目录中存在数量非常多的小字节缓存文件,占用的Block不多,但是占用了大量的
inode。
解决方案1:删除/data/cache目录中的部分文件,释放出/data分区的一部分inode。
解决方案2 : 在/data备份好一些文件,然后删除这些文件,释放一些inode,然后创建一个文件
夹/data/cache2。在cache2下挂载一个新分区: sda4 ,下次写数据需要写到新分区cache2目录下。

[root@egon ~]# mkfs.xfs /dev/sdb
meta-data=/dev/sdb isize=512 agcount=4, agsize=1310720 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=5242880, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@egon ~]#
[root@egon ~]# mkdir /data/cache2
[root@egon ~]# mount /dev/sdb /data/cache2/

inode分区完后,不可以增加inode数量,改变inode大小
其他场景
1.大量的小文件问题:可能会使inode耗尽,使得文件文法创建。(磁盘利用率低)--->对于小文件比较
多的场景,将block划分小一点。
2.大文件问题:一个文件占用多个block,使得文件读写速率慢。---->将block划分大一点。
3.ext文件系统——xfs文件系统

 

posted @ 2020-11-27 21:02  投降输一半!  阅读(119)  评论(0编辑  收藏  举报