Linux(4):文件属性

文件属性:

# 重点: 磁盘空间不足 和 软链接与硬链接的区别

查看文件的属性:

# ls lhi 文件 
[root@NEO ~]# ls -lhi /etc/hosts
130078 -rw-r--r--. 2 root root 180 Mar 14 18:35 /etc/hosts

# 上面输出信息 每列的含义:
130078        ===>  inode 号码,文件的号码(相当于人的身份证号码)
-             ===>  第1个 - :表示文件的类型
rw-r--r--     ===>  文件的权限 
.             ===>  与 selinux 有关
2             ===>  文件的硬链接数量
root          ===>  文件的所有者
root          ===>  用户属于的家族
180           ===>  文件大小
Mar 14 18:35  ===>  文件的修改时间
/etc/hosts    ===>  文件名 (注意:文件名不是文件的属性)

1. inode 和 block 简介

# 获得一个硬盘 到 可以向硬盘中存放数据的过程:
# 硬盘(房子) --- 分区(划分隔断) --- 格式化创建文件系统(装修成不同风格) --- 挂载(安装门窗)

inode 和 block

# inode
1) 含义:index node(索引节点)
用来存放文件属性的空间;通过inode号码找到这个空间的
文件名不存放在 inode 中 (所以文件名不属于文件属性)
2) 怎么来的?
格式化创建文件系统时创建的
3) 特点:
    1. inode存放文件属性
    2. 存放了block的位置(指向block的指针)
    3. 创建一个文件就要占用一个inode
    4. inode 节点号相同的文件,互为硬链接文件,可以认为是一个文件的不同入口。
    5. inode 在某一个文件系统(分区)中,是唯一的
    
4) 怎么用/看 inode
    ls -i (看某些文件的 inode 号码) 或者 df -i (系统里面inode用了多少、剩余多少)
[root@NEO ~]# ls -i
405404 anaconda-ks.cfg  138447 data  390150 install.log.syslog
[root@NEO ~]# ls -li
total 16
405404 -rw-------. 1 root root 1061 Oct 16 00:49 anaconda-ks.cfg
138447 drwxr-xr-x. 2 root root 4096 Mar  8 15:55 data
390150 -rw-r--r--. 1 root root 5890 Oct 16 00:47 install.log.syslog
[root@NEO ~]# ls -lih
total 16K
405404 -rw-------. 1 root root 1.1K Oct 16 00:49 anaconda-ks.cfg
138447 drwxr-xr-x. 2 root root 4.0K Mar  8 15:55 data
390150 -rw-r--r--. 1 root root 5.8K Oct 16 00:47 install.log.syslog
[root@NEO ~]# 
[root@NEO ~]# df -i
Filesystem     Inodes IUsed  IFree IUse% Mounted on
/dev/sda3      593344 55426 537918   10% /
tmpfs           60748     1  60747    1% /dev/shm
/dev/sda1       51200    39  51161    1% /boot


# block 
1)含义: 数据块
block是实际存放数据的位置
2)怎么来的?
格式化创建文件系统时创建的
3)特点:
    1. block是实际存放数据的位置
    2. block的大小:4k (centos 6.x默认的大小)  1k  8k 
    3. 创建大文件会占用多个 block,如果文件很小(如 1k),4k 剩余的空间会被浪费 
    4. 创建一个非空文件要占用一个 inode 和至少1个 block
    5. 每读取一个 block 就会消耗一次磁盘I/O(input/output 磁盘读写)
    
4) 怎么看/用 block ?
    df -h (磁盘block使用情况)
    ls -lh (查看一个文件的大小)


[root@NEO ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       8.8G  1.5G  6.9G  18% /
tmpfs           238M     0  238M   0% /dev/shm
/dev/sda1       190M   40M  141M  22% /boot

No space left on device (磁盘空间不足--因为block满了)

# 1. 看看到底哪里满了
[root@NEO ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       8.8G  1.5G  6.9G  18% /
tmpfs           238M     0  238M   0% /dev/shm
/dev/sda1       190M   40M  141M  22% /boot
[root@NEO ~]# du -sh /*
8.0K    /app
7.6M    /bin
38M    /boot
8.0K    /data
220K    /dev
30M    /etc
24K    /home
214M    /lib
27M    /lib64
16K    /lost+found
4.0K    /media
4.0K    /mnt
24K    /neozheng
36K    /oldboy
28K    /opt
du: cannot access `/proc/1893/task/1893/fd/4': No such file or directory
du: cannot access `/proc/1893/task/1893/fdinfo/4': No such file or directory
du: cannot access `/proc/1893/fd/4': No such file or directory
du: cannot access `/proc/1893/fdinfo/4': No such file or directory
0    /proc
64K    /root
16M    /sbin
4.0K    /selinux
4.0K    /srv
0    /sys
19M    /tmp
1.1G    /usr
94M    /var

# 2. 看看是哪个目录占的空间大,最终定位到目录或文件
[root@NEO ~]# du -sh /* |grep G
du: cannot access `/proc/1894/task/1894/fd/4': No such file or directory
du: cannot access `/proc/1894/task/1894/fdinfo/4': No such file or directory
du: cannot access `/proc/1894/fd/4': No such file or directory
du: cannot access `/proc/1894/fdinfo/4': No such file or directory
1.1G    /usr
[root@NEO ~]# du -sh /usr/* |grep G

# du -sh 命令:查看每个目录占多大的空间; grep G 命令:查找占的空间大的目录

# 3. 问清楚是否可以删除,然后再操作

企业案例:如果向磁盘写入数据提示如下错误: No space left on device (磁盘空间不足),通过 df -h 查看磁盘空间,发现没满,请问可能原因是什么?企业场景什么情况下会导致这个问题发生?

# 可能原因: inode 用完了

# 创建环境的命令:
mkdir -p /app/logs
dd  if=/dev/zero of=/dev/sdc bs=8k count=10
ls -l /dev/sdc
mkfs.ext4 /dev/sdc   # mkfs 是用来格式化的;mk -- make ,f -- file ,s -- system

mount -o loop /dev/sdc /app/logs   # mount 是 挂载 的命令

[root@NEO tmp]# cd /app/logs/
[root@NEO logs]# touch stu{1..6}.log
touch: cannot touch `stu6.log': No space left on device
[root@NEO logs]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       8.8G  1.5G  6.9G  18% /
tmpfs           238M     0  238M   0% /dev/shm
/dev/sda1       190M   40M  141M  22% /boot
/dev/sdc         73K   14K   55K  21% /app/logs
[root@NEO logs]# df -i
Filesystem     Inodes IUsed  IFree IUse% Mounted on
/dev/sda3      593344 55426 537918   10% /
tmpfs           60748     1  60747    1% /dev/shm
/dev/sda1       51200    39  51161    1% /boot
/dev/sdc           16    16      0  100% /app/logs
[root@NEO logs]# 

# 从上面的示例,也是 block 还没用完, 但 inode 用完了

文件属性的文件类型:

- 指代 f,file,即 普通文件
d 指代 d,directory,目录
l 指代 l,softlink,软链接(相当于windows中的快捷方式)

# linux下的普通文件也分为3种:
[root@NEO lost+found]# ls -l /tmp/etc.tar.gz /bin/ls /etc/hosts
-rwxr-xr-x. 1 root root  117048 Mar 23  2017 /bin/ls
-rw-r--r--. 2 root root     180 Mar 14 18:35 /etc/hosts
-rw-r--r--  1 root root 9732526 Mar 16 02:45 /tmp/etc.tar.gz
[root@NEO lost+found]# file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped   # 可执行的文件(二进制文件,命令)
[root@NEO lost+found]# file /etc/hosts
/etc/hosts: ASCII text   # 普通文本文件
[root@NEO lost+found]# file /tmp/etc.tar.gz 
/tmp/etc.tar.gz: gzip compressed data, from Unix, last modified: Sat Mar 16 02:45:23 2019   # 压缩包(数据文件,data)
[root@NEO lost+found]# 

# file 命令: 显示文件的详细类型

扩展名:

windows 通过扩展名区分不同类型的文件
linux中,扩展名是用来给我们看的,你可以随便改,不影响使用,如下:
[root@NEO ~]# mv /tmp/etc-exclude.tar.gz /tmp/etc.txt
[root@NEO ~]# file /tmp/etc.txt 
/tmp/etc.txt: gzip compressed data, from Unix, last modified: Sat Mar 16 02:45:50 2019
[root@NEO ~]# 

# 并且 tar 命令也可以解压 etc.txt 文件

# linux 中常见的扩展名:
.sh     # 脚本文件(把一堆命令放在一起,可以运行)
.conf   # 配置文件


# 用户 和 用户组 简介:
对于一个文件/目录来说,用户可以分为3类:
    所有者,所属的用户组 和 陌生人
138447 drwxr-xr-x. 2   root                     root                                           4.0K Mar  8 15:55 data
                       这个root 代指 所有者        这个root 代指所有者所属的组的名字(用户组)


# 假设我是 oldboy 用户,那么我与这个文件有什么关系 ?
# 查询用户信息的命令: id 用户名    # 包含 用户名 及其所属的 用户组(groups=)
[root@NEO ~]# id oldboy
uid=500(oldboy) gid=500(oldboy) groups=500(oldboy)   
[root@NEO ~]# 
# 所以 oldboy 用户 对于这个文件来说就是 陌生人


# linux 中存在于系统中的用户如何分类 ?
UID  ===> user id, 用户的id号码,相当于 身份证号码,在系统中是唯一的 (UID用的比较多)
GID  ===> group id,用户组的id号码,相当于 户口本号码

                            UID
    1. 皇帝      root        0
    2. 傀儡      虚拟用户    1-499      作用:为了满足系统中每个进程要有一个对应的用户(虚拟用户是无法使用的,无法切换,即无法使用 su -3. 贫民百姓  普通用户    500以上

# 如何保护root用户?
1. 禁止root 远程登陆
2. 修改 ssh 默认的端口号 22
3. 定期分析 /var/log/secure (该文件记录着用户的登陆信息)

与用户有关的文件

/etc/passwd    # 存放的是用户的信息
/etc/shadow    # 存放的是用户密码的信息
/etc/group     # 存放的是用户组的信息
/etc/gshadow   # 存放的是用户组密码的信息

# /etc/passwd 
[root@NEO ~]# cat /etc/passwd
...
root    :x:0    :0        :root    :/root        :/bin/bash   
oldboy:x:500    :500:            :/home/oldboy    :/bin/bash
# 冒号是分隔符
# 第一列:用户名字
# 第二列:原来存放密码的地方
# 第三列:UID
# 第四列:GID
# 第五列:用户的说明信息(默认为空)
# 第六列:用户的家目录
# 第七列:用户使用的shell(用户使用的命令解释器;centos 默认的 shell是 /bin/bash)

# /bin/bash  ---> centos 默认的命令解释器
# /sbin/bash ---> 也是命令解释器,但如果用户的命令解释器为 /sbin/bash,那么用户无法登陆系统(相当于傀儡用户)

 

linux 9位权限说明与计算 

# 权限的种类:
# r  4 ---> read;可以读取文件内容(可以用 cat 查看)
# w  2 ---> write;可以修改文件内容
# x  1 ---> execute;可以运行文件 (命令、脚本)
# -  0 ---> 什么权限都没有

[root@NEO ~]# ls -l /etc/hosts
-rw-r--r--. 2 root root 180 Mar 14 18:35 /etc/hosts
-rw-r--r--. 
# 第1个 -  :文件类型为普通文件
# rw-      :所有者拥有的权限; 420 --> 6
# r--      :用户组拥有的权限; 420 --> 4
# r--       :陌生人对这个文件拥有的权限; 420 --> 4

软链接 和 硬链接

# 软链接: 
# 软链接相当于 windows 中的快捷方式;也叫 符号链接

# 怎么来的?
# 创建软链接的命令: ln -s
[root@NEO oldboy]# ln -s oldboy.txt oldboy.txt-soft
[root@NEO oldboy]# ls -l oldboy.txt*
-rw-r--r-- 1 root root 30 Mar 16 03:28 oldboy.txt
lrwxrwxrwx 1 root root 10 Mar 19 04:42 oldboy.txt-soft -> oldboy.txt     # 这个就是软链接 (软链接是一种新的文件类型)

# 特点:
1. 存放着源文件的位置
2. 源文件被删除,软链接就找不到源文件
3. 主要是为了节约时间


# 硬链接
# 硬链接相当于超市(即 文件内容)的前后门(即 文件),可通过不同的大门进入超市
# 在同一个分区(文件系统中),两个或多个文件的 inode 号码相同,则这些文件互为 硬链接 文件

# 怎么来的?
# 创建 硬链接 的命令: ln
[root@NEO oldboy]# ln oldboy.txt oldboy.txt-hard
[root@NEO oldboy]# ls -lhi oldboy.txt*
140131 -rw-r--r-- 2 root root 30 Mar 16 03:28 oldboy.txt
140131 -rw-r--r-- 2 root root 30 Mar 16 03:28 oldboy.txt-hard
# 查看硬链接会涉及到 inode 号码,所以要用 -lhi ;上面的 2 表示 硬链接数量 (即文件有几个入口)

# 特点: 
1. 硬链接相当于 超市的入口,硬链接的数量就是 文件一共有多少个入口
2. 假设硬链接数是2,删除硬链接或源文件后,文件还能断续使用;如果硬链接和源文件都被删除,则该文件被删除(即 硬链接数量为0)

# 硬链接主要用于防止文件被误删,但硬链接不能防止文件被误清空、误修改(此时需要备份 cp;备份会占用更多的空间,但硬链接不会多占空间)

# 软链接 和 硬链接的区别(面试题):
解答:
1)如何创建:
    a) 默认不带参数情况下, ln 命令创建的是硬链接,带 -s 参数的 ln 命令创建的是软链接
2)含义:
    a) 硬链接文件与源文件的 inode 节点号相同,而软链接文件相当于 windows 下面的 快捷方式 (inode节点号与源文件不同)
3)特点:
    a) 不能对目录创建硬链接(只能对文件创建硬链接),但可以创建软链接,对目录的软链接会经常用到
    b) 软链接可以跨文件系统,硬链接不可以跨文件系统
4)怎么没的?(源文件、软链接、硬链接与删除)
    a) 删除软链接文件,对源文件及硬链接文件无任何影响
    b) 删除文件的硬链接文件,对源文件及软链接文件无任何影响
    c) 删除软链接文件的源文件,对硬链接文件无影响,但会导致其软链接失效(红底白字闪烁状)
    d) 同时删除源文件及其硬链接文件,整个文件才会被真正的删除

linux 中彻底删除一个文件的原理:

1) 删除这个文件所有相关的硬链接 - rm (rm命令删除的是硬链接,只是删除了文件的入口)
2) 这个文件的进程调用数也为0

linux 中彻底删除一个文件的条件:

1. 硬链接数量为0
2. 进程调用数为0

# 磁盘空间不足:某个文件没有被彻底删除,导致的磁盘空间满了

# 一般情况下,大多数服务(包括脚本)在运行时,是不能删除当前正在写入的日志文件的
# 解决办法: 查找机器自身的服务,然后重启 apache 和 tomcat

# 模拟的思路:向 /var/log/secure 追加8亿行,然后删除该文件 (因为这个文件一直在运行)
[root@NEO ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       8.8G  1.5G  7.0G  18% /
tmpfs           238M     0  238M   0% /dev/shm
/dev/sda1       190M   40M  141M  22% /boot
[root@NEO ~]# seq 800000000 >>/var/log/secure
^C      
[root@NEO ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       8.8G  8.8G     0 100% /
tmpfs           238M     0  238M   0% /dev/shm
/dev/sda1       190M   40M  141M  22% /boot
[root@NEO ~]# du -sh /* |grep G
du: cannot access `/proc/1656/task/1656/fd/4': No such file or directory
du: cannot access `/proc/1656/task/1656/fdinfo/4': No such file or directory
du: cannot access `/proc/1656/fd/4': No such file or directory
du: cannot access `/proc/1656/fdinfo/4': No such file or directory
1.1G    /usr
7.5G    /var
[root@NEO ~]# du -sh /var/* |grep G
7.4G    /var/log
[root@NEO ~]# du -sh /var/log/* |grep G
7.4G    /var/log/secure
[root@NEO ~]# 
m -f /var/log/secure
[root@NEO ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       8.8G  8.8G     0 100% /              ###  删除 /var/log/secure 后  磁盘仍然被占满
tmpfs           238M     0  238M   0% /dev/shm
/dev/sda1       190M   40M  141M  22% /boot
[root@NEO ~]# du -sh /* |grep G
du: cannot access `/proc/1664/task/1664/fd/4': No such file or directory
du: cannot access `/proc/1664/task/1664/fdinfo/4': No such file or directory
du: cannot access `/proc/1664/fd/4': No such file or directory
du: cannot access `/proc/1664/fdinfo/4': No such file or directory
1.1G    /usr           # 显示磁盘只占用了 1.1 个 G
[root@NEO ~]# lsof |grep delete
rsyslogd  1236      root    2w      REG                8,3 7867312270     260317 /var/log/secure (deleted)    # (deleted) --- 标记,表示这个文件的硬链接数量为0、但进程调用数不为0
软件名称                                             软件大小(单位为字节)         文件名

# 原因:系统中某个文件没有被彻底删除

# 如何找出硬链接数为0,进程调用数不为0 的文件?
# lsof 命令: 能显示出系统中所有的文件 

# 解决办法:重启反对应的软件/服务
[root@NEO ~]# /etc/init.d/rsyslog restart    # 重启 /etc/log/secure 的命令
Shutting down system logger:                               [  OK  ]
Starting system logger:                                    [  OK  ]
[root@NEO ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       8.8G  1.5G  7.0G  18% /                # 此时磁盘空间就恢复了
tmpfs           238M     0  238M   0% /dev/shm
/dev/sda1       190M   40M  141M  22% /boot

磁盘空间不足案例总结:

1. block 满了: 如正常 500G的空间但存放了501G的视频
2. inode 满了:大量的小文件
3. block满了:文件没有被彻底删除导致磁盘空间不足;硬链接数为0 但进程调用数不为0

Linux 文件属性之 三种时间

linux修改、访问、改变时间简介:

# mtime :modified time,文件的修改时间 --- 文件内容的变化时间(最常用的时间, ls -l 命令显示的也是文件的修改时间)
# ctime :change time , 文件属性的改变时间,如 硬链接数量、文件大小、文件权限等
# atime :access time ,文件的访问时间 (cat 一次)

# stat 命令: 显示文件的三种时间
[root@NEO ~]# cd /oldboy/
[root@NEO oldboy]# ls -l oldboy.txt
-rw-r--r-- 2 root root 30 Mar 16 03:28 oldboy.txt
[root@NEO oldboy]# stat oldboy.txt
  File: `oldboy.txt'
  Size: 30            Blocks: 8          IO Block: 4096   regular file
Device: 803h/2051d    Inode: 140131      Links: 2
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-03-16 03:29:35.999220892 +0800
Modify: 2019-03-16 03:28:38.741224512 +0800
Change: 2019-03-19 04:58:46.160174337 +0800
[root@NEO oldboy]# 
[root@NEO oldboy]# echo hello >>oldboy.txt
[root@NEO oldboy]# stat oldboy.txt
  File: `oldboy.txt'
  Size: 36            Blocks: 8          IO Block: 4096   regular file
Device: 803h/2051d    Inode: 140131      Links: 2
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-03-16 03:29:35.999220892 +0800
Modify: 2019-03-25 05:25:10.432437899 +0800
Change: 2019-03-25 05:25:10.432437899 +0800
[root@NEO oldboy]# 

# 上面的ctime 改变是因为文件大小变了

# ctime 时间的改变: 如添加硬链接
[root@NEO oldboy]# ln oldboy.txt oldboy.txt-hard
[root@NEO oldboy]# stat oldboy.txt
  File: `oldboy.txt'
  Size: 36            Blocks: 8          IO Block: 4096   regular file
Device: 803h/2051d    Inode: 140131      Links: 2
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-03-16 03:29:35.999220892 +0800
Modify: 2019-03-25 05:25:10.432437899 +0800
Change: 2019-03-25 05:29:54.906456408 +0800
[root@NEO oldboy]# 
# 添加硬链接时,只有 ctime 时间改变

# 这三种时间是文件属性的一部分,文件属性又都放到 inode 中,inode 又放在硬盘里
# atime

[root@NEO oldboy]# stat oldboy.txt
  File: `oldboy.txt'
  Size: 36            Blocks: 8          IO Block: 4096   regular file
Device: 803h/2051d    Inode: 140131      Links: 2
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-03-16 03:29:35.999220892 +0800
Modify: 2019-03-25 05:25:10.432437899 +0800
Change: 2019-03-25 05:29:54.906456408 +0800
[root@NEO oldboy]# cat oldboy.txt
I am oldboy,myqq is 123456789
hello
[root@NEO oldboy]# stat oldboy.txt
  File: `oldboy.txt'
  Size: 36            Blocks: 8          IO Block: 4096   regular file
Device: 803h/2051d    Inode: 140131      Links: 2
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-03-25 05:35:31.232457722 +0800
Modify: 2019-03-25 05:25:10.432437899 +0800
Change: 2019-03-25 05:29:54.906456408 +0800
[root@NEO oldboy]# 

# 注意:只有修改文件内容后的那次 cat 文件,文件的 atime 才能改变
原文地址:https://www.cnblogs.com/neozheng/p/10545204.html