DIRECTORY
Linux系统中,目录是一种档案,用来纪录其中档案的位置。
就像是仓库一样,仓库是一种档案系统空间,里面的货物就是档案,而目录就是仓储货物的清单。
使用者可以使用 #ls 来查询目录中的内容,更常使用 #ls -al 来查询目录档案的详细资料。
-a表示显示所有档案,包括隐藏档;-l表示列出详细的资料。
目录档案中,每笔资料表示一个档案或目录,连结数就表示这笔资料下有多少档案或目录连结至此。
时间是档案建立时间、上次执行时间、上次修改时间三者中最接近当前时间者。
另外要注意到,为什么很多目录的容量都是4096bytes。
这并不是这个目录里面只有4096bytes的档案,而是这个名为「目录」的档案有4096bytes的大小。
是4096bytes的原因在于你硬碟的block的大小,通常都是1k、2k、或4k为一个block。
图片中的硬碟就是以4096bytes为一个block,所以新增目录时,目录档案大小就是4096bytes。
当然也有些目录因为系统设定的关系不会是block的倍数,不过基本上一定都是1024bytes的倍数。
另外,有些目录档案的容量为0bytes,这些目录属于虚拟档案系统(Virtual File System, VFS)。
简单来说,这些目录内的资料并不存在于实体硬碟中,而是存在于记忆体。
这些资料藉由VFS挂载到Linux中,以便系统于进行存取的动作。
包括了kernel、process、net以及其他週边装置等。
所以当使用者对档案进行异动,其实就是对目录档案的编辑。
新增档案就是在目录档案上加上一笔资料,哪个地方有哪个档名的档案。
移动档案就是把原本目录档案上这个档案删除,然后新增到新的目录档案上。
有趣的是删除档案,删除档案其实并不是把那个档案空间清除,而是目录档案上这个档案的纪录。
当一个档案没有跟任何目录有所连结,系统就会判定这的空间是空的空间。
将来要储存新的档案的时候,系统可能就会把新资料覆盖过旧资料。
FILE PERMISSIONS
这边同样以下图为例子,权限的部分可以看到是dr-xr-x-rx。
权限主要分为四个部分:档案类型、拥有者权限、群组权限、以及其他使用者权限三部分。
档案类型大致有以下几种:
–:file(一般档案)
d:directory(目录)
l:symbolic link(连结符号)
s:socket
p:pipeline
b:block(可储存资料的设备)
c:character(硬碟以外的硬体接口)
权限是针对拥有者(user)、群组(group)、以及其他使用者(other)进行读、写、执行三种权限设定。
这边要注意到对于档案,权限只有读取、编辑内容、以及执行,那如果要新增跟删除呢?
档案的新增跟删除必须要对该档案所属的目录有写入(w)的权限才可以进行,这点要注意。
权限数字是让使用者可以用数字去代表权限,例子中权限为r-xr-xr-x,每三个字母就代表一组权限。
所以这个档案的权限也可以写成555。
另外还有一种特殊权限,主要是针对每组权限中的执行(x)给予不同的功能。
例如一个档案原本的权限为rwxrwx—(770),如今希望这个档案对于群组的部分给予特殊权限。
所以特殊权限的群组为s,就把原本群组的x替换为s,变成rwxrws—。
而权限数字表示群组的为2,加上原本的权限后,新的权限数字为2770。
FILE PERMISSIONS MANAGE
当需要变更档案或目录的拥有者以及拥有群组时,可以使用 #chown 以及 #chgrp。
#chown [使用者名称] [档案或目录] 可以将档案或目录的拥有者变更。
#chgrp [群组名称] [档案或目录] 可以将档案或目录的拥有群组者变更。
或者使用 #chown .[群组名称] [档案或目录]
#chown 指令中,只要群组名称前面加上「.」,就可以变更拥有群组。
所以同时变更拥有者以及拥有群组,就使用 #chown [使用者名称].[群组名称] [档案或目录]。
而加入参数-R,可以同时改变目录下所有档案以及目录。
当需要变更档案的存取权限时,可以使用 #chmod 。
权限的变更分为三个部分,who、what、which。
例如一个档案原本的权限是rwxr-xrw-(756)。
要群组增加读取权限就输入 #chmod g+w [档案或目录],或者 #chmod 776 [档案或目录]。
要其他使用者无法读取就输入 #chmod o-r [档案或目录],或者 #chmod 752 [档案或目录]。
要注意使用「= (assign)」是重新设定权限,如果一次想设定两个以上的对象,可用「,」分隔。
而-R参数也是为同时变更目录以下所有档案以及目录的权限。
ACCESS CONTROL LIST
Access Control List(ACL)提供了一种更灵活控制档案权限的方式。
例如公司依照部门将所有员工建立群组,群组外的人无法存取群组中的权限。
但是公司的董事长希望可以看到业务群组内的档案,但是董事长属于管理群组,无法进入业务群组。
这时候就可以利用ACL让董事长可以存取业务群组中的档案。
ACL在EXT4档案系统中是预设开启,而之前的档案系统就必须手动设定开启。
使用 #dumpe2fs /dev/[分割区] | grep ‘Default mount’ 查询分割区是否支援ACL功能。
若无ACL功能可使用 #tune2fs -o acl.user_xattr /dev/[分割区] 开启ACL功能。
或编辑/etc/fstab,在该分割区的档案系统参数中加入「,acl」。
对于欲修改权限的档案或目录,可以先用#getfcal 查询目前的权限设定。
例如查询/etc/fstab,输入 #getfacl /etc/fstab。
由上而下依序是档案名称、拥有者、拥有群组、拥有者权限、拥有群组权限、其他使用者权限。
要改变档案的ACL则使用 #setfacl -m [u, g, o]:[使用者或群组名称]:[权限] [档案或目录]。
例如要让使用者peter可以读取,则输入 #setfacl -m u:peter:r /etc/fstab。
也让群组john可以读取写入,则输入 #setfacl -m g:john:rw /etc/fstab。
然后在查询一下就会发现,我们刚刚设定的权限都已经设定完成了。
这时候会发现,多出了一个mask,这是所谓的有效权限范围,就像遮罩一样。
如果设定超出了这个范围就会失效,例如如果peter加上了执行权限。
就会发现peter后面多了一个#effective:r–,表示peter的有效权限只有r–。
管理员可以利用 #setfacl -m m:[权限] [档案或目录] 进行有效权限的设定。
当系统中的使用者以及群组数量众多,或者使用率频繁的时候,可以以继承的方式设定ACL。
#setfacl -m d:[u, g, o]:[使用者或群组名称]:[权限] [档案或目录]。
在设定对象类型之前多加一个d,这就表示此目录以下的档案或目录,会继承此设定。
当管理员想要移除某条设定的时候,就使用-x参数,此参数不可与-m一起使用。
例如上述例子如果想把john群组移除,则输入 #setfacl -x g:john /etc/fstab。
再用 #getfacl /etc/fstab 就会发现john群组设定已经移除了。