Linux下XFS、Ext2文件系统对比、文件管理、inode、文件名、标准I/O
Ext2、Fat、XFS文件系统
文件系统是对一个存储设备上的数据和元数据进行组织的机制,文件系统的创建是在格式化分区的过程中完成的(一个分区就是一个系统),众所周知Windows操作系统使用的文件系统是FAT与NTFS;Linux不同的发行版本使用的文件系统主要有Ext、XFS、Btrfs等。这里重点介绍Ext2文件系统,并列举“拖油瓶”Fat文件系统和“高大上”XFS文件系统的特点。 | |
---|---|
Ext2 |
ext2文件系统是索引式文件系统,分区结构如下: 第一部分是引导扇区,负责加载内核;第二部分是superblock,存储inode/block的总量、使用和剩余量及文件系统的信息;第三部分是inode,存储文件的元数据和数据所在的block号;第四部分是block,存储文件的数据。文件的元数据包括文件大小、拥有者、所属组、时间戳等,但是不包括文件名,可用 由此计算可得block大小为4k时的单个文件的最大容量为4T,但是由于Ext2文件系统本身的限制,单个文件大小不能超过2T: 文件的inode信息可用 这是文件系统的block、inode、目录项的指向情况:可以看到有两个目录项指向同一个inode,链接数会记录在inode中,只有当 |
Fat |
早期的fat文件系统用在window98系统中,它没有inode作为block的索引,因此读文件是是这样的duang!duang!duang!读完一个块才才知晓下一个块的位置,读取时间较长,效率低。 |
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
-frm
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
-minode 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 #合并到f3I/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:先删除第一字符集较第二字符集多出的字符
练习
原创文章,作者:helloc,如若转载,请注明出处:http://www.178linux.com/27044