对于文件系统总结

对于文件系统总结:

文件系统是存储设备上的数据和员数据的一个机制,文件系统是在一个磁盘(包括光盘、软盘、闪盘及其它存储设备)或分区组织文件的方法,如NTFS或FAT;


Linux下的文件系统:

对linux而言所有文件都必须处在根文件系统下,如:/var/log/messages 此类被称为叶子节点,每个叶子节点称之为文件,而非叶子节点为目录;其文件messages就被称之为叶子。


回顾:

格式化命令:mkfs,mk2fs

高级格式化:格式化就是创建一个文件系统,而文件系统则是管理文件实现文件的按名存取

般文件系统要跟磁盘存储空间打交道,所以文件系统通常位于内核当中,文件系统一般是通过系统调用来完成操作的;

如:打开关闭读写创建删除等;通常系统调用都是通过系统函数来调用的


MBR位于硬盘的第一个物理扇区(绝对扇区)柱面0、磁头0、扇区1处。MBR中包含硬盘的主引导程序和硬盘分区表分区表有4个分区记录区。记录区就是记录有关分区信息的一张表。它从主引导记录便宜地址01BEH处连续存放,每个分区记录区战16个字节;

其前446字节为bootloader 后64字节为文件分区表,最后2个字节表示当前可引导的磁盘分区;MBR记录2个重要的东西分别是 开机管理程序 与磁盘分区表

要点:

(1)MBR位于硬盘第一个物理扇区柱面0,磁头0,扇区1处。不属于DOS扇区,

(2)主引导记录分为硬盘的主引导程序和硬盘分区表

MBR之后的其他空间可以被分区,通常一个分区是按柱面来分区,一般说来每个分区的头2个扇区 大概1024字节 被称为引导块(bootblock) 通常用来引导当前分区的操作系统


文件系统格式:

为了完成随机访问(磁盘是一个块设备)磁盘通过刺头的移动,磁盘的旋转等来定位到某个扇区上来读取数据,为了知道数据在哪个扇区上,需要把扇区重新组合起来划分到另一个逻辑结构来,组成磁盘块;每一个文件都有一个索引条目,表明了当前文件存储上哪些编号的块上的。

文件的 大小、权限、属组属主、时间戳、对应的磁盘块等跟文件本身没有任何关系 这类信息都在索引中存储,真正的数据在磁盘块中存储,所以通常所说文件内容改变指的是文件块改变,而文件属性改变则是改变索引信息。而每个索引条目都要存储信息,所处的空间都不小,每个条目都有一个索引节点 (index node)简称为inode通常也称为文件的元数据 用来描述文件属性的跟文件内容没有本质的关系;既然每个文件都有索引,所以为了表示对应的文件能被查找到,所以每个条目都有个编号通常为inode号, 所以找某一个文件的时候先找文件对应的inode号

问:假如1个块为1kb,那么一个3GB的文件需要多少个块:

答:3*2^20 = 所需块



块指针:

块指针一般分为三类,分别是:

1.直接指针:对小文件是非常适用

2.二级指针:指定区域(间接)

3.三级指针:指针一个区域或一个段

而文件系统中单个文件大小就由指针来限制的,目录其实是文件路径映射,将文件组织成层次化结构:

(1)目录也需要有个条目

(2)目录本身也在磁盘上占用数个磁盘块来存放目录数据,而目录数据放的是直接找到的每一个文件、文件名和对应的inode号,比如:

[root@idc-d-1775~]# ls /var/

account log cvs empty games htdocs local nis preserve run tmp www

/var/下的log

[root@idc-d-1775~]# ls /var/log/

acpid boot.log.1 conman.old cups lastlog maillog.4 messages.4 rpmpkgs

由此可见首先由系统找到/ 再由/ 找到 /var/ 再由/var/ 找到/var/log/;

对目录而言,它只存放紧跟在这个目录下的文件(子目录不算),log下的文件跟它的上级目录var没有任何关系,而跟目录log有关系。

为了加速计算机的运行速度,一般开机过程中,几乎绝大数文件全部会缓存到内存当中去(buffer和cache的意义)


文件创建的过程:

(1 inode table

(2 block bitmap

(3 inode bitmap

以上三个结构记载了其所属block group的许多信息他们依次被存放在这个blockgroup的开头部分由该block group所对应的group descriptor中的指针所指向。Bitmap称之为—位图

文件的创建是通过位图来进行扫描空闲块和空闲inode

而将其划分为块组(blockgroup)后 每个组都单独管理。


块组的工作流程:

135432815.png

如图所示,首先第一个为引导快,其他块被划分成快组,每个组内的块个数相等,每个组内部是自我管理的,块组0比较独特,块组0后的第1024个字节后的第1024个字节被称之为超级块(super block :主要保存当前磁盘分区的一共有多少组每个快组从哪个块开始到哪个块结束 )一旦块组0挂了 则从其他块组中拿来替换)块组0是首先使用的超级块。

GDT:块组描述表 :主要存放 块位图(哪些块是空闲及引用,哪些inode是空闲及引用)


查看块信息:

这里使用命令tune2fs,调整和查看ext2/ext3文件系统的文件系统参数,其用法如下:

#查看指定文件系统的相关信息

[root@test~]# tune2fs -l /dev/sda3


#将所有的块信息显示出来则使用dumpe2fs,如下所示:

[root@test~]# dumpe2fs /dev/sda3

[root@test~]# dumpe2fs /dev/sda1|grep 'Inode size'

Inodesize 数据块的大小

总量

Inodecount: 128520

Blockcount: 514048

Blocksize: 1024


对于文件的管理:

1.删除文件步骤

(1)将inode数据清除

(2)将inode归类为未使用(空闲inode)

删除操作默认情况下不会对磁盘块做任何操作,只将inode归为空闲块 所以使用数据恢复工具可以将删除的文件恢复回来


2.文件的复制剪切:

(1)复制:复制相当于新创建一个文件

(2)剪切:首先将目标目录建一个条目(文件名)任然指向同一个inode,当建立完成后再源目标的文件的条目将其删除,而文件的数据库和inode不做修改如果不在同一分区上,列表不同的情况下,那么先在新分区上创建将文件全部复制过去再将老文件删除;


3.链接文件:

(1)硬链接:两个不同的路径,两个文件名不一样,但是可以指向同一个inode,则对应的磁盘块可以被2个路径下的文件都能访问的到,对硬链接而言,删除一个路径,只要不是指向inode最后一个路径,则inode不会变的只是将其路径删除而已;


可以看到 通过ls -l 可以看到文件被硬链接的次数:

#ls -l

-rw-r--r--1 root root 0 2013-05-05 23:15 110.php

-rw-r--r--1 root root 10874 2013-10-29 01:40 2013-10-29.txt

-rwxrwxr-x1 daemondaemon 32245 2013-08-30 13:3857527898-10.html

创建硬链接

[root@testtmp]# touch 1111

[root@testtmp]# ln 1111 1112

[root@testtmp]# ll

总用量 60

-rw-r--r--.2 root root 0 11 7 03:09 1111

-rw-r--r--.2 root root 0 11 7 03:09 1112

可以看到硬链接都为2那么再进一步测试

#将文件1112追加内容

[root@testtmp]# echo 111 > 1112

[root@testtmp]# cat 1112

111

[root@testtmp]# cat 1111

111

#1112删除再观察效果

[root@testtmp]# rm 1112

rm是否删除普通文件 "1112"?y

[root@testtmp]# cat 1111

111

#查看inode

[root@testtmp]# ll

总用量 64

-rw-r--r--.1 root root 4 11 7 03:11 1111


由此可以总结出硬链接特性

(1)不能夸分区

(2)不能指向目录,因会导致循环引用,但尽管如此可以发现每个目录的硬链接都为2

drwxr-xr-x2 daemon daemon 72 2013-09-22 10:08delete

因为每个子目录下都有个隐藏目录“.”指向当前目录 因此inode都为2

(3)删除原文件路径,不影响链接文件使用


4.软连接(符号链接):

ls -l 显示文件类型为1的文件

shell中测试文件是否为符号的链接文件

软连接一般只有一个本身的inode号,不占据然和磁盘块,块指针仅存储原文件的访问路径。


由此可以总结出软链接特性

(1)跨分区

(2)能够对目录创建软链接

(3)删除原文件,软链接文件则无法使用


ext文件系统之扩展属性

1.查看和修改文件属性

(1)可以使用lsattr来查看文件的属性,如下所示

[root@test~]# lsattr

-------------e-./anaconda-ks.cfg

-------------e-./install.log


(2)修改文件属性

chattr用于修改文件属性具体用法附上传送门

http://www.2cto.com/os/201110/106846.html

(3)使用dd备份文件

dd命令 是 Linux/UNIX 下的一个非常有用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝
的同时进行指定的转换。

dd命令常用参数:

ddif=/ 指定源文件

of=/ 指定目标文件

bs-512 指块大小为512个字节

count=2 指仅拷贝一个块

1将硬盘的最开始处的512的字节复制保存为sda.backup来实现MBR的备份

[root@test~]# dd if=/dev/sda of=/root/sda.backup bs=512 count=1

记录了1+0 的读入

记录了1+0 的写出

512字节(512 B)已复制,0.000165926 秒,3.1 MB/秒

[root@test ~]# echo $?

0

[root@test ~]# ll /root/sda.backup

-rw-r--r--. 1 root root 512 11月 703:18 /root/sda.backup


例2:恢复备份需要放到另一块磁盘(此命令非常危险,慎用)

[root@test~]# dd if=/root/sda.backup of=/dev/sda bs=512 count=1

记录了1+0 的读入

记录了1+0 的写出

512字节(512 B)已复制,0.029735 秒,17.2 kB/秒



文件特殊权限:

1.安全上下文:

安全上下文指的是一类定义某个进程允许做什么的许可和权限的集合。

首先来看一下某文件属性:

[root@test~]# ll `which cat`

-rwxr-xr-x.1 root root 45224 6 22 2012 /bin/cat

假如用户执行这个脚本cat 去执行查看/etc/fastab的时候,一定是以一个进程的方式进行访问将应用在other用户;

首先一个进程在启动的时候进程本身一定是某个用户的身份在运行,它代表用户所具有所有访问权限,其次这个用户或进程所访问的任何一个文件有没有权限访问取决于它代表谁来运行。

:首先来看一下shadow文件权限:

[root@test~]# ll /etc/shadow

----------.1 root root 819 11 2 22:40 /etc/shadow

切换至普通用户test

[root@test~]# su - test

[test@test~]$ whoami

test

使用cat命令来查看shadow文件

[test@test~]$ cat /etc/shadow

cat: /etc/shadow: Permission denied

#由此可见,此文件权限既不是属组也不是属主,因此同样在other组,用户test不能访问此文件

通过上例可以总结出:权限是目录之上的.


2.下面介绍特殊权限 s

s:suid 当一个文件的属主执行的权限为s时,意味着任何其他用户在执行此程序时,其进程的属主不再是发起者本人,而是这个程序文件的属主;

(1)当执行cat命令时,在显示/etc/shadow时,如果用test用户执行的时候,他肯定执行这个程序是用test身份来执行的,如果test用户没有访问权限则打不开这个文件;

(2)但是如有了s权限,在执行这个程序的时候不再以test用户来执行,而是以cat文件自己属主的身份在运行,进而文件的属主能够访问此文件,那么则可以访问这个文件;


例:先将cp脚本拷贝到一公共目录,以防万一

[root@test~]# cp /bin/cat /tmp/

[root@test~]# ll /tmp/

总用量 48

-rwxr-xr-x.1 root root 45224 11 6 23:10 cat

#切换至test用户

[root@test ~]# su - test

[test@test~]$ cd /tmp/

[test@testtmp]$ ll

总用量 48

-rwxr-xr-x.1 root root 45224 11 6 23:10 cat

#查看权限

[root@testtmp]# ll

总用量 52

-rwxr-xr-x.1 root root 45224 11 6 23:10 cat

-rwx------.1 root root 805 11 6 23:11 fstab

#然后执行/tmp/cat来查看fstab

[test@testtmp]$ ./cat fstab

./cat:fstab: Permission denied

#su到root用户,修改fstab具有s权限表示让属主具有s权限

[root@testtmp]# chmod u+s cat

#还可以使用chmod 4644 cat ,与上面的意义一样

#查看文件权限

[root@test tmp]# ll

总用量 52

-rwsr-xr-x.1 root root 45224 11月 6 23:18 cat

-rw-r-----.1 root root 805 11月 6 23:20 fstab

#再su到test用户使用cat来查看fstab:

[test@test/]# su - test

[test@testtmp]$ ./cat fstab | head -3


#

#/etc/fstab

可以看到,已经可以看到文件的内容。


s:权限是放在执行权限位上的,表示属主原有的执行权限;

S:与s相反,表示属主无执行权限;


sgid: 属组有s权限,意味着执行此程序时,其进程属组不再是运行者本人所属的基本组,而是此文件的属组;

使用方法与上面相同,只不过将上面的参数u 改为了g,如下所示:

[root@testtmp]# chmod g+|-s /dir/file


t:粘贴位 附加在other权限上,表现为t

t: 原有执行权限

T: 原无执行权限

chmod o+|-t /dir/file

表示非本身文件权限只能删除自己的文件

[root@testtmp]# chmod o+t /tmp/test

[root@testtmp]# ll -d /tmp/test

drwxrwxr-t. 2root test2 4096 11月 7 01:54 /tmp/test


ACL 文件访问控制列表

如果某一用户希望其他用户有对其写的权限,只能修改other的权限有些权限;ACL用于实现在原有的访问控制机制之外补充了一种文件访问控制机制,在一个文件上特别指定其他的用户或组的访问权限。


1.查看文件的ACL访问控制列表:

[root@test tmp]# su - test

[test@test~]$ cd /tmp/

[test@testtmp]$ ls

cat fstab test

[test@testtmp]$ touch test.txt

[test@testtmp]$ ll

总用量 56

-rwsr-xr-x.1 root root 45224 11月 6 23:18 cat

-rw-r-----.1 root root 805 11月 6 23:20 fstab

drwxrwxr-t.2 root test2 4096 11月 7 01:54 test

-rw-rw-r--.1 test test 0 11月 7 02:18 test.txt

可以使用getfacl命令来获取查看文件的acl访问列表信息如下所示

#查看文件或目录的访问控制列表(这里显示默认的属组属主的访问控制列表,因为test.txt是刚创建没有对其做任何的权限操作):

[test@testtmp]$ getfacl test.txt

#file: test.txt

#owner: test

#group: test

user::rw-

group::rw-

other::r--


2.为username指定用户设定对文件具有mode(rw x)访问权限

[test@testtmp]$ setfacl -m u:test2:rw- test.txt

[test@testtmp]$ getfacl test.txt

#file: test.txt #文件名

#owner: test #文件属主

#group: test #文件属组

user::rw- #属主权限

user:test2:rw- #用户test2拥有对此文件的读写权限

group::rw- #属组权限

mask::rw- # acl_mask

other::r-- #其他用户权限


3.设定对用户组acl访问控制权限

#设置用户组test3对test.txt有读写执行的权限:

[root@testtmp]# setfacl -m g:test3:rwx test.txt

[root@testtmp]# getfacl test.txt

#file: test.txt

#owner: test

#group: test

user::rw-

user:test2:rw-

group::rw-

group:test3:rwx

mask::rwx

other::r--

去除访问控制权限

语法:setfacl -x u|g:name /dir/xxx

[root@testtmp]# setfacl -x u:test2 test.txt

[root@testtmp]# getfacl test.txt

#file: test.txt

#owner: test

#group: test

user::rw-

group::rw-

group:test3:rwx

mask::rwx

other::r--


4.拒绝某用户对此文件的任何访问

setfacl-m u:username --- /var/tmp/xx

复制文件/var/log/messages/data/目录

其属主为root用户属组为root要求此文件可以被任何人读取可以被gentoo用户和mageedu组读写centos用户没有任何访问权限

#chmod664 /data/messages

#setfacl-m u:gentoo:rw

#setfacl-m u:mageedu:rw

#setfacl-m u:centos:---


5.由此可总结用户通过ACL访问文件流程:

1.过户是否为文件属主

2.用户是否有特定的访问控制条目

3.用户是否属于文件属组

4.用户所属组是否有特定的访问条目(ACL)

5.其他



6.扩展:额外挂载文件系统默认挂载选项不支持acl,如果要支持的话,方法:

1.使用mount -o 仅临时有效,如果想要永久有效 则编辑/etc/fstab 在挂载选项后附加acl选项

2.设定分区的默认挂载选项中有ACL ,则挂载时无需再指定ACL

如下所示

tune2fs-o acl /dev/sda3

取消只要在前面加尖角号即可:

tune2fs -o ^acl /dev/sda3



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值