文件删除原理有以下三点:
1.文件系统回收inode,或被覆盖神仙也找不回
2.所有硬链接都要删除(i_nlink等于0)
3.服务进程不读取inode(i_ count等于0)
linux是通过link的数量来控制文件删除的,只有当一个文件不存在任何link的时候,文件才能被删除,一般文件有两个link 一个i_count和一个i_nlink
i_count的意义是当前文件使用者(或被调用)的数量,i_nlink 是磁盘的引用计数器
当一个文件被某一个进程引用时,对应i_count数就会增加。当创建文件的硬链接时,对应的i_nlink就会增加
对于删除命令rm而言,实际就是减少磁盘引用计数i_nlink。这里就会有一个问题,如果一个文件正在被某个进程调用,而用户却执行rm操作把文件删除了,那么会出现什么结果呢?当用户执行rm操作删除文件后,再执行ls或者其他文件管理命令,无法再找到这个文件了,但是调用这个删除的文件的进程却在继续正常执行,依然能够从文件中正确的读取及写入内容。这又是为什么呢?
这是因为rm操作只是将文件的i_nlink减少了,如果没其它的链接i_nlink就为0了;但由于该文件依然被进程引用,因此,此时文件对应的i_count并不为0,所以即使执行rm操作,但系统并没有真正删除这个文件,当只有i_nlink及i_count都为0的时候,这个文件才会真正被删除。也就是说,还需要解除该进程的对该文件的调用才行。
下面来模拟真实的场景,如果磁盘快满了,你怎么处理?(结合文件删除原理理解)
安装httpd web 服务
yum install httpd -y
/etc/init.d/httpd start
/etc/init.d/iptables stop
cd /etc/httpd/httpd.conf //编辑配置文件,输入5223gg 在该页面中找到 CustomLog /app/log/accedd_log combined ,加粗字体为修改的路径,日志会存放在这里面,退出后用grep "/app/log"/ httpd.conf 来查看是否修改正确
[[email protected] ~]# dd if=/dev/zero of=/dev/sdc bs=8k count=10 //创建新的磁盘
10+0 records in
10+0 records out
81920 bytes (82 kB) copied, 8.4851e-05 s, 965 MB/s
ls -l /dev/sdc
mkfs -t ext3 /dev/sdc
mount -o -loop /dev/sdc/app/log
重启httpd服务,确保日志记录到/app/log 文件中
访问网站10万次的命令:for n in `seq 10000`;do curl -s 10.0.0.27 >/dev/null;done 将磁盘写满
写了这么多,也是为了模拟真实的场景,如果磁盘快满了,你删除了 rm -rf /app/log/accedd_log 后用df -h 命令查看依旧没有变化,你该怎么处理?
其实只需要重启一下服务就可以把这个问题解决
4.用户主、用户组
linux是多用户,多任务的操作系统
用户角色划分,角色是通过uid和Gid识别
GID为GroupId,即组ID,用来标识用户组的唯一标识符
UID为UserId,即用户ID,用来标识每个用户的唯一标示符
扩展:
用户组:将同一类用户设置为同一个组,如可将所有的系统管理员设置为admin组,便于分配权限,将某些重要的文件设置为所有admin组用户可以读写,这样可以进行权限分配。
每个用户都一个唯一的用户id,每个用户组都有一个唯一的组id
超级用户root的uid和gid都是0 用命令id root 查看
普通用户:仅仅具备操作自己家目录中的文件和目录的权限,为普通用户授权(sudo) uid 从500开始
虚拟用户:与真实的普通用户区分开来,安装系统后默认就存在,大多数情况不能登录,那岂不是鸡肋?不是的,他们可以方便系统管理。它的UID大多数在1-499
awk -F ":" ‘{print $1 "" $3}‘ /etc/passwd 可以查看uid和用户
用户的之间的切换依赖于 .bash_logout .bash_profile .bashrc 如果没有,用su - stt 时候,会提示-bash-4.1$
可以在etc/skel 中找到 利用ls -a 把隐藏的找出来
用户组:多个用户归属于多个不同的用户组
5. ls - l - -full-time //可以完整的显示时间
ls -l - - time-style=long-iso //可以完整的显示时间
270260 drwxr-xr-x. 2 root2 root2 4096 Jun 23 19:06 Videos //.代表selinux开启
6.文件的权限
rwx rwx rw- 权限依次对应
主(owner) 读 read 写write 执行0
组 (group)
其他文件(other)
- 代表啥权限都没有
要特别注意:执行mkdir /com/123.txt -p ,创建目录与文件
要想删除123.txt,必须要经过他的老大允许,也就是rwx都有或者chown 用户主 /com 更改用户主 chmod如果想所有文件或子目录同时改变,需要使用-R参数 (recursive)
chmod u+r,g+r,o+r 1.txt //给用户主,用户组,其他用户加上可读权限等同于 chmod a+r 1.txt all
chmod o=rwx 1.txt //等于号有清除原有权限,后面跟的什么,就改变成什么
WIN32下可执行文件:*.exe,*.bat,*.com
linux下可执行文件:*.sh,*.py,*.perl等
[[email protected] ~]$ touch 11 [[email protected] ~]$ ls -li 11 134891 -rw-rw-r--. 1 root2 root2 0 Jun 27 05:56 11 [[email protected] ~]$ mkdir 111 [[email protected] ~]$ ls -ld 111 drwxrwxr-x. 2 root2 root2 4096 Jun 27 05:56 111 [[email protected] ~]$ su - Password: [[email protected] ~]# touch 11 [[email protected] ~]# ls -li 11 141211 -rw-r--r--. 1 root root 0 Jun 27 05:57 11 [[email protected] ~]# mkdir 111 [[email protected] ~]# ls -ld 111 drwxr-xr-x. 2 root root 4096 Jun 27 05:57 111
由上述实验可以得知在root 用户下创建目录的权限是755 文件644
普通用户 目录权限775 文件是664
改变系统的默认权限 umask值决定(几乎不去动它)
umask=022 则666-022=644
umask=021 则666-021=643 643+001=644 //在奇数位加一
7.改变文件属主,属组
[[email protected] kak]# chown root2 1.txt
[[email protected] kak]# ls -li
total 4
521237 -rwxr-x-w-. 1 root2 root 6 Jun 27 00:19 1.txt
[[email protected] kak]# chown .root2 1.txt // .root2 或者:root分割
[[email protected] kak]# ls -li
total 4
521237 -rwxr-x-w-. 1 root2 root2 6 Jun 27 00:19 1.txt
有一种特殊情况,删除用户之后文件的属主 属组为数字
这时就增加 chmod kk -u 2000 //-u 是给设置uid如果不加从501开始
8.简单命令积累
chattr +i 1.txt //上锁 +a 只能汪里面加,不能删
lsattr 1.txt // 查看文件
isof -i :80等同于netstat -lnt|grep 80 //查看端口开启了什么服务
9.如果创建文件tmp/1.txt,想删除1.txt,怎么处理?
下图是读取1.txt文件的步骤
首先想把1.txt删除,最容易进入的误区是直接对1.txt进行操作
能不能删,你必须要看1.txt上一级目录的权限
我们先从文件的读取来着手,想打开1.txt文件,那么就需要先从根目录上最开始读取数据,就像打游戏通关似的,欲过此地,留下买路钱
过了几个关卡,留了遍地的钱,那么1.txt的买路钱是由/tmp 目录把控的,才能看见最后的hello world
所以更改/tmp中的other中的权限可以达到目的
相关博文:http://blog.sina.com.cn/s/blog_3edf6ca20100qvif.html