第4章:文件管理

文件目录与重要文件

复制代码
文件目录
==================================================================
历史上
第一块盘的挂载点为根目录"/",系统相关的内容
第二块盘的挂载点为"/usr",用户相关的内容
---------------------------------------------------
*****重点!
[root@yefeng /]#tree -L 1 /           
/
├── bin -> usr/bin     *****binaries二进制命令相关,供所有用户使用的基本命令;不能关联至独立分区,OS启动即会用到的程序
├── boot               *****引导文件存放目录,内核文件(vmlinuz)、引导加载器(bootloader,grub)都存放于此目录
├── dev                *****Device设备文件所在目录(硬件设备文件,例如硬盘、光驱、u盘等,无法直接访问,需挂载)
├── etc                *****配置文件目录;二进制软件包(yum,rpm)配置文件默认路径;centos6下服务启动命令存放的目录
├── home               *****普通用户的家目录
├── lib -> usr/lib          library 库文件目录
├── lib64 -> usr/lib64      64库library 库文件目录
├── media                   媒体挂载点(外接设备的自动挂载点)
├── mnt                *****(mount)临时挂载点,手工挂载点
├── opt                     option,第三方软件包的安装位置。基本没用
├── proc               *****虚拟的文件系统,存放进程和内核信息的目录。
├── sys                     虚拟的文件系统,存放当前系统的硬件设备相关信息的目录。
├── root               *****root用户家目录
├── run                     正在运行进程相关信息的文件
├── sbin -> usr/sbin   *****system binaries 管理员命令所在目录,普通用户执行不了;不能关联至独立分区,OS启动即会用到的程序
├── srv                     为用户提供服务的数据所在目录;存放应用程序的服务数据
├── tmp                *****临时文件所在目录,该目录会周期性清理文件
├── usr                *****系统软件和用户相关程序所在目录,第二层次目录
│   ├── bin
│   ├── etc
│   ├── games
│   ├── include             c程序的头文件(header files)
│   ├── lib
│   ├── lib64
│   ├── libexec
│   ├── local                第三方应用程序的安装位置
│   ├── sbin
│   ├── share                结构化独立的数据,例如doc、man等
│   ├── src
│   └── tmp -> ../var/tmp
└── var                *****存放可变数据,比如logs、ftg、www等数据
    ├── account
    ├── adm
    ├── cache               应用程序缓存数据目录
    ├── crash
    ├── db
    ├── empty
    ├── games
    ├── gopher
    ├── kerberos
    ├── lib                 应用程序状态信息数据
    ├── local               专用于为/usr/local下的应用程序存储可变数据
    ├── lock -> ../run/lock 锁文件
    ├── log                 日志目录及文件
    ├── mail -> spool/mail
    ├── nis
    ├── opt                 专用于为/opt下的应用程序存储可变数据
    ├── preserve
    ├── run -> ../run       运行中的进程相关数据,通常用于存储进程pid文件
    ├── spool               应用程序数据池
    ├── tmp                 保存系统两次重启之间产生的临时数据
    └── yp

----------------------------------------------------------------------------------------------------
注意:以下目录内的文件不要随意修改!!!
/etc: 系统中的配置文件,如果你更改了该目录下的某个文件可能会导致系统不能启动。
/bin, /sbin, /usr/bin, /usr/sbin: 这是系统预设的执行文件的放置目录,比如 ls 就是在 /bin/ls 目录下的。
/var: 这是一个非常重要的目录,系统上跑了很多程序,那么每个程序都会有相应的日志产生,而这些日志就被记录到这个目录下,具体在 /var/log 目录下,另外 mail 的预设放置也是在这里。
文件目录
复制代码
复制代码
/etc的重要文件
==================================================================
1./etc/sysconfig/network-scripts/ifcfg-eth0     #网卡配置文件;用途:用于配置上网的文件
2./etc/resolv.conf                              #Linux系统 DNS客户端的配置文件(这个基本没用了)
3./etc/hosts                                    #系统本地的DNS解析文件
4./etc/fstab                                    #配置开机设备自动挂载的文件
5./etc/rc.local                                 #存放开机自启动程序命令的文件
6./etc/profile及/etc/bashrc                     #配置系统的环境变量/别名等的文件
7./etc/issue和/etc/issue.net                    #连接设备后显示的文本信息
8./etc/motd                                     #用户登录系统之后显示的文本信息
9./etc/redhat-release                           #查看系统版本 (/etc/os-release)
10./etc/sysctl.conf                             #Linux内核参数设置文件
11./etc/init.d                                  #软件启动程序所在的目录(CentOS7以前)/etc/init.d(CentOS7以前) -> rc.d/init.d(CentOS7)
12./etc/inittab                                 #设置开机运行级别以及启动相应级别脚本的文件(CentOS7以前)
13./etc/hostname                                #主机名配置文件
14./etc/profile.d                               #用户登录后执行的脚本所在目录
15./etc/passwd                                  #账号信息文件
16./etc/shadow                                  #密码信息文件
17./etc/gshadow                                 #组密码信息文件
18./etc/sudoers                                 #sudo命令配置文件(权限提升)
19./etc/login.defs                              #所有用户登录是的默认配置
20./etc/group                                   #设定用户的组名与相关信息
21./etc/DIR_COLORS                              #定义各种目录、文件显示的颜色
-----------------------------------------------------------------------------------------------------
1、/etc/sysconfig/network-scripts/ifcfg-eth0:网卡配置文件;用途:用于配置上网的文件
    c7:nmtui;c6:setup 图形化配置上网 本质就是修改上述文件。

2、/etc/resolv.conf:Linux系统 DNS客户端的配置文件(这个基本没用了)
3、/etc/hosts:系统本地的DNS解析文件
    DNS设置:(网卡重启后ifcfg-eth0的DNS配置会更新到resolv.conf中)
        1.优先使用/etc/sysconfig/network-scripts/ifcfg-eth0中配置的DNS
        2.使用/etc/resolv.conf中配置的DNS

4、/etc/fstab:配置开机设备自动挂载的文件
        系统已经在开机的时候帮我们自动挂载了我们安装系统时的分区。
        比如插入一个U盘,希望下次开机能够直接访问。就需要在/etc/fstab里配置。

        [root@yefeng /]#cat /etc/fstab
        UUID=3a3a295f-88f8-456d-94dc-1a3eeb517c02 /            xfs     defaults        0             0
        UUID=fd2e0ca7-32be-425f-86a2-85c02b9ec5ea /boot        xfs     defaults        0             0
        UUID=79a3924b-739e-48dc-ab0c-0444b9ac6591 swap         swap    defaults        0             0
        设备名(UUID)                    挂载点             文件系统类型  挂载参数  是否备份  是否开机检查
        /dev/sda1

        查看设备UUID
        [root@yefeng /]#blkid 
        /dev/sda1: UUID="fd2e0ca7-32be-425f-86a2-85c02b9ec5ea" TYPE="xfs" 
        /dev/sda2: UUID="79a3924b-739e-48dc-ab0c-0444b9ac6591" TYPE="swap" 
        /dev/sda3: UUID="3a3a295f-88f8-456d-94dc-1a3eeb517c02" TYPE="xfs" 
        /dev/sr0: UUID="2018-05-03-20-55-23-00" LABEL="CentOS 7 x86_64" TYPE="iso9660" PTTYPE="dos" 

        [root@yefeng ~]#ls /media/
        CentOS_BuildTag  EULA  images    LiveOS    repodata              RPM-GPG-KEY-CentOS-Testing-7
        EFI              GPL   isolinux  Packages  RPM-GPG-KEY-CentOS-7  TRANS.TBL
        [root@yefeng ~]#df -h
        Filesystem      Size  Used Avail Use% Mounted on
        /dev/sda3        19G  1.7G   18G   9% /
        devtmpfs        980M     0  980M   0% /dev
        tmpfs           991M     0  991M   0% /dev/shm
        tmpfs           991M  9.5M  981M   1% /run
        tmpfs           991M     0  991M   0% /sys/fs/cgroup
        /dev/sr0        4.2G  4.2G     0 100% /media
        /dev/sda1       253M  136M  118M  54% /boot
        tmpfs           199M     0  199M   0% /run/user/0


5、/etc/rc.local:存放开机自启动程序命令的文件
        [root@yefeng ~]#ls -l /etc/rc.local 
        lrwxrwxrwx. 1 root root 13 Mar  4 12:48 /etc/rc.local -> rc.d/rc.local
        CentOS7的特殊:
        chmod +x /etc/rc.d/rc.local 先使得此文件能够运行,加执行权限。

6、/etc/profile及/etc/bashrc:配置系统的环境变量/别名等的文件
    环境变量相关配置文件:/etc/bashrc、/etc/profile、~/.bashrc、~/.bash_profile
    生效顺序:1./etc/bashrc;2.~/.bashrc;3.~/.bash_profile;4./etc/profile

        export PS1="[\[\e[34;1m\]\u@\[\e[0m\]\[\e[32;1m\]\H\[\e[0m\]\[\e[31;1m\] \w\[\e[0m\]]\\$"
        修配配置后,即时生效条件二选一:1、退出重新登录。2、source /etc/profile

7. /etc/issue和/etc/issue.net: #连接设备后显示的文本信息
8./etc/motd:用户登录系统之后显示的文本信息
        [root@yefeng ~]#cat /etc/issue
        \S
        Kernel \r on an \m

        [root@yefeng ~]#cat /etc/issue.net 
        \S
        Kernel \r on an \m
        [root@yefeng ~]#>/etc/issue     #清空文件。
        [root@yefeng ~]#>/etc/issue.net 


9. /etc/redhat-release 查看系统版本 (/etc/os-release)
        [root@yefeng ~]#uname  -r
        3.10.0-957.5.1.el7.x86_64
        [root@yefeng ~]#cat /etc/redhat-release 
        CentOS Linux release 7.6.1810 (Core) 

10./etc/sysctl.conf:Linux内核参数设置文件
        Linux系统内核的配置和优化

11./etc/init.d:软件启动程序所在的目录(CentOS7以前)/etc/init.d(CentOS7以前) -> rc.d/init.d(CentOS7)
    [root@yefeng28325 ~]# ll /etc/init.d
    lrwxrwxrwx. 1 root root 11 Jul 11  2019 /etc/init.d -> rc.d/init.d

    在centos6中/etc/init.d/sshd是存在的,但是在centos7中/etc/rc.d/init.d/下却找不到sshd
    以下3个命令等效
    [root@localhost ~]# /etc/init.d/sshd restart           #CentOS6命令
    [root@localhost ~]# service sshd restart               #CentOS6命令
    [root@yefeng28325 ~]# systemctl restart sshd.service   #CentOS7命令

12./etc/inittab 设置开机运行级别以及启动相应级别脚本的文件(CentOS7以前)
    /usr/lib/systemd/system/ctrl-alt-del.target(CentOS7)

        定义:Linux系统运行级别当前所处于的状态。
        Linux系统运行级别的说明如下:
        #   0  关机(请不要把系统运行级别设置为0)
        #   1  单用户模式 (root用户密码忘记,可用此模式找回)  
        #   2  没有NFS,多用户模式
        #   3  命令行模式 文本模式(企业级服务器核心运行状态)          
        #   4  未使用
        #   5  图形化模式 桌面模式  X11(桌面个人版系统运行状态)
        #   6  重启(不要把系统运行级别设置为6)
        [root@yefeng28325 ~]# runlevel
        N 3
        [root@yefeng28325 ~]# init 6    #切换到6,就是重启系统了,centos7还是兼容数字级别的

        [root@yefeng28325 ~]# ls /usr/lib/systemd/system -l|grep level |grep -v want
        lrwxrwxrwx  1 root root   15 Jul 11  2019 runlevel0.target -> poweroff.target
        lrwxrwxrwx  1 root root   13 Jul 11  2019 runlevel1.target -> rescue.target
        lrwxrwxrwx  1 root root   17 Jul 11  2019 runlevel2.target -> multi-user.target
        lrwxrwxrwx  1 root root   17 Jul 11  2019 runlevel3.target -> multi-user.target
        lrwxrwxrwx  1 root root   17 Jul 11  2019 runlevel4.target -> multi-user.target
        lrwxrwxrwx  1 root root   16 Jul 11  2019 runlevel5.target -> graphical.target
        lrwxrwxrwx  1 root root   13 Jul 11  2019 runlevel6.target -> reboot.target
        -rw-r--r--  1 root root  761 Jul  3  2019 systemd-update-utmp-runlevel.service

        [root@yefeng ~]# systemctl get-default
        multi-user.target
        [root@yefeng ~]# systemctl set-default graphical.target     #猜测应该是配置运行时的默认级别
        Removed symlink /etc/systemd/system/default.target.
        Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/graphical.target.
        [root@yefeng ~]# systemctl get-default
        graphical.target
        [root@yefeng ~]# systemctl set-default multi-user.target     
        Removed symlink /etc/systemd/system/default.target.
        Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/multi-user.target.
        [root@yefeng ~]# systemctl get-default
        multi-user.target

        在centos6中修改/etc/inittab 的id:5:initdefault: (其中5就是代表默认的级别)

13./etc/hostname    主机名配置文件
        修改主机名
        方式1:修改配置文件
           /etc/hostname           C7主机名配置文件
           /etc/sysconfig/network  C6主机名配置文件
        方式2:命令直接修改
        [root@yefeng ~]# hostnamectl set-hostname oldboy #<==永久生效


14./etc/profile.d  用户登录后执行的脚本所在目录
15./etc/passwd      账号信息文件
16./etc/shadow      密码信息文件
17./etc/gshadow     组密码信息文件
18./etc/sudoers     sudo命令配置文件(权限提升)
19./etc/login.defs   所有用户登录是的默认配置
20./etc/group                                   #设定用户的组名与相关信息
21./etc/DIR_COLORS     #定义各种目录、文件显示的颜色
/etc的重要文件
复制代码
复制代码
/usr目录的重要文件;/var目录的重要文件;/proc目录的重要文件;
======================================================================================
/usr目录
1. /usr/local:源码编译安装软件默认的位置路径
   软件安装(了解):
   a.rpm安装
      rpm -ivh 软件包的包名.rpm(几乎不用)
   b.yum安装,rpm包管理器,智能帮我们找一个软件包需要的依赖包(推荐)
      本质就是rpm安装。自动解决依赖,自动使用rpm命令实现安装。
      安装A,A需要B,先安装B。
   c.源代码安装。

2. /usr/src:存放源码文件的目录

------------------------------------------------------------------
/var目录
1. /var/log:记录系统及软件运行信息文件所在的目录
   /var/log/messages:Linux系统级别日志文件*****;记录Linux系统运行行为的文件,正常行为 非正常行为。
      [root@centos7 ~]# ls /var/log/messages*
      /var/log/messages  /var/log/messages-20201122     #一周产生一个messages新文件
 
2. /var/log/secure:用户登录信息日志文件(安全日志文件)
 
3. /var/log/dmesg:记录硬件信息加载情况的日志文件
   dmesg - print or control the kernel ring buffer

------------------------------------------------------------------
/proc下的重要路径知识
1./proc/meminfo         #查系统内存 free -m 查看内存
2./proc/cpuinfo         #查看CPU 
3./proc/loadavg         #查看负载(系统繁忙程度的一个综合指标)  uptime
   [root@oldgirl ~]# uptime   //负载的数字和CPU核数相当的时候就是负载一个临界点,例如:一颗两核CPU,观察1分钟、5分钟、15分钟对应的负载,临界负载就是2
   09:28:14 up 51 min,  2 users,  load average:  0.00, 0.01, 0.05
   当前时间  开机多久  哪些用户   负载  平均     1分钟  5分钟  15分钟
  
4./proc/mounts    当前设备挂载列表信息文件
/usr目录的重要文件;/var目录的重要文件;/proc目录的重要文件;
复制代码
复制代码
linux的应用程序的组成部分:
1.二进制程序:/bin;/sbin;/usr/bin;/usr/sbin;/usr/local/bin;/usr/local/sbin
2.库文件:/lib;/lib64;/usr/lib;/usr/lib64;/usr/local/lib;/usr/local/lib64
3.配置文件:/etc;/etc/DIRECTORY;/usr/local/etc
4.帮助文件:/usr/share/man;/usr/share/doc;/usr/local/share/man;/usr/local/share/doc
linux的应用程序的组成部分
复制代码

 

复制代码
进程与namespace;宿主机容器进程与容器内进程;/proc目录(20220123更新)
===================================================================================================================================
进程与namespace:
    namespace 是 Linux 内核用来隔离内核资源的方式。通过 namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的资源,这两拨进程根本就感觉不到对方的存在。具体的实现方式是把一个或多个进程的相关资源指定在同一个 namespace 中。

查看进程namespace的方法:
    1.lsns命令
        lsns            #默认查看6种类型的namespace
        lsns -t net     #列出network namespace的inode

    2.ps命令
        ps -e -o pidns,pid,args |awk '{print $1}' |sort -u

    3./proc/$$/ns目录
        从版本号为 3.8 的内核开始,/proc/[pid]/ns 目录下会包含进程所属的 namespace 信息
        ll /proc/$$/ns  #目录下的文件均为链接文件,内容的格式为 xxx:[inode number]。其中的 xxx 为 namespace 的类型,inode number 则用来标识一个 namespace,我们也可以把它理解为 namespace 的 ID。

-----------------------------------------------------------------------------------------------------------------------------------
宿主机容器进程与容器内进程

现象1:宿主机执行ps命令可以列出所有的容器进程。
现象2:宿主机列出容器的进程PID和容器内的进程PID是不同的(这让容器中的进程产生错觉,认为自己置身于一个独立的系统中,从而达到隔离的目的);但是namespace inode ID是相同的
现象3:容器进程的namespace inode ID是root namespace;容器内进程的namespace inode ID是容器namespace
猜测:容器显示的现象是这样,但是虚拟机的现象可能就不会这样了,在宿主机应该是无法显示VM的进程的。

[root@k8s-node-1 ~]# ps auxf |grep 4315 -A20
root       4315  0.1  0.4 792592 50144 ?        Ssl  Jan21   4:11 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-proxy-current --init-path=/usr/libexec/docker/docker-init-current --seccomp-profile=/etc/docker/seccomp.json --selinux-enabled --log-driver=journald --signature-verification=false --storage-driver overlay2 --bip=10.0.46.1/24 --ip-masq=true --mtu=1472
root       4320  0.0  0.1 624232 17768 ?        Ssl  Jan21   0:54  \_ /usr/bin/docker-containerd-current -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc --runtime-args --systemd-cgroup=true
root     126702  0.0  0.0 272996  5044 ?        Sl   Jan22   0:00      \_ /usr/bin/docker-containerd-shim-current 3890ac9ba70e6f69231221b3012cf10d342e91832476c14ddb752fbe38cf1058 /var/run/docker/libcontainerd/3890ac9ba70e6f69231221b3012cf10d342e91832476c14ddb752fbe38cf1058 /usr/libexec/docker/docker-runc-current
1001     126736  0.0  0.0   2664   496 ?        Ssl  Jan22   0:00      |   \_ /pod
root     126703  0.0  0.0 272996  5032 ?        Sl   Jan22   0:00      \_ /usr/bin/docker-containerd-shim-current f140bfd9574a996c8464b5851850ec26ad6fc89768c4007e3ca98a23c8255527 /var/run/docker/libcontainerd/f140bfd9574a996c8464b5851850ec26ad6fc89768c4007e3ca98a23c8255527 /usr/libexec/docker/docker-runc-current
1001     126758  0.0  0.0   2664   492 ?        Ssl  Jan22   0:00      |   \_ /pod
root     126827  0.0  0.0 272996  5040 ?        Sl   Jan22   0:00      \_ /usr/bin/docker-containerd-shim-current b8c0319405f802412b47beb01b1a5f2f47e510fd8252aa6019deed0b0e9bee2a /var/run/docker/libcontainerd/b8c0319405f802412b47beb01b1a5f2f47e510fd8252aa6019deed0b0e9bee2a /usr/libexec/docker/docker-runc-current
root     126844  0.0  0.0  31064  2784 ?        Ss   Jan22   0:00      |   \_ nginx: master process nginx -g daemon off;
101      126904  0.0  0.0  31440  1900 ?        S    Jan22   0:00      |       \_ nginx: worker process
root     126851  0.0  0.0 272996  5044 ?        Sl   Jan22   0:00      \_ /usr/bin/docker-containerd-shim-current e20f4ee20823e57811a27bd44a9af06aece40c06590a4239f54f1fa048f1d02d /var/run/docker/libcontainerd/e20f4ee20823e57811a27bd44a9af06aece40c06590a4239f54f1fa048f1d02d /usr/libexec/docker/docker-runc-current
root     126867  0.0  0.0  31064  2784 ?        Ss   Jan22   0:00      |   \_ nginx: master process nginx -g daemon off;
101      126903  0.0  0.0  31440  1656 ?        S    Jan22   0:00      |       \_ nginx: worker process
root     118071  0.0  0.0 264800  2980 ?        Sl   07:26   0:00      \_ /usr/bin/docker-containerd-shim-current e20f4ee20823e57811a27bd44a9af06aece40c06590a4239f54f1fa048f1d02d /var/run/docker/libcontainerd/e20f4ee20823e57811a27bd44a9af06aece40c06590a4239f54f1fa048f1d02d /usr/libexec/docker/docker-runc-current
root     118087  0.0  0.0  17856  2012 pts/3    Ss+  07:26   0:00      |   \_ bash
root      85006  0.0  0.0 264800  2976 ?        Sl   09:52   0:00      \_ /usr/bin/docker-containerd-shim-current b8c0319405f802412b47beb01b1a5f2f47e510fd8252aa6019deed0b0e9bee2a /var/run/docker/libcontainerd/b8c0319405f802412b47beb01b1a5f2f47e510fd8252aa6019deed0b0e9bee2a /usr/libexec/docker/docker-runc-current
root      85020  0.0  0.0  17916  2032 pts/2    Ss+  09:52   0:00      |   \_ bash
root      87110  0.0  0.0 264800  2944 ?        Sl   09:55   0:00      \_ /usr/bin/docker-containerd-shim-current b8c0319405f802412b47beb01b1a5f2f47e510fd8252aa6019deed0b0e9bee2a /var/run/docker/libcontainerd/b8c0319405f802412b47beb01b1a5f2f47e510fd8252aa6019deed0b0e9bee2a /usr/libexec/docker/docker-runc-current
####docker进程是属于host的namespace,合理
root      87124  0.0  0.0  17852  1940 pts/5    Ss   09:55   0:00          \_ bash
root      89532  0.0  0.0  17848  1852 pts/5    S    09:59   0:00              \_ bash  
root      89553  0.0  0.0  17848  1852 pts/5    S+   09:59   0:00                  \_ bash      #此处docker进程执行了多次bash命令
###容器本身占用一套namespace,容器内的进程则属于容器namespace

[root@k8s-node-1 ~]# docker ps
CONTAINER ID        IMAGE                                         COMMAND                  CREATED             STATUS              PORTS               NAMES
e20f4ee20823        nginx:1.7.9                                   "nginx -g 'daemon ..."   14 hours ago        Up 14 hours                             k8s_nginx.ede0df5a_nginx-deployment-2472058307-d8v8v_default_76092c1b-7b21-11ec-9aff-000c29254993_7ed661ce
b8c0319405f8        nginx:1.7.9                                   "nginx -g 'daemon ..."   14 hours ago        Up 14 hours                             k8s_nginx.ede0df5a_nginx-deployment-2472058307-nx2sk_default_7609400f-7b21-11ec-9aff-000c29254993_75488c53
3890ac9ba70e        192.168.1.81:5000/pod-infrastructure:latest   "/pod"                   14 hours ago        Up 14 hours                             k8s_POD.8183e0cd_nginx-deployment-2472058307-d8v8v_default_76092c1b-7b21-11ec-9aff-000c29254993_5eb3e3c9
f140bfd9574a        192.168.1.81:5000/pod-infrastructure:latest   "/pod"                   14 hours ago        Up 14 hours                             k8s_POD.8183e0cd_nginx-deployment-2472058307-nx2sk_default_7609400f-7b21-11ec-9aff-000c29254993_98667b5b

-----------------------------------------------------------------------------------------------------------------------------
/proc目录

/proc/N                         #每一个/proc/N对应一个系统进程
/proc/N/cmdline                 #启动当前进程的完整命令,但僵尸进程目录中的此文件不包含任何信息;
/proc/N/environ                 #当前进程的环境变量列表,彼此间用空字符(NULL)隔开;变量用大写字母表示,其值用小写字母表示;
/proc/N/fd                      #这是个目录,包含当前进程打开的每一个文件的文件描述符(file descriptor),这些文件描述符是指向实际文件的一个符号链接      
/proc/N/mem                     #当前进程所占用的内存空间,由open、read和lseek等系统调用使用,不能被用户读取;            
/proc/N/stat                    #当前进程的状态信息,包含一系统格式化后的数据列,可读性差,通常由ps命令使用;            
/proc/N/status                  #与stat所提供信息类似,但可读性较好       

/proc/N/ns                      #从版本号为 3.8 的内核开始,/proc/[pid]/ns 目录下会包含进程所属的 namespace 信息
/proc/N/net                     #网络相关吧   
/proc/N/net/arp                 #看起来就是arp表            
/proc/N/net/dev                 #显示了一些网卡信息;ifconfig的部分信息           
/proc/N/net/route               #确实是路由表,但是这个十六进制IP是反人类的。。。例如002E000A,按人类的显示应该为0A002E00,即10.0.46.0           
    #所以每个进程都会关联到相应的namespace,都使用相应的路由表

***********************************************       
/proc/sys                       #与 /proc下其它文件的“只读”属性不同的是,管理员可对/proc/sys子目录中的许多文件内容进行修改以更改内核的运行特性,事先可以使用“ls -l”命令查看某文件是否“可写入”。写入操作通常使用类似于“echo  DATA > /path/to/your/filename”的格式进行。需要注意的是,即使文件可写,其一般也不可以使用编辑器进行编辑。 
    个人理解:该目录下的文件对应各个系统参数,可以通过调整该目录下的文件实现系统优化;例如:
        /proc/sys/net/ipv4/ip_forward
        /proc/sys/kernel/msgmnb
        /proc/sys/vm/min_free_kbytes
        /proc/sys/net/core/rmem_default

    /proc/sys目录下各文件参数说明 https://www.cnblogs.com/machangwei-8/p/10354636.html
*********************************************** 
/proc/apm                       #高级电源管理(APM)版本信息及电池相关状态信息,通常由apm命令使用; 
/proc/buddyinfo                 #用于诊断内存碎片问题的相关信息文件; 
/proc/cmdline                   #在启动时传递至内核的相关参数信息,这些信息通常由lilo或grub等启动管理工具进行传递; 
/proc/cpuinfo                   #处理器的相关信息的文件; 
/proc/crypto                    #系统上已安装的内核使用的密码算法及每个算法的详细信息列表; 
/proc/devices                   #系统已经加载的所有块设备和字符设备的信息,包含主设备号和设备组(与主设备号对应的设备类型)名; 
/proc/diskstats                 #每块磁盘设备的磁盘I/O统计信息列表;(内核2.5.69以后的版本支持此功能) 
/proc/dma                       #每个正在使用且注册的ISA DMA通道的信息列表; 
/proc/execdomains               #内核当前支持的执行域(每种操作系统独特“个性”)信息列表; 
/proc/fb                        #帧缓冲设备列表文件,包含帧缓冲设备的设备号和相关驱动信息; 
/proc/filesystems               #当前被内核支持的文件系统类型列表文件,被标示为nodev的文件系统表示不需要块设备的支持;通常mount一个设备时,如果没有指定文件系统类型将通过此文件来决定其所需文件系统的类型; 
/proc/interrupts                #X86或X86_64体系架构系统上每个IRQ相关的中断号列表;多路处理器平台上每个CPU对于每个I/O设备均有自己的中断号; 
/proc/iomem                     #每个物理设备上的记忆体(RAM或者ROM)在系统内存中的映射信息; 
/proc/ioports                   #当前正在使用且已经注册过的与物理设备进行通讯的输入-输出端口范围信息列表;如下面所示,第一列表示注册的I/O端口范围,其后表示相关的设备; 
/proc/kallsyms                  #模块管理工具用来动态链接或绑定可装载模块的符号定义,由内核输出;(内核2.5.71以后的版本支持此功能);通常这个文件中的信息量相当大; 
/proc/kcore                     #系统使用的物理内存,以ELF核心文件(core file)格式存储,其文件大小为已使用的物理内存(RAM)加上4KB;这个文件用来检查内核数据结构的当前状态,因此,通常由GBD通常调试工具使用,但不能使用文件查看命令打开此文件; 
/proc/kmsg                      #此文件用来保存由内核输出的信息,通常由/sbin/klogd或/bin/dmsg等程序使用,不要试图使用查看命令打开此文件; 
/proc/loadavg                   #保存关于CPU和磁盘I/O的负载平均值,其前三列分别表示每1秒钟、每5秒钟及每15秒的负载平均值,类似于uptime命令输出的相关信息;第四列是由斜线隔开的两个数值,前者表示当前正由内核调度的实体(进程和线程)的数目,后者表示系统当前存活的内核调度实体的数目;第五列表示此文件被查看前最近一个由内核创建的进程的PID; 
/proc/locks                     #保存当前由内核锁定的文件的相关信息,包含内核内部的调试数据;每个锁定占据一行,且具有一个惟一的编号;如下输出信息中每行的第二列表示当前锁定使用的锁定类别,POSIX表示目前较新类型的文件锁,由lockf系统调用产生,FLOCK是传统的UNIX文件锁,由flock系统调用产生;第三列也通常由两种类型,ADVISORY表示不允许其他用户锁定此文件,但允许读取,MANDATORY表示此文件锁定期间不允许其他用户任何形式的访问; 
/proc/mdstat                    #保存RAID相关的多块磁盘的当前状态信息,在没有使用RAID机器上,其显示为如下状态: 
/proc/meminfo                   #系统中关于当前内存的利用状况等的信息,常由free命令使用;可以使用文件查看命令直接读取此文件,其内容显示为两列,前者为统计属性,后者为对应的值; 
/proc/mounts                    #在内核2.4.29版本以前,此文件的内容为系统当前挂载的所有文件系统,在2.4.19以后的内核中引进了每个进程使用独立挂载名称空间的方式,此文件则随之变成了指向/proc/self/mounts(每个进程自身挂载名称空间中的所有挂载点列表)文件的符号链接;/proc/self是一个独特的目录,
/proc/modules                   #当前装入内核的所有模块名称列表,可以由lsmod命令使用,也可以直接查看;如下所示,其中第一列表示模块名,第二列表示此模块占用内存空间大小,第三列表示此模块有多少实例被装入,第四列表示此模块依赖于其它哪些模块,第五列表示此模块的装载状态(Live:已经装入;Loading:正在装入;Unloading:正在卸载),第六列表示此模块在内核内存(kernel memory)中的偏移量; 
/proc/partitions                #块设备每个分区的主设备号(major)和次设备号(minor)等信息,同时包括每个分区所包含的块(block)数目(如下面输出中第三列所示); 
/proc/pci                       #内核初始化时发现的所有PCI设备及其配置信息列表,其配置信息多为某PCI设备相关IRQ信息,可读性不高,可以用“/sbin/lspci –vb”命令获得较易理解的相关信息;在2.6内核以后,此文件已为/proc/bus/pci目录及其下的文件代替; 

/proc/slabinfo                  #在内核中频繁使用的对象(如inode、dentry等)都有自己的cache,即slab pool,而/proc/slabinfo文件列出了这些对象相关slap的信息;详情可以参见内核文档中slapinfo的手册页; 
/proc/stat                      #实时追踪自系统上次启动以来的多种统计信息;如下所示,其中, 
    “cpu”行后的八个值分别表示以1/100(jiffies)秒为单位的统计值(包括系统运行于用户模式、低优先级用户模式,运系统模式、空闲模式、I/O等待模式的时间等); 
    “intr”行给出中断的信息,第一个为自系统启动以来,发生的所有的中断的次数;然后每个数对应一个特定的中断自系统启动以来所发生的次数; 
    “ctxt”给出了自系统启动以来CPU发生的上下文交换的次数。 
    “btime”给出了从系统启动到现在为止的时间,单位为秒; 
    “processes (total_forks) 自系统启动以来所创建的任务的个数目; 
    “procs_running”:当前运行队列的任务的数目; 
    “procs_blocked”:当前被阻塞的任务的数目; 
/proc/swaps                     #当前系统上的交换分区及其空间利用信息,如果有多个交换分区的话,则会每个交换分区的信息分别存储于/proc/swap目录中的单独文件中,而其优先级数字越低,被使用到的可能性越大;下面是作者系统中只有一个交换分区时的输出信息; 
/proc/uptime                    #系统上次启动以来的运行时间,如下所示,其第一个数字表示系统运行时间,第二个数字表示系统空闲时间,单位是秒; 
/proc/version                   #当前系统运行的内核版本号,在作者的RHEL5.3上还会显示系统安装的gcc版本,如下所示; 
/proc/vmstat                    #当前系统虚拟内存的多种统计数据,信息量可能会比较大,这因系统而有所不同,可读性较好;下面为作者机器上输出信息的一个片段;(2.6以后的内核支持此文件) 
/proc/zoneinfo                  #内存区域(zone)的详细信息列表,信息量较大,下面列出的是一个输出片段: 




参考文章:
    查看有哪些namespace_Linux操作系统中的namespace是个什么鬼    https://blog.csdn.net/weixin_39735166/article/details/113578883
    深入理解linux系统下proc文件系统内容  https://www.cnblogs.com/lidabo/p/5628020.html
进程与namespace;宿主机容器进程与容器内进程;/proc目录(20220123更新)
复制代码

 

文件的增删查

复制代码
tree、file、stat
======================================================================================
tree    以树形结构显示目录和文件
    -L levle指定显示层数
    -d 只显示目录
    -P pattern 只像是由pattern匹配到的路径

file命令用于辨识文件类型,然后使用适当的打开命令or应用程序使用
-b  列出辨识结果时,不显示文件名称。
-f<名称文件>  指定名称文件,其内容有一个或多个文件名称时,让file依序辨识这些文件,格式为每列一个文件名称。
-c  详细显示指令执行过程,便于排错或分析程序执行的情形。
-L  直接显示软链接所指向的文件的类别。
-m<魔法数字文件>  指定魔法数字文件。
-v  显示版本信息。
-z  尝试去解读压缩文件的内容。
[文件或目录...] 要确定类型的文件列表,多个文件之间使用空格分开,可以使用shell通配符匹配多个文件。


stat  查看文件属性及3种time
    -c获取指定文件属性的一部分
        %A显示字符权限
        [root@yefeng28325 ~]# stat 123.txt      
        [root@yefeng28325 ~]# stat -c %A 123.txt        
        [root@yefeng28325 ~]# stat -c %a 123.txt
tree、file、stat
复制代码
复制代码
目录、文件的新增、复制、删除、移动、改名:mkdir、rmdir、rm、mv、rename、touch、cp、shred(粉碎文件)
======================================================================================
mkdir   创建目录
    -p 递归创建目录
    -v 显示详细信息
    -m MODE 创建目录时直接指定权限

-----------------------------------------------------------------
rmdir   删除空目录(几乎没有,使用rm命令替代)
    
-----------------------------------------------------------------
rm 删除文件or目录
    -f 强制删除
    -r 递归删除
    -i 是否确认
    
-----------------------------------------------------------------
mv 移动文件or目录or改名
    -i 是否确认
    -f 强制
    
-----------------------------------------------------------------
rename命令用字符串替换的方式批量改变文件名
    
-----------------------------------------------------------------
touch命令用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件。
    touch命令默认刷新3个时间,access time、modify time、change time
    -a 改变档案的读取时间记录。仅修改access time和change time
    -m 改变档案的修改时间记录。仅修改modify time和change time
    -t 设定档案的时间记录,格式与 date 指令相同。
    -c 假如目的档案不存在,不会建立新的档案。与 --no-create 的效果一样。
    --no-create 不会建立新档案。
    --help 列出指令格式。
    --version 列出版本讯息。
    -f 不使用,是为了与其他 unix 系统的相容性而保留。
    -r 使用参考档的时间记录,与 --file 的效果一样。
    -d 设定时间与日期,可以使用各种不同的格式。
    
-----------------------------------------------------------------
cp命令主要用于复制文件或目录。
    -a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合。
    -p:除复制文件的内容外,还把修改时间和访问权限也复制到新文件中。等同--preserv=mode,ownership,timestamp
    -d:复制时保留链接。这里所说的链接相当于Windows系统中的快捷方式。
    -f:覆盖已经存在的目标文件而不给出提示。(先删除文件再复制,文件属性也发生变化!)
    -i:与-f选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答"y"时目标文件将被覆盖。
    -r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。
    -l:不复制文件,只是生成链接文件。
    -u:--update 只复制源比目标更新的文件or目标不存在的文件
    --backup=numbered  目标存在,覆盖前先备份加数字后缀
cp用法:
    cp 源文件 目标文件
    cp -t 目标目录 源文件

    
-----------------------------------------------------------------
shred安全删除文件
shred是一条终端命令,功能是重复覆盖文件,使得即使是昂贵的硬件探测仪器也难以将数据复原。这条命令的功能足够适合实现文件粉碎的功效。
参数:
    -z   删除后用0覆盖block
    -v  查看过程
    -n  用0或随机数覆盖n次
    -u   覆盖后删除该文件
示例:
    shred test.txt 
    shred test1.txt test2.txt
    shred –u test.txt
目录、文件的新增、复制、删除、移动、改名:mkdir、rmdir、rm、mv、rename、touch、cp、shred(粉碎文件)
复制代码
复制代码
文件删除原理---文件删除,但空间没释放的案例

1.通过lsof命令找到已经删除,但是未释放空间的文件
    lsof |grep deleted
2.方法一:杀死相应进程
方法二: >重定向清空该文件(这种方法更好)
文件删除原理---文件删除,但空间没释放的案例
复制代码
复制代码
硬链接与软链接;ln命令、readlink命令;查看软连接指向的文件
======================================================================================
硬链接
    创建硬链接会增加额外的记录项以引用文件
    对应于同一文件系统上一个物理文件
    每个目录引用相同的inode号
    创建时链接数递增
    rm命令递减技术的链接
    文件要存在,至少有一个硬链接
    当硬链接为0,该文件被删除
    不能跨驱动器or分区

    硬链接知识点详见文件属性:https://www.cnblogs.com/AllenWoo/p/14878962.html
-----------------------------------
软链接(符号链接)
    一个软链接指向另一个文件
    ls -l 显示软链接的名称和引用的文件
    一个软链接的内容是他引用文件的名称
    可以对目录进行
    可以跨分区
    指向的是另一个文件的路径;其大小为指向的路径字符串的长度;不增加or减少目标文件inode的引用计数

部署软件使用软连接
软链接也有利于兼容性
例如linux版本升级,部分文件已经移位,这时可以使用软连接,保证老软件还可以正常使用
----------------------------------------------------------------------------
ln命令   创建链接
创建的文件夹默认就有2个硬链接,1个是文件名,另一个是文件夹内的.
增加目录的硬链接数,在该目录下创建目录,该二级目录下的..就是新的硬链接
    注意:不支持对目录手工创建硬链接,但是可以对目录创建软链接

ln *****在两个文件之前创建链接,默认创建硬链接(不能为目录创建硬链接)
    -s soft创建软链接(相当于windows的快捷方式)
    建议创建软链接使用相对路径,但是要注意相对路径的写法

----------------------------------------------------------------------------
查看软连接指向的文件
ll file_link
readlink file_link
硬链接与软链接;ln命令、readlink命令;查看软连接指向的文件
复制代码

文件属性

复制代码
ls -lhi 命令展示的文件属性说明
[root@yefeng28325 ~]# ls -lhi /
total 68K
1835009 drwxr-xr-x   3 root root 4.0K Dec  4 13:36 app
     17 lrwxrwxrwx.  1 root root    7 Jul 11  2019 bin -> usr/bin
1048578 dr-xr-xr-x.  5 root root 4.0K Jul 11  2019 boot
      3 drwxr-xr-x  19 root root 3.0K Dec  8 15:23 dev
 393217 drwxr-xr-x. 81 root root 4.0K Dec 27 09:09 etc
 655362 drwxr-xr-x.  7 root root 4.0K Dec 19 09:36 home
     13 lrwxrwxrwx.  1 root root    7 Jul 11  2019 lib -> usr/lib
     15 lrwxrwxrwx.  1 root root    9 Jul 11  2019 lib64 -> usr/lib64
     11 drwx------.  2 root root  16K Jul 11  2019 lost+found
 786434 drwxr-xr-x.  2 root root 4.0K Apr 11  2018 media
 917506 drwxr-xr-x.  2 root root 4.0K Apr 11  2018 mnt
1310721 drwxr-xr-x   3 root root 4.0K Nov 27 22:25 oldboy
1179651 drwxr-xr-x.  3 root root 4.0K Dec 25 10:24 opt
      1 dr-xr-xr-x  85 root root    0 Dec  8 15:20 proc
 917505 dr-xr-x---.  8 root root 4.0K Dec 27 09:10 root
   7087 drwxr-xr-x  26 root root  820 Dec 23 20:53 run
     16 lrwxrwxrwx.  1 root root    8 Jul 11  2019 sbin -> usr/sbin
1179652 drwxr-xr-x.  2 root root 4.0K Apr 11  2018 srv
      1 dr-xr-xr-x  13 root root    0 Dec 12 20:47 sys
1179649 drwxrwxrwt.  8 root root 4.0K Jan  4 03:13 tmp
 262146 drwxr-xr-x. 13 root root 4.0K Jul 11  2019 usr
 131073 drwxr-xr-x. 19 root root 4.0K Jul 11  2019 var

共10列
第一列: inode索引节点编号;系统读取文件时首先通过文件名找到inode号码,然后才能读取到文件内容。
第二列: 文件类型及权限。这一列共11个字符,其中第一个字符为文件类型;随后的9个字符为文件的对应权限;最后一个字符点号“.”是和selinux有关的一个标识;
第三列: 硬连接数
第四列: 属主:文件的拥有者,用户
第五列: 属组:文件属于的组,用户组
第六列: 数据大小
第七列: 月份
第八列: 日
第九列: 时间
第十列: 文件名
ls -lhi 命令展示的文件属性说明
复制代码
复制代码
索引节点
=======================================================================================
索引节点是文件在系统中的唯一标识,找一个文件最终都要通过索引节点才能找到。

硬盘格式化:使用文件系统(ext4、xfs等)格式化磁盘分区后,磁盘分区生成了inode和block【详细的可以到文件系统进行了解】。
inode存放的数据是文件的属性(大小、时间、用户和组、权限等)同时存放指向block的指针;inode在一个分区内是唯一的。
block存放的是文件内容:目录的block存放的是文件名,文件的block存放的是数据内容。
    inode和block是在磁盘格式化时生成的,是不能跨分区关联的!

一个文件在磁盘上可以分为2部分:inode+block;
    我的理解也可以分为3部分(不正规的说法):文件名+inode+block(文件名即上一级目录的block内容)
    一个非空文件占用一个inode和n个block
    软链接是特殊的,只有inode,没有block!

一个node最多12个直接指针;
一般block单位为4k,即一个blokc大小4KB(4096bytes);一个指针大小4bytes;所以当block用于储存指针时,最多可以储存1024个指针
即直接块指针指向的数据最大为4KB
间接块指针指向的数据最大为1024*4KB=4MB
双重间接块指针指向的数据最大为1024*1024*4KB=4GB
三重间接块指针指向的数据最大为1024*1024*1024*4KB=4TB
-------------------------------------------
磁盘满原因有两种:
    1、inode满了:df -i  #查看inode使用情况
    2、block满了:df -h  #查看block使用情况

[root@oldboyedu /]# df -i 看inode数量
Filesystem      Inodes IUsed   IFree IUse% Mounted on
/dev/sda3      9960960 72199 9888761    1% /
devtmpfs        250820   375  250445    1% /dev
tmpfs           253514     1  253513    1% /dev/shm
tmpfs           253514   693  252821    1% /run
tmpfs           253514    16  253498    1% /sys/fs/cgroup
/dev/sda1       131072   332  130740    1% /boot
tmpfs           253514     1  253513    1% /run/user/0
[root@oldboyedu /]# df -h 看block数量
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        19G  1.9G   18G  10% /
devtmpfs        980M     0  980M   0% /dev
tmpfs           991M     0  991M   0% /dev/shm
tmpfs           991M   18M  973M   2% /run
tmpfs           991M     0  991M   0% /sys/fs/cgroup
/dev/sda1       253M  136M  118M  54% /boot
tmpfs           199M     0  199M   0% /run/user/0
索引节点
复制代码
复制代码
文件类型、文件权限、selinux
================================================================================================================================
文件类型
linux中一切皆文件。Windows用扩展名区分文件;Linux里有自己的文件类型,Linux的里扩展名兼容windows方便区分文件。

    '-'普通文件;'d'目录文件;'l'软链接;'c'字符设备;'b'块设备;'s'socket文件。

1.'-'开头 *****普通文件(regular file),包含文本、二进制文件、数据文件等
    三种类型:
        a.纯文本文件:字符数字等内容
        b.数据文件:存放命令收集的信息。
        c.二进制文件:可执行的命令。
    [root@oldboyedu ~]# file d.txt 
    d.txt: ASCII text
    [root@oldboyedu ~]# file /var/log/lastlog 
    /var/log/lastlog: data
    [root@oldboyedu ~]# file /bin/cat
    /bin/cat: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=8ac8b57ae50762a4a0480486839107e87b3c284d, stripped

2.'d'开头 *****目录(directory)
    ls命令如何区分文件类型为directory:
        a.开头为d
        b.颜色为蓝色
        c.ls -p,目录结尾加斜线,斜线结尾
        d.ls -F,不同文件结果加不同标识,目录结果加'/'

3.'l'开头,*****符号链接(symbolic link)文件,软链接(soft link)
    ln -s  #创建软链接

4.字符(character)/块(block)设备文件
    'c'开头的就是字符设备,猫等串口设备
    'b'开头的就是块设备 硬盘、光驱等都属于块设备
    mknod olboy c 5 1 #创建字符设备
    mknod oldboy b b 5 1 #创建块设备

5.'s'开头,套接口(socket)文件
    .sock文件也是一类特殊的文件,这类文件通常用在网络之间,进行数据连接,如:我们可以启动一个程序来监听客户端的请求,客户端可以通过套接字来进行数据通信。
    用于进程之间通信的文件。

    [root@oldboyedu ~]# which cp
    alias cp='cp -i'
        /usr/bin/cp
    [root@oldboyedu ~]# which ls
    alias ls='ls --color=auto'
        /usr/bin/ls
    [root@oldboyedu ~]# which ip
    /usr/sbin/ip

---------------------------------------------------------------------------------------------------------------
文件权限详见用户管理
---------------------------------------------------------------------------------------------------------------
selinux:即结尾的'.', 是标识selinux的符号

selinux是一套让Linux系统更安全的规则。这个规则太严格了,一般的情况下都会关闭selinux(在生产环境中,90%是要被关掉的)。
    关闭selinux后,通过开启防火墙or用其他手段来实现同样的安全目的。


[root@oldboyedu ~]# getenforce      #查看当前selinux
[root@oldboyedu ~]# setenforce      
usage:  setenforce [ Enforcing | Permissive | 1 | 0 ]
[root@oldboyedu ~]# setenforce 0    #临时关闭当前selinux
[root@oldboyedu ~]# getenforce 
Permissive

永久关闭:
    vim /etc/selinux/config      #永久关闭当前selinux
    [root@oldboyedu ~]# grep dis /etc/selinux/config
    #     disabled - No SELinux policy is loaded.

    SELINUX=disabled
文件类型、文件权限、selinux
复制代码
复制代码
硬链接、属主属组、日期
================================================================================================================================
硬链接:具有相同inode节点号的文件互为硬链接。一个文件的多个入口。
    访问一个文件必须通过inode,当一个文件的硬链接为0时,即进入该文件的入口,将无法访问该文件

作用及特点:
    1.备份,防止误删。
    2.不支持人工创建目录硬链接。
    3.软链接:本质是快捷方式,指向源文件实体,本身和源文件是不同的文件。
        软链接有独立的inode,但是无block。
    4.没有跨分区的mv,只是移动硬链接,那么inode、block无变化;跨分区mv 应该就是复制,再删除了吧
    5.cp和mv还是不一样的,因为是复制成一份新的独立的数据,所以复制后的inode、block都是新的
        文件的存储是以block为单位的,block的大小可以设置;
        一个大型文件必然将数据储存在N多block中,那么读取该文件意味着要进行N多次的IO;显然block设置更大,那么N就越小,这意味着读取文件速度更快。
        反过来,若block设置过大,那么一个小文件将会占用更多空间,造成浪费
    6.indoe与block是不会跨磁盘链接的!
    7.软链接是可以跨磁盘链接的

工作中为什么会使用软链接。
第一个用途:文件的使用者可以根据软链接连接到该文件,即使该文件已经发生了变化
    半年前:/application/nginx-1.10===>/application/nginx(让开发用)
    当前:  /application/nginx-1.20===>/application/nginx(让开发用) (开发使用无感知or交接更顺利)

第二个用途:例如当前/etc/对应的分区要满了,没法放很多文件,但是程序还想通过/etc/目录访问文件。
    此时,我们可以把文件放入/opt/oldboy下,然后做一个到/etc/oldboy的软链接。

------------------------------------------------------------------------------------
属主属组
详见linux用户系统
特殊情况:当用户被删除,该用户创建的文件属主变成了uid;group被删除,情况相同,相应的组ID变为数字

------------------------------------------------------------------------------------
日期(文件修改时间)
文件时间有三种:(ll显示的是modify时间)
    访问时间:access,文件内容被访问过的时间,例如cat命令;
    修改时间:modify,文件内容被改过之后的时间,例如vim、touch命令。
    变化时间:change,文件属性发生改变的时间,例如chmod命令。

        [root@yefeng28325 ~]# touch 123.txt      #新增一个文件
        [root@yefeng28325 ~]# stat 123.txt       #查看文件的状态
        File: ‘123.txt’
        Size: 0               Blocks: 0          IO Block: 4096   regular empty file
        Device: fd01h/64769d    Inode: 917526      Links: 1
        Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
        Access: 2020-12-10 09:46:21.625917826 +0800   #文件内容被访问过的时间
        Modify: 2020-12-10 09:46:21.625917826 +0800   #文件内容被改过之后的时间。
        Change: 2020-12-10 09:46:21.625917826 +0800   #文件属性发生改变的时间
        Birth: -
        [root@yefeng28325 ~]# cat 123.txt        #查看文件内容,Access时间发生变化
        [root@yefeng28325 ~]# echo test123 >> 123.txt    #修改文件内容,Modify、Change时间都发生变化
        [root@yefeng28325 ~]# chmod +x 123.txt     #修改文件权限,Change时间发生变化
        [root@yefeng28325 ~]# chmod 644 123.txt    #果然是可以这样操作的,改变文件权限

        [root@yefeng28325 ~]# stat -c %A 123.txt    #这命令感觉没什么用嘛
        -rw-r--r--
硬链接、属主属组、日期
复制代码

 查找文件

复制代码
locate、which、whereis、gnome
===========================================================================
locate  查看文件及帮助相关,查询系统上预建的文件索引数据库/var/lib/mlocate/mlocate.db(该命令centos7默认不安装)
    索引数据库会自动构建(周期性任务),管理员手动更新数据库(命令updatedb)
    -i      不区分大小写的搜索
    -n numer    只列举前N个匹配项目
    -r      使用正则
    使用示例:
        locate keyword
        locate -r '\.conf$'
        locate -n 3 passwd
------------------------------------------------------------------------------
which *****查命令所在的路径    #可以深入一下几个查找命令的不同之处
whereis 查找命令、源码、帮助等路径   (这条命令不重要)
    -b 查二进制命令

    which、whereis的查询范围都是$PATH,区别在于which只查找二进制文件,等价于whereis -b;而wheris会查找出其他类型
    locate的查询范围则是update对应的数据库
------------------------------------------------------------------------------
gnome 图形化界面搜索工具
locate、which、whereis、gnome
复制代码

 

复制代码
find命令(处理动作、排除目录、多个查找条件、指定搜索层级)
------------------------------------------------------------------------------
find *****查找目录下的文件(磁盘遍历,速度慢,精确查找,只搜索用户有权限的目录)
    find [OPTION]... [查找路径] [查找条件] [处理动作]
    处理动作:
        -print:默认的处理动作,显示至屏幕
        -ls:类似于对查找到的文件执行'ls -l'命令
        -delete:删除查找到的文件
        -fls file:查找到的所有文件的长葛市信息保存至指定文件中
            find -perm /222 -ls > /root/find.log
            find -perm /222 -fls  /root/find.log  #这2条命令等效
        -ok COMMAND {} \;    对查找到的每个文件执行由COMMADN指定的命令,对于每个文件执行命令之前,都会交互式要求用户确认
        -exec COMMAND {} \;    对查找到的每个文件执行由COMMADN指定的命令,(与-ok...的区别在于不进行确认)
            {}表示引用查找到的文件名称自身,
        注意:find查找到的文件是一次性传递给后面的命令的。
            find /mnt -name "f*" -exec mv {} {}.bak \;  #批量改名
    排除目录:-prune  
        示例:
            find /etc/ -path "/etc/sane.d" -a -prune -o -name "*.conf"      #在目录/etc/下进行搜索,搜索不在目录"/etc/sane.d"下的"*.conf"文件
            find /etc \(-path '/etc/sane.d -o -path '/etc/fonts' \)-a prune -o  -name "*.conf"
    查找条件:
        -a 与关系(默认)
        -o 或关系(默认查询多个条件的交集,-o则是查询并集,满足条件之一即可)
        not,! 非
        德.摩根定律:
            (非A)或(非B)=非(A且B)
            (非A)且(非B)=非(A或B)
    指定搜索层级:
        -maxdepth level 最大搜索目录深度,指定目录为第一级
        -mindepth level 最小搜索目录深度
find命令(处理动作、排除目录、多个查找条件、指定搜索层级)
复制代码
复制代码
find命令(根据文件名和inode查找、根据文件类型查找、根据文件大小来查找)
------------------------------------------------------------------------------
    根据文件名和inode查找:
        -name "文件名称"    支持使用glob通配符 *?[][^]
        -iname "文件名称"   不区分字母大小写
        -inum n            根据inode号查找
        -samefile name     相同inode号的文件
        -links n           链接数为n的文件
        -regex "PATTERN"   以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称
    
        用法示例:
            find /etc/ -maxdepth 2 -name passwd     #指定最大搜索目录深度为2,文件名称精确匹配为passwd(要实现模糊匹配,则添加通配符)
            find /etc/ -maxdepth 3 -mindepth 2 -name -f1
            find -links 2                           #在当前目录下,查找硬链接为2的文件
            find /etc/ -regex ".*\.conf$"           #使用正则进行匹配,注意匹配的是整个文件路径,而不是文件名称


    根据文件类型查找
        -type  按类型查找(f普通文件,d目录文件,l符号链接文件,s套接字文件,b块设备文件,c字符设备文件,p管道文件)
        -empty  查找空文件or目录
        find /app -type d -empty
    根据文件大小来查找:
        -size [+|-]number unit #常用单位:k,M,G,c(byte)
            number unit:(number-1,number],例如:-size 6k表示(5k,6k],即大于5k,小于等于6k
            -number unit:[0,number-1],例如:-size -6k表示[0,5k],即大于等于0,小于等于5k
            +number unit:(number,无穷大),例如-size +6k表示(6k,无穷大),即大于6k
            注意:一样的数值,单位不同,则意义不同!
            find /data -size 1024c      #size大于1023c,小于等于1024c
            find /data -size 1k         #size大于0k,小于等于1k
find命令(根据文件名和inode查找、根据文件类型查找、根据文件大小来查找)
复制代码
复制代码
find命令(根据属主、属组查找、根据时间戳查找、根据权限查找)
------------------------------------------------------------------------------
    根据属主、属组查找:
        -user USERNAME      查找属主为指定用户的文件
        -group GROUPNAME    查找属组为指定组的文件
        -uid UID            查找属主为指定用户UID的文件
        -gid GID            查找属组为指定用户组GID的文件
        -nouser             查找没有属主的文件
        -nogroup            查找没有属组的文件

        用法示例:
            find /home -user username           #在/home目录下根据用户名进行查找
            find /home -user username -ls       #功能同上,但展示效果不同,展示效果类似ls -l
    根据时间戳查找:
        以“天”为单位
            -atime [+|-]number (number,-number,+number意义类似于按文件大小查找中的意义)
            -mtime [+|-]number
            -ctime [+|-]number
        以“分钟”为单位:
            -amin [+|-]number
            -mmin [+|-]number
            -cmin [+|-]number
    根据权限查找:
        -perm [/|-] MODE
            MODE:精确权限匹配
            /MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系(以前为+,从centos7开始淘汰)
            -MODE:每一类对象都必须同时拥有指定权限,与关系
            0表示不关注
        示例:
            find -perm 666      #精确匹配,u=6,g=6,o=6
            find -perm /666     #任意匹配,u,g,o任一匹配即可
            find -perm -222     #要求必须都有写权限;即只关心写权限,其他权限不关心;即权限3,7,2,6都能被匹配
            find -perm -002     #即只关心other的写权限,只要文件对应的other有写权限,就能被匹配
find命令(根据属主、属组查找、根据时间戳查找、根据权限查找)
复制代码

atime : 它代表着最近一次访问文件的时间,显示一个文件的内容或者运行一个shell脚本会更新文件的atime。
mtime : 它代表着最近一次文件内容被修改的时间。可用ls -l 命令查看。
ctime : 它代表着最近一次文件状态改变的时间 ,是status change time,是在写入文件、更改所有者、权限或链接设置时随 Inode 的内容更改而更改,即文件状态最后一次被改变的时间。

-mtime n : n为数字,意思为在n天之前的“一天之内”被更改过内容的文件
-mtime +n : 列出在n天之前(不含n天本身)被更改过内容的文件名
-mtime -n : 列出在n天之内(含n天本身)被更改过内容的文件名
--------------------------------------------------
find . -name "*.*" -exec ls {} \;

文件打包压缩

复制代码
压缩工具(只能压缩,不具备打包功能):file-roller、compress、gzip、bzip2、xz
==============================================================================================
压缩命令(只压缩,不具备打包功能!不能对目录进行压缩!)
几个压缩命令的用法几乎一致,区别只是命令不同
file-roller   图形化界面的压缩工具
----------------------------------------------------------------------------------------
compress命令  压缩为".Z"文件(古老的压缩命令,基本不用)
    compress file1              #将文件file1压缩为file1.Z,默认会删除原文件
    compress -c file1 >file1.Z  #-c 不删除原文件,输出结果到标准输出;所以此处用file1.Z接收
    解压缩有3种方式:
        1.compress -d file1.Z
        2.uncompress file1.Z
        2.zcat file1.Z > file1
----------------------------------------------------------------------------------------
gzip是个使用广泛的压缩程序,文件经它压缩过后,其名称后面会多出".gz"的扩展名。(压缩软件用这个最多)
    -c或--stdout或--to-stdout  把压缩后的文件输出到标准输出设备,不去更动原始文件。
    -d或--decompress或----uncompress  解开压缩文件。

    gzip file1                  #将文件file1压缩为file1.gz,默认会删除原文件
    gzip -9 file1               #指定压缩比,默认是6
    gzip -c file1 >file1.gz 
    解压也有3种方式:(与compress类似)
        1.compress -d file1.gz
        2.gunzip file1.gz
        3.zcat file1.gz > file1
----------------------------------------------------------------------------------------
bzip2采用新的压缩演算法,bzip2压缩完文件后会产生".bz2"的压缩文件,并删除原始的文件。
    bzip2 file1                  #将文件file1压缩为file1.bz2,默认会删除原文件
    解压也有3种方式:(与compress类似)
        1.bzip2 -d file1.bz2
        2.bunzip2 file1.bz2
        3.bzcat file1.bz2  >file1
----------------------------------------------------------------------------------------
xz命令相对是最新的,压缩完后产生".xz"的压缩文件,并删除原始的文件。
    xz file1                  #将文件file1压缩为file1.xz,默认会删除原文件
    xz -k file1               #对比其他几个压缩命令增加了-k,将会保留原文件
    xz f1 f2 f3               #可以对多个文件进行操作,但是产生的是3个压缩文件,而不是1个!
    解压也有3种方式:(与compress类似)
        1.xz -d file1 
        2.unxz file1.xz
        3.xzcat file1.xz >file1
压缩工具(只能压缩,不具备打包功能):file-roller、compress、gzip、bzip2、xz
复制代码
复制代码
打包压缩工具:zip、tar、cpio
==============================================================================================
zip 是个使用广泛的压缩程序,压缩后的文件后缀名为“.zip”。(windows系统默认就支持zip格式)
zip [-options] [-b path] [-t mmddyyyy] [-n suffixes] [zipfile list] [-xi list]
    -r 递归处理,将指定目录下的所有文件和子目录一并处理。
    -o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该文件相同。
    -d 从压缩文件内删除指定的文件。
    -m 将文件压缩并加入压缩文件后,删除原始文件,即把文件移到压缩文件中。

用法:
    打包时要注意路径,使用绝对路径时,解压可能也直接解压到绝对路径!!!!!!!!!!!
    zip newname.zip file            #将文件打包压缩进指定文件内
    zip newname.zip directory       #打包目录时要注意添加-r,否则只打包了目录,而不打包里面的文件!
    zip -r newname.zip directory    #打包目录时要注意添加-r
    unzip -l filename.zip           #预览压缩包内的文件
    unzip -v filename.zip           #预览被压缩文件的详细信息
    unzip filename.zip              #默认解压到当前路径
    unzip -o -d /home/sunny myfile.zip      #把myfile.zip文件解压到 /home/sunny/
        -o:不提示的情况下覆盖文件;
        -d:-d /home/sunny指明将文件解压缩到/home/sunny目录下。

    zip -d myfile.zip smart.txt         #删除压缩文件中smart.txt文件
    zip -m myfile.zip ./rpm_info.txt    #向压缩文件中myfile.zip中添加rpm_info.txt文件。

    cat /var/log/messages | zip messages - #-指代管道重定向的标准输入内容;看起来只是进行了文件压缩嘛
    unzip -p messages > message            #解压缩,与上面的压缩相对应

----------------------------------------------------------------------------------------
tar    打包压缩命令,(Tape ARchive磁带归档)
tar参数:
    -z或--gzip或--ungzip 通过gzip指令处理备份文件。
    -j bzip2压缩
    -J XZ压缩
    -c或--create 建立新的备份文件
    -v或--verbose 显示指令执行过程。
    -f<备份文件>或--file=<备份文件> 指定备份文件。
    -t或--list 列出备份文件的内容。
    -C 指定解压的路径
    -x或--extract或--get 从备份文件中还原文件。
    -h 跟随软链接(打包的文件中若有软链接,加上h之后会打包其原文件)
    -p或--same-permissions 用原来的文件权限还原文件。
    --exclude 排除不打包的命令(在命令行指定不打包的文件)
        tag zcvf oldboy.tar.gz ./* --exclude=3.txt --exclude=4.txt
        tar zcvf oldboy.tar.gz ./* --exclude={4,5}.txt
    -X 从文件中排除不打包的文件(在文本中指定不打包的文件)

打包压缩:
    tar zcvf name.tar.gz dir/       #常用的打包压缩命令;'-'在tar中不是必须的
    tar -zcvf name.tar.gz dir/      #-z gzip压缩,格式.gz
    tar cvf name.tar.gz dir/        #只打包,不压缩

    tar -jcvf name.tar.bz2 dir/     #-j bzip2压缩,格式.bz2
    tar -Jcvf name.tar.xz dir/      #-J XZ压缩,格式.xz

    tar zcvfX name.tar.gz paichu.txt ./*    #被排除的文件记录在paichu.txt中
    tag zcvf name.tar.gz ./* --exclude=3.txt --exclude=4.txt    #被排查的文件在命令行中指定
    tar zcvf name.tar.gz ./* --exclude={4,5}.txt                #被排查的文件在命令行中指定
预览压缩包:
    tar tf name.tar.xx              #预览压缩包内的文件
    tar tvf name.tar.xx             #详细预览
解压缩:
    tar xvf name.tar.xx                #解压缩不需要关心什么压缩算法,自动识别;默认解压到当前路径
    tar xvfC name.tar.xx dest_dir/     #-C 指定解压的路径
----------------------------------------------------------------------------------------
cpio 是用来建立,还原备份档的工具程序,它可以加入、解开 cpio 或 tar 备份档内的文件。
cpio命令是通过重定向的方式将文件进行打包备份,还原恢复的工具。
    -o或--create  执行copy-out模式,建立备份档。
    -i或--extract  执行copy-in模式,还原备份档。
    -t或--list  将输入的内容呈现出来。
    -v或--verbose  详细显示指令的执行过程。
    -d或--make-directories  如有需要cpio会自行建立目录。
    -c  使用旧ASCII备份格式。

    find ./etc -print | cpio -ov >etc.cpio      #将etc目录备份
    cpio -tv < etc.cpio                         #内容预览
    cpio -idv < etc.cpio                        #解包文件
打包压缩工具:zip、tar、cpio
复制代码
复制代码
文件切割工具:split
==============================================================================================
split命令用于将一个文件分割成数个。
    -<行数> : 指定每多少行切成一个小文件
    -b<字节> : 指定每多少字节切成一个小文件
    --help : 在线帮助
    --version : 显示版本信息
    -C<字节> : 与参数"-b"相似,但是在切 割时将尽量维持每行的完整性

    split -b 1M file.tar.gz a.tar     #将目标文件按1M大小进行切割,生成的新文件命名为a.tar+英文字母
    split -b 1M -d file.tar.gz a.tar     #-d新文件名为a.tar+数字

    cat a.gz* > a.tar.gz            #合并被分割的压缩包
    tar xf a.tar.gz                 #解压压缩包,数据确认被还原
文件切割工具:split
复制代码

 

tar --dereference -cpzf - ../test | ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@20.0.0.22 tar -C /root/test2 -xpzf -
tar --dereference -cpzf - ../test | ssh root@20.0.0.22 tar -C /root/test2 -xpzf - #果然,这个命令就是压缩再传递的。。。
#tar xpvf - #这里的 - 符号,既代表从标准输入读取资料。

 

 

 

 

11111111111111111111

posted @   雲淡風輕333  阅读(113)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示