zoukankan      html  css  js  c++  java
  • 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 才能改变
  • 相关阅读:
    Nexus OSS 3 搭建 Docker & Git LFS 仓库
    YARN FairScheduler
    k8s基本概念及使用
    k8s 基本使用
    10款非常实用的在线网站原型设计工具
    Spark常见问题及性能调优
    spark常见问题处理
    TensorFlow 基本使用
    c语言数组的操作
    在Android开发中遇到的MediaPlayer问题
  • 原文地址:https://www.cnblogs.com/neozheng/p/10545204.html
Copyright © 2011-2022 走看看