Ext2、Fat、XFS文件系统

Ext2:文件系统是对一个存储设备上的数据和元数据进行组织的机制,文件系统的创建是在格式化分区的过程中完成的(一个分区就是一个系统),众所周知Windows操作系统使用的文件系统是FAT与NTFS;Linux不同的发行版本使用的文件系统主要有Ext、XFS、Btrfs等。这里重点介绍Ext2文件系统,并列举“拖油瓶”Fat文件系统和“高大上”XFS文件系统的特点。

ext2文件系统是索引式文件系统,分区结构如下:

wKiom1gZuBeyfXPBAABPm-udsC0036.jpg-wh_50

第一部分是引导扇区,负责加载内核;第二部分是superblock,存储inode/block的总量、使用和剩余量及文件系统的信息;第三部分是inode,存储文件的元数据和数据所在的block号;第四部分是block,存储文件的数据。文件的元数据包括文件大小、拥有者、所属组、时间戳等,但是不包括文件名,可用ls -l命令查看文件的元数据。当Linux找到一个文件时,先从目录项中找到文件名和inode,只要找到对应的inode,沿着指针并行把所有数据块收集起来,就可以读取一个完整的文件了,下面是inode的结构图:

wKioL1gZuF-wmU6SAAJvy-Uh5es583.jpg-wh_50

由此计算可得block大小为4k时的单个文件的最大容量为4T,但是由于Ext2文件系统本身的限制,单个文件大小不能超过2T:

wKioL1gZuJaTp6axAADJLtJI3Dk964.jpg-wh_50

文件的inode信息可用stat命令查看,如图

wKiom1gZuLvyj2kTAAEx5wzCIsc717.jpg-wh_50


这是文件系统的block、inode、目录项的指向情况:可以看到有两个目录项指向同一个inode,链接数会记录在inode中,只有当链接数为0时该文件才会被删除,也就是只有删除所有指向这个inode的文件名时才能删除文件,硬链接的原理就是多个文件名指向同一个inode,因此多个文件名共用一个inode号,达到共享与备份的目的。符号连接(软链接)则是一个有inode号的文件,其原理则是在文件的内容(数据)存放了该符号链接指向的具体文件名,相当于windows的快捷方式。很明显硬链接不能链接目录,也不能跨设备(分区),原因是每个分区都有独立的inode编号。符号链接则可以跨分区,也可以链接目录。


FAT:早期的fat文件系统用在window98系统中,它没有inode作为block的索引,因此读文件是是这样的duang!duang!duang!读完一个块才才知晓下一个块的位置,读取时间较长,效率低。

wKioL1gZuQzBJ9FuAAEZnuJfX4k723.jpg-wh_50

XFS:在CentOS 7上xfs作为缺省文件系统,目前最常见的文件系统Ext4已经非常优秀,但是随着存储需求越来越大,Ext4渐渐适应不了了,比如现在虽然Ext4 目录索引采用了Hash Index Tree, 但是依然限制高度为2.做过实际测试Ext4的单个目录文件超过200W个,性能下降的就比较厉害了。由于历史磁盘结构原因Ext4 的inode个数限制(32位数)最多只能有大概40多亿文件。而且Ext4的单个文件大小最大只能支持到16T(4K block size),而XFS使用64位管理空间,文件系统规模可以达到EB级别,可以说未来几年XFS彻底取代Ext4是早晚的事情。另外,我看了一下XFS目前redhat至少投入了5个Kernel developer在上面,因为XFS 是基于B+ Ttree管理元数据,即将支持reflink,dedupe等高级特性(Oracle 开发者已经开发了patch)。综上所述,XFS 取代Ext4 已经成为必然。



文件管理


root用户下mv、rm、cp都定义了别名,加了-i提示的选项

touch 刷新时间(-),创建空文件 touch f? ?表示一个字符 

touch -m -t 201710100220 file

touch -c #如果文件存在,则不予创建

touch -m #仅改变mtime

touch -a #仅改变atime

cp – copy files and directories

cp -i #提示覆盖或删除的信息,root下alias cp=’cp -i’避免权限过大乱cp

cp #直接复制会丢失属性

cp –preserve=ownership,timeship,mode或all #保留想要的属性,号隔开

cp -f #删除并从新复制,用户在自己的家目录可以-f覆盖其他用户的文件

cp -r #复制整个目录(文件和目录),可指定复制的目录,如果目录存在直接复制文件夹到存在的目录,目录不存在则复制目录到的内容到新的文件夹

cp -a #归档,保留原来的属性,链接还是链接

cp -d #不复制原文件,只复制链接名

cp -p #复制所有属性,链接变源文件

alias 别名命令 存放在~.bashrc和/etc/bashrc中

alias name=’command -option argument’

unalias name

\command or ‘command’ or /path/command #执行原命令

mv 移动和重命名文件 

mv -i

mv -f

rm 

rm -i

rm -f

rm -r

rm –no-preserve-root #cent6增加的选项

rm -rf = \rm

rmdir 删除空目录

rmdir -p递归删除空目录

tree 

rpm -i /misc/cd/Packages/tree

tree -d

tree -L

tree -P

tree -p

mkdir

tree -p

tree -v

tree -m

inode index node 

在Linux中文件的链接方式有两种,一种是类似Windows的快捷方式,可以链接文件或目录,我们称之为软链接或符号链接;另一种是直接链接到文件的inode并产生新的文件名,这种称之为硬链接(hard link)。文件由元数据和数据组成,其中元数据指的是文件的属性(大小、拥有者、权限、时间戳等信息,不包括文件名),数据就是文件的内容。元数据存放在inode中,数据存放在inode指向的一个或多个数据块(block)中。

软链接

(1)软链接有自己的inode号

(2)软连接可以跨设备(分区)

(3)软连接可以链接目录与文件(软连接)

(4)软连接不会增加链接数

(5)文件大小为链接地址的字符个数

(6)软连接权限无关要紧

硬链接 (1)硬链接的inode相同

(2)硬链接不能跨设备(分区)

(3)硬链接不能应用于目录

(4)每增加一个硬链接,该文件的链接数加一

文件引用根据inode号,一般inode会占用文件系统磁盘空间的1%

 删除文件:分配inode,增加该目录的目录项,分配数据块

 增加文件:释放inode,减少该目录的目录项,数据块回收

 移动文件:创建新的目录项,删除旧目录的目录项,inode不变。但是不同分区间相当于先复制整个文件再删除原文件

file 查看文件类型,确定文件内容file -c #详细显示指令执行的过程,便于排错或分析程序执行

file -f #查看文件名的文件类型

file -F“—” #指定文件名后的分隔符

file -L file /zero告诉你这是一个软连接,file -L /zero告诉你文件类型

file -i #输出mime类型的字符串

file -b #列出文件的类型,但是不显示文件名

不同分区的节点号可以不同,同一个分区用节点号唯一标识一个文件

df -i #显示每个分区的inode大小和利用率

ln f1 f2 #f2硬链接到f1的inode相同(ls -li),链接数加1

ln f1 /boot/f2 #硬链接不能跨设备(分区),且硬链接的文件不能是目录,软连接能跨设备(分区)

目录的链接数量至少是2,本身和 . 都指向该目录,创建一个子目录会增加一个链接数

centos6 /目录下 -ai显示inode为2的表示一个分区的根

centos7 /目录下 -ai显示inode为128表示一个分区的根

ln -s f1 /testdir/f2 #软连接、符号链接,可以是文件或目录,f1软链接到f2(链接

不同目录时f1用绝对路径或f1的相对路径,否则看到f2闪烁,centos中多用相对路径),使用了不同的inode



标准I/O设备

程序=指令+数据 

读入数据:input

输出数据:output

文件描述符fd,存放在/proc/任一进程号/fd/中,用ll可看到标准I/O设备

Linux提供3种I/O设备,标准输入、输出、错误 

标准输入(stdin)0,默认接收来自键盘的输入。

标准输出(stdout)1,默认输出到终端窗口。

标准错误(stderr)2,默认输出到终端窗口。

I/O重定向 —— 输出:即改变默认位置 

ls > /dev/pts/2 #标准输出重定向到设备或文件中

`在执行命令的时候,可把输出信息重定向到到/dev/null中,干干净净

> f1 #stdout重定向,可创建一个空文件

2> #stderr重定向

&> #stdout与stderr重定向

&>> 2>> >> #追加,不覆盖

> f1 2>&1 #stdout输出到f1,把stderr变成stdout再输出到f1

set -C #禁止覆盖当前终端会话有效

set +C #允许覆盖

cat f1 f2 > f3 #合并到f3

I/O重定向 —— 输入:用文件代替键盘的输入 

cat < f1 #把f1输入到cat中

cat > f1 <<eof  #多行重定向,在标准输时使用标准输入,表示输入eof就结束,此时才写入文件,Ctrl d退出。还有一个好处是可以一行一行的输入,不必放在一行

mail中默认是 . 表示结束,如 mail -s subject user <<eof 则表示以eof结

管道(pipe) 

默认只管传递正确地命令,即标准输出,可使用 2>&1 或 |&实现标准错误的重定向

sjdgosgo 2>&1 |grep(旧写法) = sdshdgo |& grep(新写法) #把标准错误重定向到标准输出,再通过管道传递

|tee #可实现在终端显示并写入文件,默认是覆盖文件 |tee -a 追加文件

|less #一页一页地查看

tr – 转换和删除字符 

tr[OPTION]… SET1 [SET2]

tr ‘a-z’ ‘A-Z’ 或 tr ‘[:lower:]’ ‘[:upper:]’ #逐个字符替换,若后者小于前者,则其余字符用最后一个字符替换

-c或–complerment:取字符集的补集,取字符集以外的所有字符

-d或–delete:删除所有属于第一字符集的字符;

-s或–squeeze-repeats:压缩连续重复的字符用单独一个字符表示,如删除空行

-t或–truncate-set1:先删除第一字符集较第二字符集多出的字符