本文介绍 linux 内核服务的相关知识,供大家学习参考。
Linux内核
内核是linux操作系统的核心部分,
内核的职责:
1 系统初始化 检测硬件资源并引导系统
2 进程的调度 决定进程的启动和允许时间
3 内存的管理 为允许的进程分配内存
4 安全 经常校验文件系统的权限,selinux环境和防火墙规则
还可以提高缓冲和缓存以提高硬件的访问速度
采用标准网络协议和文件系统格式
linux内核在系统中的位置
[root@localhost ~]#
[root@localhost ~]# cd /boot/
[root@localhost boot]#
[root@localhost boot]# ll -h | grep vm
-rw-r--r-- 1 root root 1.8M Aug 19 2009 vmlinuz-2.6.18-164.el5
[root@localhost boot]#
这个文件就是linux系统的内核文件,这个文件的大小为1.8M。我们可以看到,linux内核很小,主要是为了系统运行的更快,保证安全。内核越庞大,其漏洞也就会越多,内核怎么小,怎么能够提供那么强大的功能呢,因为linux很多功能都是由模块来提供的,linux也叫模块化的操作系统。
内核的映像和版本
支持的平台: x86(32位) x86_64(64位) IA64/Itanium PowerPC64 s390x
32位最多支持4G的内存。
可用于X86的三种内核版本
常规的 : 一个或多个处理器,最多可以支持4G内存。
PAE : 多处理器,可以支持64G的内存。
Xen : 虚拟化所需。
关于linux内核的版本
RHEL5.1 2.6.18-53.el5
RHEL5.4 2.6.18-164.el5
2.6 主版本
18 次版本
53 修正版
El5 红帽封装的
2.4 2.6 2.8 这些偶数位的内核版本代表正式版,
2.3 2.5 2.7 这些奇数位的内核版本代表测试版。
内核模块
模块是小型的,可根据需要装载或者卸载的内核扩展。
那么内核模块在系统中哪里呢
[root@localhost ~]#
[root@localhost ~]# cd /lib/modules/
[root@localhost modules]# ls
2.6.18-164.el5 2.6.18-164.el5PAE
[root@localhost modules]#
可以看到,这里有两个文件夹,现在看下来我们使用的是那个内核。
[root@localhost modules]#
[root@localhost modules]# uname -r
2.6.18-164.el5
[root@localhost modules]#
我们使用的是常规内核,进入2.6.18-164.el5这个目录
[root@localhost modules]#
[root@localhost modules]# cd 2.6.18-164.el5
[root@localhost 2.6.18-164.el5]# ls
build modules.alias modules.inputmap modules.seriomap updates
extra modules.ccwmap modules.isapnpmap modules.symbols weak-updates
kernel modules.dep modules.ofmap modules.usbmap
misc modules.ieee1394map modules.pcimap source
[root@localhost 2.6.18-164.el5]# cd kernel/
[root@localhost kernel]# ls
arch crypto drivers fs lib net sound
[root@localhost kernel]# cd fs/
[root@localhost fs]# ls
autofs4 cramfs ext3 fscache hfsplus lockd nfsd vfat
cachefiles dlm ext4 fuse jbd msdos nls
cifs ecryptfs fat gfs2 jbd2 nfs squashfs
configfs exportfs freevxfs hfs jffs2 nfs_common udf
[root@localhost fs]#
在这里可以看到,我们的系统支持所有的文件系统都在这里拉。
[root@localhost fs]#
[root@localhost fs]# cd ext3/
[root@localhost ext3]# ls
ext3.ko
[root@localhost ext3]#
每个目录里面都有一个模块,并且都是以.ko结尾的。
在linux系统中,以.ko结尾的都是模块。
内核模块的管理工具
查询系统中有多少模块被加载了
#lsmod
[root@localhost ~]#
[root@localhost ~]# lsmod | grep ext3
ext3 125001 4
jbd 57065 1 ext3
[root@localhost ~]#
手动加载和卸载模块
#modprobe vfat
#modprobe -r vfat
[root@localhost ~]#
[root@localhost ~]# modprobe vfat
[root@localhost ~]#
[root@localhost ~]# lsmod | grep vfat
vfat 15937 0
fat 51165 1 vfat
[root@localhost ~]#
[root@localhost ~]# modprobe -r vfat
[root@localhost ~]#
[root@localhost ~]# lsmod | grep vfat
[root@localhost ~]#
查询模块的详细信息
#modinfo ext3
[root@localhost ~]#
[root@localhost ~]# modinfo ext3
filename: /lib/modules/2.6.18-164.el5/kernel/fs/ext3/ext3.ko
license: GPL
description: Second Extended Filesystem with journaling extensions
author: Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others
srcversion: 51D84081C475FE078B1D891
depends: jbd
vermagic: 2.6.18-164.el5 SMP mod_unload 686 REGPARM 4KSTACKS gcc-4.1
module_sig: 883f3504a8b7a0d18758d6145e112f4300a08dae31fac7f50d1e7b6d5b862d010384fbc1ea609f47bb1fe9f093d11a96a74986f486c45bf3ea246
[root@localhost ~]#
关于/etc/modprobe.conf文件
这个文件是模块的配置文件,在这个模块配置文件里面可以定义模块的别名,在加载模块的时候,系统会自动读取模块的配置文件。
管理initrd映像
这个文件通常叫做RAM DISK文件,
我们知道在系统启动的过程中,计算机会先加载根文件系统,根文件系统又是一个ext3的文件系统,所以计算机必须先加载ext的模块,但是ext3的模块又是在根文件系统下面。这样就会有个矛盾。所以我们RAM DISK文件中就有系统在启动的时候需要加载的模块文件。
[root@localhost ~]#
[root@localhost ~]# cd /tmp/
[root@localhost tmp]# ls
[root@localhost tmp]# cp /boot/initrd-2.6.18-164.el5.img .
[root@localhost tmp]# ls
initrd-2.6.18-164.el5.img
[root@localhost tmp]# zcat initrd-2.6.18-164.el5.img |cpio -imd
11798 blocks
[root@localhost tmp]# ls
bin dev etc init initrd-2.6.18-164.el5.img lib proc sbin sys sysroot
[root@localhost tmp]# cd lib/
[root@localhost lib]# ls
ata_piix.ko dm-region_hash.ko mptbase.ko scsi_transport_spi.ko
dm-log.ko ehci-hcd.ko mptscsih.ko sd_mod.ko
dm-mem-cache.ko ext3.ko mptspi.ko uhci-hcd.ko
dm-message.ko firmware ohci-hcd.ko vmxnet3.ko
dm-mod.ko jbd.ko pvscsi.ko vmxnet.ko
dm-raid45.ko libata.ko scsi_mod.ko
[root@localhost lib]#
这个里面就有我们系统在启动的时候需要加载的模块。
如何重新生成这个RAM DISK文件呢
[root@localhost ~]# cd /boot/
[root@localhost boot]#
[root@localhost boot]# ls | grep initrd-2.6.18-164.el5
initrd-2.6.18-164.el5.img
initrd-2.6.18-164.el5kdump.img
initrd-2.6.18-164.el5PAE.img
[root@localhost boot]# rm -rf initrd-2.6.18-164.el5.img
[root@localhost boot]# ls | grep initrd-2.6.18-164.el5.img
[root@localhost boot]#
我们已经删除了RAM DISK文件,那么我们系统在下次启动的时候是肯定不能够正常启动的。
现在我们重新生成一下这个文件,
[root@localhost ~]#
[root@localhost ~]# mkinitrd /boot/initrd-$(uname -r).img $(uname -r)
[root@localhost ~]# cd /boot/
[root@localhost boot]# ls | grep initrd-2.6.18-164.el5.img
initrd-2.6.18-164.el5.img
[root@localhost boot]#
这个RAM DISK文件又重新回来了。
我们也可以在生成这个文件的时候指定要加载的模块,
[root@localhost ~]#
[root@localhost ~]# mkinitrd --with=raid5 /boot/initrd-$(uname -r).img $(uname -r)
[root@localhost ~]#
使用- - with参数来添加指定的模块。
使用/proc进行内核的配置
/proc用来进行对内核的设置,反应当时计算机的状态。文件没有保存在硬盘上面。用来显示进程信息,内存资源,硬件设备,内核内存,等等。下次启动这些文件就都没有了。
/proc的示例
只读文件
/proc/cpuinfo
/proc/1/*
/proc/partitions
/proc/meminfo
这些信息修改并没有意义。
[root@localhost ~]#
[root@localhost ~]# more /proc/partitions
major minor #blocks name
8 0 15728640 sda
8 1 104391 sda1
8 2 4192965 sda2
8 3 4192965 sda3
8 4 1 sda4
8 5 1052226 sda5
8 6 522081 sda6
[root@localhost ~]#
这是用来显示系统中的分区,修改它并没有意义。
但是有些信息也是可以被修改的。
/proc/sys/kernel/hostname
/proc/sys/net/ipv4/ip_forward
/proc/sys/vm/drop_caches
/proc/sys/vm/swappiness
这些信息是可以修改的。
Sysctl工具
可以使/proc/sys设置具有永久性。
在/etc/sysctl.conf这个文件中去修改,在这个里面修改的会永久生效,因为在这个配置文件在/etc/rc.d/rc.sysinit这脚本里面被激活了。
列出当前设置
#sysctl -a
从sysctl.conf中重新加载
#sysctl -p
通过/dev/访问驱动程序
/dev目录下面的文件可用来访问驱动程序。
[root@localhost ~]#
[root@localhost ~]# cd /dev/
[root@localhost dev]#
[root@localhost dev]# ls -l sda1
brw-r----- 1 root disk 8, 1 Mar 3 13:08 sda1
[root@localhost dev]#
前面的b代表是个块设备文件,后面的8代表设备的主版本号,1代表次版本号。
系统识别一个设备,其实是通过设备的设备类型,主版本号,次版本号来识别的。
我们知道cdrom是用来挂载光驱里面的光盘的。
[root@localhost dev]#
[root@localhost dev]# ll -l cdrom
lrwxrwxrwx 1 root root 3 Mar 3 13:08 cdrom -> hdc
[root@localhost dev]# ll -l hdc
brw-rw---- 1 root disk 22, 0 Mar 3 13:08 hdc
[root@localhost dev]#
可以看到我们cdrom的主版本号是22,次版本号是0。
默认情况下,系统中的第一块硬盘的第一个分区/dev/sda1,应该就是b,8,1。
硬盘识别成b,第一块硬盘从8开始,1代表第一个分区。依次类推。
如果是第二块硬盘从17开始,因为一块scsi硬盘最多可以分15个分区。
应该就识别成了b,8,17。
创建块设备文件
#mknod abc b 8 1
[root@localhost ~]#
[root@localhost ~]# mknod abc b 8 1
[root@localhost ~]# ll abc
brw-r--r-- 1 root root 8, 1 Mar 3 17:23 abc
[root@localhost ~]#
设备节点示例
块设备
/dev/hda /dev/hdc IDE硬盘,光驱
/dev/sda /dev/sdb SCSI,SATA或者是USB的存储设备
/dev/md0 /dev/md1 软件RAID
字符设备
/dev/tty(0-6) 虚拟控制台
/dev/null /dev/zero 软件设备
/dev/random /dev/urandom随即数字
Udev机制
Udev可管理保存在/dev/目录下的文件,
文件只有在接入相应的设备后才会生成。
文件在设备拔出后自动删除。
可以在/etc/udev/rules.d/下面去定义策略。
在这个目录下面去创建一个文件,以.rules结尾。
在这个文件中定义U盘的唯一性。
[root@localhost rules.d]#
[root@localhost rules.d]# cat 99-myusb.rules
BUS="usb",SYSFS{serial}=="21185601958E7211",NAME="myusb"
[root@localhost rules.d]#
这个就是我定义的,当一个USB的设备,并且对应这个序列号,系统就识别这个USB设备的名字叫做myusb。
可以使用下面这条命令来查看U盘的信息
# udevinfo -a -p /block/sdb
我们可以使用hal-device-manager这个图像化界面来查看计算机的状态。
至此,linux内核服务的相关内容就介绍完了,希望对大家有所帮助。
本文介绍linux下关于磁盘配额的相关内容,供大家学习参考。
磁盘配额介绍
目前的磁盘配额只可以针对单一的文件系统来进行操作,也就是每一个分区来做磁盘配额。在linux下面可以针对ext2和ext3的文件系统来做磁盘配额,磁盘配额可以对用户和组来做,可以针对文件的大小和数量做磁盘配置,还可以对用户进行软限制和硬限制。
配置磁盘配额
第一步,在分区挂载选项上添加参数。
在磁盘配额的开始,我们要对需要做磁盘配额的分区在挂载选项上面添加两个参数,usrquota和grpquota这个两个参数,
Usrquota 代表可以对用户做磁盘配额
Grpquota 代表可以对组来做磁盘配额
下面开始编辑/etc/fstab这个文件添加参数。
/dev/sda8 /mnt ext3 defaults,usrquota,grpquota 0 0
已经在/etc/fstab这个文件里面添加了参数,但是并不可以立即生效,敲入一条命令让其立即生效。
[root@localhost ~]#
[root@localhost ~]# mount -o remount /dev/sda8
[root@localhost ~]#
[root@localhost ~]# mount |grep /dev/sda8
/dev/sda8 on /mnt type ext3 (rw,usrquota,grpquota)
[root@localhost ~]#
通过mount命令我们也可以看到,usrquota和grpqouta这两个磁盘配额参数也已经添加成功了。
第二步,生成磁盘配额数据库。
[root@localhost ~]#
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 3.9G 2.6G 1.2G 70% /
/dev/sda6 494M 11M 458M 3% /home
/dev/sda2 9.5G 2.9G 6.2G 32% /var
/dev/sda1 99M 14M 81M 15% /boot
tmpfs 188M 0 188M 0% /dev/shm
/dev/hdc 2.8G 2.8G 0 100% /media/RHEL_5.4 i386 DVD
/dev/sda8 471M 11M 437M 3% /mnt
[root@localhost ~]# cd /mnt/
[root@localhost mnt]# ls
lost+found
[root@localhost mnt]#
通过df –h命令可以查看到我们的/dev/sda8这个分区是被挂载到/mnt下面的,我们进入了/mnt,现在里面什么东西也没有。
现在开始生成磁盘配额数据库
#quotacheck -cumg /dev/sda7
[root@localhost ~]# quotacheck -cumg /dev/sda8
[root@localhost ~]# cd /mnt/
[root@localhost mnt]# ll
total 24
-rw------- 1 root root 6144 Feb 25 21:52 aquota.group
-rw------- 1 root root 6144 Feb 25 21:52 aquota.user
drwx------ 2 root root 12288 Feb 25 21:39 lost+found
现在可以看到,生成磁盘配额数据库后,在/mnt下面就自动的产生了两个文件,aquota.user和aquota.group这个两个文件。这两个文件就是用来存放所有磁盘配额的信息。
第三步,启用磁盘配额。
#quotaon /dev/sda8
启动磁盘配额功能,
[root@localhost ~]# quotaon /dev/sda8
[root@localhost ~]#
当然我们也可以关闭磁盘配额的功能。
[root@localhost ~]#
[root@localhost ~]# quotaoff /dev/sda8
第四步,编辑磁盘配额。
# edquota user1
现在我们系统中有个用户user1,我们就针对这个用户来做磁盘配额。
[root@localhost ~]#
[root@localhost ~]# edquota user1
Disk quotas for user user1 (uid 500):
Filesystem blocks soft hard inodes soft hard
/dev/sda8 0 0 0 0 0 0
参数意义
Filesystem 代表为那个分区在做磁盘配额
Blocks 文件的大小
Soft 软限制文件大小
Hard 硬限制文件大小
Inodes 文件的数量
Soft 软限制文件数量
Hard 硬限制文件数量
有一点需要注意的是,如果在blocks这项里面已经默认就有了文件大小,那么我们在做文件大小磁盘配额限制的时候,一定要加上这个默认的文件大小,比如说在blocks这项里面已经有了20K大小的文件,那么我们在做磁盘配额限制用户只可以写如50K的数据,那么就必须加上那个默认的文件大小,也就是70K。inodes的选项也一样,在做限制的时候也需要加上默认的inodes的文件数量。
关于软限制和硬限制
软限制代表当用户写入的数据达到软限制的规定,就进行警告,但是还是可以写入数据的。
硬限制代表当用户写入的数据达到硬限制的规定,那么用户就不可以在磁盘写入数据了,强制性的。
现在我们来做一个试验,允许user1在/dev/sda8里面只可以写入100K的数据,当user1在/dev/sda8中写入的数据到达80K就进行警告。
[root@localhost ~]#
[root@localhost ~]# edquota user1
Disk quotas for user user1 (uid 500):
Filesystem blocks soft hard inodes soft hard
/dev/sda8 0 80 100 0 0 0
我们将user1的软限制设为80K,硬限制设为100K了。
现在我们来测试一下,磁盘配额有没有生效。可以看到idoes这项都是0,如果是0就表示这项不生效。
为了试验效果,首先将/mnt的权限全部开放。
[root@localhost ~]# chmod 777 /mnt/
[root@localhost ~]#
现在我们切换到user1用户,然后使用dd工具创建一个80K的文件。
[root@localhost ~]# su - user1
[user1@localhost ~]$
[user1@localhost ~]$ cd /mnt/
[user1@localhost mnt]$ ls
aquota.group aquota.user lost+found
[user1@localhost mnt]$ dd if=/dev/zero of=file bs=1K count=80
sda8: warning, user block quota exceeded.
80+0 records in
80+0 records out
81920 bytes (82 kB) copied, 0.00277285 seconds, 29.5 MB/s
[user1@localhost mnt]$ ls
aquota.group aquota.user file lost+found
[user1@localhost mnt]$
可以看到,我们通过dd工具创建了一个文件名为file的80K文件,但是给了我们一个警告,是因为user1达到了软限制,所以系统给了一个警告。
我们已经往/dev/sda8里面写入了80K的数据,如果我们在写入20K的数据,那么会发生什么事情呢。
[user1@localhost mnt]$
[user1@localhost mnt]$ dd if=/dev/zero of=file1 bs=1k count=20
sda8: write failed, user block limit reached.
dd: writing `file1': Disk quota exceeded
19+0 records in
18+0 records out
18432 bytes (18 kB) copied, 0.00365465 seconds, 5.0 MB/s
[user1@localhost mnt]$ ll -h
total 126K
-rw------- 1 root root 7.0K Feb 25 22:36 aquota.group
-rw------- 1 root root 7.0K Feb 25 22:33 aquota.user
-rw-rw-r-- 1 user1 user1 80K Feb 25 22:36 file
-rw-rw-r-- 1 user1 user1 18K Feb 25 22:41 file1
drwx------ 2 root root 12K Feb 25 21:39 lost+found
[user1@localhost mnt]$
可以看到,当在往/dev/sda8里面写入20K的数据的时候,系统提示我们写入失败,这就表明我们的磁盘配额就做成功了。当然我们的file1这个文件最后还是被创建了。但是这个文件只有18K,是不完整的。
刚才我们只是对用户做了磁盘配额,如果是组呢,组的磁盘配额配置和用户的配置方法一样,如果对组做限制,那么这个组里面的所有成员就都会受到磁盘配额的影响。
对组做磁盘配额
#Edquota -g user1
磁盘配额的基本配置到这里就基本完成了。
如果我们需要给多个用户做磁盘配额的话,一个一个指定又太麻烦了,有一个方法可以减轻负担。
# Edquota -p user1 user2
这个就是将user1里面的磁盘配额策略复制给user2
[root@localhost ~]#
[root@localhost ~]# edquota user1
Disk quotas for user user1 (uid 500):
Filesystem blocks soft hard inodes soft hard
/dev/sda8 100 80 100 2 0 0
这个就是user1磁盘配额的策略信息
[root@localhost ~]# edquota -p user1 user2
[root@localhost ~]# edquota user2
Disk quotas for user user2 (uid 501):
Filesystem blocks soft hard inodes soft hard
/dev/sda8 0 80 100 0 0 0
可以看到,user1的策略信息就被自动的复制给user2了。
查看磁盘配额的信息
# Edquota -t
Grace period before enforcing soft limits for users:
Time units may be: days, hours, minutes, or seconds
Filesystem Block grace period Inode grace period
/dev/sda8 7days 7days
这个里面主要强制定义用户磁盘过期的时间
Block grace period 7days
这个是代表当用户达到了磁盘配额文件大小的软限制,还没有达到硬限制,那么在七天后,用户还是没有做修改,还是处于警告范围,那么就算用户没有达到硬限制,那么用户也不可以在往里面写入数据了。
Inode grace period 7days
这个是磁盘配额文件数量的过期时间限制,和Block grace period的一样,也是七天。
当然这些过期时间也是可以修改的。
如果只想修改每个用户的过期时间,可以用这条命令
Edquota -T user1(username)
查看磁盘配额的策略设置
Quota user1(username)
[root@localhost ~]# quota user1
Disk quotas for user user1 (uid 500):
Filesystem blocks quota limit grace files quota limit grace
/dev/sda8 100* 80 100 2 0 0
[root@localhost ~]#
这个命令只可以查询每一个用户
如果想查询系统中所有用户的磁盘配额策略,使用这条命令
#repquora -a
[root@localhost ~]# repquota -a
*** Report for user quotas on device /dev/sda8
Block grace time: 7days; Inode grace time: 7days
Block limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 10544 0 0 4 0 0
user1 +- 100 80 100 6days 2 0 0
user2 -- 1 80 100 1 0 0
user3 -- 1 80 100 1 0 0
[root@localhost ~]#
这条命令可以查看系统中所有用户的磁盘配额的信息。
linux下有关磁盘配额的内容就介绍这里,希望对大家有所帮助。
本文介绍linux下文件ACL权限的相关内容,供大家学习参考。
我们知道,在linux系统中,我们将访问文件的用户分为三类,user,group,other。
如果系统中某个用户想对某个文件有写入的权限,但是该用户是属于other,如果是这样,就只能够开放other的权限。但是一旦开放other的权限,那么所有人就对该文件有写入的权限了。文件的ACL权限就很好的解决了这个问题,它可以设置一个特定文件的特定权限。
下面来具体的设置文件ACL权限。
如果想拥有文件ACL的权限,就必须为文件系统添加一个ACL属性。
[root@localhost ~]#
[root@localhost ~]# mount -o remount,acl /dev/sda9
[root@localhost ~]#
[root@localhost ~]# mount | grep /dev/sda9
/dev/sda9 on /mnt type ext3 (rw,acl)
[root@localhost ~]#
[root@localhost ~]#
可以看到,/dev/sda9已经有了ACL属性。
现在我们新建一个redhat目录。
[root@localhost ~]#
[root@localhost ~]# cd /mnt/
[root@localhost mnt]#
[root@localhost mnt]# mkdir redhat
[root@localhost mnt]#
[root@localhost mnt]# ll -ld /redhat/
drwxr-xr-x 2 root root 4096 Feb 26 21:56 /redhat/
[root@localhost mnt]#
可以看到,这个redhat目录的权限为755,这个目录的拥有人和拥有组都是root,也就是说其他人对这个目录是没有写入的权限的。
[root@localhost ~]# su - user1
[user1@localhost ~]$
[user1@localhost ~]$ cd /mnt/
[user1@localhost mnt]$ ls
lost+found redhat
[user1@localhost mnt]$ cd redhat/
[user1@localhost redhat]$ touch file
touch: cannot touch `file': Permission denied
[user1@localhost redhat]$ ls
[user1@localhost redhat]$
可以看到,user1是other,user1对redhat这个目录果然没有写入的权限。
如果我们想要给user1对这个目录有一个rwx的权限。除了开放other的权限,我们还可以使用文件的ACL功能。
现在我们就给user1对该目录设置ACL权限。
#setfacl -m u:user1:rwx /mnt/redhat/
-m 修改
u 用户
user1 指定用户
rwx 指定权限
/redhat 指定目录
[root@localhost ~]#
[root@localhost ~]# cd /mnt/
[root@localhost mnt]#
[root@localhost mnt]# setfacl -m u:user1:rwx /mnt/redhat/
[root@localhost mnt]#
[root@localhost mnt]# ll
total 14
drwx------ 2 root root 12288 Feb 26 21:53 lost+found
drwxrwxr-x+ 2 root root 1024 Feb 26 22:11 redhat
[root@localhost mnt]#
我们已经给redhat目录设置了ACL权限,通过ll可以看到,redhat目录的权限位后面多了一个加号,这个加号就代表不要看表面的权限,说明还有更深的权限隐藏在里面。
如何去查看这个文件的具体权限呢
#Getfacl /mnt/redhat
[root@localhost mnt]#
[root@localhost mnt]# getfacl /mnt/redhat
getfacl: Removing leading '/' from absolute path names
# file: mnt/redhat
# owner: root
# group: root
user::rwx
user:user1:rwx
group::r-x
mask::rwx
other::r-x
[root@localhost mnt]#
我们可以看到文件的拥有人和拥有组都是root,user的权限是rwx,group的权限也r-x,other的权限是r-x。而且最重要的是user:user1:rwx,也就是user1这个用户对该目录也有rwx的权限。Mask代表用户的实际权限。
现在我们利用user1到redhat目录里面尝试去写入。
[root@localhost ~]#
[root@localhost ~]# su - user1
[user1@localhost ~]$
[user1@localhost ~]$ cd /mnt/redhat/
[user1@localhost redhat]$
[user1@localhost redhat]$ mkdir file
[user1@localhost redhat]$ ls
file
[user1@localhost redhat]$
可以看到,刚才我们是不可以往里面写入的,但是现在我们就写入成功了。
刚才我们对user1这个用户做了文件的ACL权限。
现在我们对组来做文件的ACL权限。
#setfacl -m g:user1:rwx /mnt/redhat/
[root@localhost ~]#
[root@localhost ~]# setfacl -m g:user1:rwx /mnt/redhat/
[root@localhost ~]#
[root@localhost ~]# getfacl /mnt/redhat/
getfacl: Removing leading '/' from absolute path names
# file: mnt/redhat
# owner: root
# group: root
user::rwx
user:user1:rwx
group::r-x
group:user1:rwx
mask::rwx
other::r-x
[root@localhost ~]#
现在user1这个组里面的成员对/mnt/redhat目录也有rwx权限了。
下面还有个关于文件ACL功能的问题
刚才我们用user1在/mnt/redhat目录下面创建了一个file的文件夹,说明我们对redhat这个目录有rwx的权限,但是如果在redhat目录下面还有一个文件夹,我们是否对它有rwx的权限呢。试下,
[root@localhost ~]#
[root@localhost ~]# cd /mnt/redhat/
[root@localhost redhat]# ls
file
[root@localhost redhat]# mkdir file1
[root@localhost redhat]# cd
[root@localhost ~]#
[root@localhost ~]# su - user1
[user1@localhost ~]$ cd /mnt/redhat/
[user1@localhost redhat]$ cd file1
[user1@localhost file1]$ touch 1.txt
touch: cannot touch `1.txt': Permission denied
[user1@localhost file1]$
很显然,我们对redhat目录下面的子目录是没有rwx的权限的。也就是说文件的ACL功能只对当前目录生效,并不可以对子目录生效。
看下这条命令的作用,
# setfacl -m d:u:user2:rwx /mnt/redhat/
[root@localhost ~]#
[root@localhost ~]# setfacl -m d:u:user2:rwx /mnt/redhat/
[root@localhost ~]#
这个时候,我们同样给user2一个rwx的权限。
[root@localhost ~]#
[root@localhost ~]# su - user2
[user2@localhost ~]$
[user2@localhost ~]$ cd /mnt/redhat/
[user2@localhost redhat]$
[user2@localhost redhat]$ mkdir file100
mkdir: cannot create directory `file100': Permission denied
[user2@localhost redhat]$
但是现在我们不可以往/mnt/redhat目录里面写入数据,就是因为多了一个d,这个d代表default。
我们现在来看看它的用处是什么。
[root@localhost ~]#
[root@localhost ~]# cd /mnt/redhat/
[root@localhost redhat]# mkdir test
[root@localhost redhat]# ll
total 4
drwxrwxr-x 2 user1 user1 1024 Feb 26 22:44 file
drwxr-xr-x 2 root root 1024 Feb 26 22:46 file1
drwxrwxr-x+ 2 root root 1024 Feb 26 22:58 test
[root@localhost redhat]#
现在可以看到,test这个目录权限位上面多了一个加号,看下它的具体权限。
[root@localhost redhat]#
[root@localhost redhat]# getfacl test/
# file: test
# owner: root
# group: root
user::rwx
user:user2:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:user2:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
[root@localhost redhat]#
可以看到,user2这个用户对该目录有rwx的权限。尝试往test目录里面写入数据。
[root@localhost ~]#
[root@localhost ~]# su - user2
[user2@localhost ~]$
[user2@localhost ~]$ cd /mnt/redhat/
[user2@localhost redhat]$
[user2@localhost redhat]$ cd test/
[user2@localhost test]$
[user2@localhost test]$ touch 1.txt
[user2@localhost test]$ ls
1.txt
[user2@localhost test]$
写入成功了,刚才我们只是对/redhat目录做了文件的ACL功能,为什么现在user2对其子目录会有rwx的权限呢,这个就是因为刚才d参数的含义,就是递归的含义,对当前目录无效果,对子目录才有效果。
不管是任何用户向/mnt/redhat目录建立的数据,user2都会继承它们的权限。
这条命令只可以针对目录来做ACL权限。不可以对文件做,因为对文件做没有意义。文件不可能有下一级目录的。
如果文件的拥有人和拥有组和文件的ACL权限发生冲突的时候,以拥有人和拥有组为准,其实文件的ACL功能只对other人有意义。
如何移除文件的ACL权限呢
#setfacl -k /mnt/redhat/
移除文件的默认ACL属性
#setfacl –b /mnt/redhat
移除文件的所有ACL权限
#setfacl –x u:user1 /mnt/redhat
移除user1对文件的ACL权限
当我们在复制文件的时候,如果使用-p的参数,也一样可以将文件的ACL权限给复制过去。
至此,有关linux下文件ACL权限的内容就介绍完了,希望对大家有所帮助。