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 才能改变
  • 相关阅读:
    使用 libevent 和 libev 提高网络应用性能
    An existing connection was forcibly closed by the remote host
    各种浏览器的兼容css
    vs输出窗口,显示build的时间
    sass
    网站设置404错误页
    List of content management systems
    css footer not displaying at the bottom of the page
    强制刷新css
    sp_executesql invalid object name
  • 原文地址:https://www.cnblogs.com/neozheng/p/10545204.html
Copyright © 2011-2022 走看看