linux目錄結構說明
談到Linux文件管理,首先我們需要了解的是要對文件做些什么事情,其實無非就是對一個文件進行創建、復制、移動、查看、編輯、壓縮、查找、刪除等等。
例如我們想要修改系統的主機名稱,首先需要知道該文件存儲在哪個目錄,才能做相應的修改,因此需要先了解Linux系統的目錄結構,搞清楚每個目錄存放的是什么文件,有什么的作用。
幾乎所有的計算機操作系統都是使用目錄結構組織文件。具體來說就是在一個目錄中存放子目錄和文件,而在子目錄中又會存放子子目錄和文件,以此類推形成一個樹狀的文件結構。由于其結構很像一棵樹的分支,因此該結構又被稱為目錄樹。
windows系統是以多根的方式組織文件,例如C:表示C盤,D:表示D盤,也就是以每個盤符作為一個根。

Linux系統是以單根的方式組織文件,使用/表示
如下圖所示是centos7的目錄結構,在管理文件之前需要先搞清楚根目錄下的一級子目錄的作用

可以使用tree -L 1 /命令查看根目錄下的一級子目錄

[root@centos7-1 ~]# tree -L 1 /
/
├── bin -> usr/bin
├── boot
├── data
├── dev
├── etc
├── home
├── lib -> usr/lib
├── lib64 -> usr/lib64
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var
如果執行命令時發現系統提示command nout found,可以使用yum install -y tree 來安裝tree命令
[root@centos7-1 ~]# yum install -y tree
CentOS7系統中,/bin、/sbin、/lib、/lib64都是以軟連接的方式鏈接到/usr目錄下,軟連接就是Windows下的快捷方式。
- /bin -->/usr/bin
- /sbin–>/usr/sbin
- /lib -> usr/lib
- /lib64 -> usr/lib64
Linux根目錄下的幾個你需要里了解的根目錄下的一級子目錄
- /media 便攜式移動設備掛載點,例如U盤
- /mnt 臨時文件系統掛載點
- /opt 目錄用于存放第三方應用程序的安裝位置
- /run目錄用于存放系統運行時所需要的文件,以前是放在/var/run目錄下
- srv 服務啟動后需要訪問的數據目錄,例如saltstack就會將數據放到該目錄下
- sys和proc一樣,記錄的是系統的核心硬件信息
Linux目錄結構-/bin和/sbin目錄
/bin目錄和/sbin目錄都是用于存放命令的目錄,命令的本質就是一個應用程序。
- /bin 存放普通用戶使用的命令 ,例如/bin/ls和/bin/date等等
當我們在終端執行ls或者是date命令時,系統會從/bin目錄下查找命令對應的可執行程序我們可以使用which命令查看命令的路徑
[root@centos7-1 ~]# which ls
alias ls='ls --color=auto'
/usr/bin/ls
不過/bin目錄實際上是一個快捷方式,指向/usr/bin目錄
[root@centos7-1 ~]# ll /bin
lrwxrwxrwx. 1 root root 7 Oct 2 20:55 /bin -> usr/bin
也就是說/bin目錄和/usr/bin目錄內容是一樣的
- /sbin目錄存放管理員執行的命令,例如/sbin/reboot ,/sbin/shutdown,/sbin/useradd等等
[root@centos8 ~]# which shutdown
/usr/sbin/shutdown
[root@centos8 ~]# which reboot
/usr/sbin/reboot
/sbin目錄也是一個軟連接,指向的是/usr/sbin目錄
[root@centos7-1 ~]# ll /sbin
lrwxrwxrwx. 1 root root 8 Oct 2 20:55 /sbin -> usr/sbin
Linux目錄結構-/home和/root目錄
/home和/root用于存放用戶相關數據的家目錄
- /home表示普通用戶的家目錄,例如/home/guanglei,guanglei是我在安裝系統時創建的普通用戶
- /root 表示管理員的家目錄,普通用戶是無權操作的,但是管理員可以進入任何普通用戶的家目錄
以root賬號的登錄后,使用pwd命令查看當前的目錄是/root
[root@centos8 ~]# pwd
/root
以普通賬號登錄后,使用pwd命令查看當前的目錄是/home/guanglei
[guanglei@centos8 ~]$ pwd
/home/guanglei
普通用戶使用cd /root切換到root用戶的家目錄,系統會提示沒有權限。就像老百姓沒有權利訪問皇帝的家
[guanglei@centos8 ~]$ cd /root
-bash: cd: /root: Permission denied
Linux目錄結構-/usr目錄
/usr目錄作用相當于Windows系統中的C:Windows目錄,該目錄非常重要,如果操作不當導致系統無法使用。
[root@centos8 ~]# tree -L 1 /usr
/usr
├── bin
├── games
├── include
├── lib
├── lib64
├── libexec
├── local
├── sbin
├── share
├── src
└── tmp -> ../var/tmp
/usr目錄下的子目錄說明
- /usr/local 軟件安裝目錄,相當于Windows系統中的C:Program Files目錄 老運維會將軟件安裝到該目錄
- /usr/bin 普通用戶使用的應用程序
- /usr/sin 管理員用戶使用的應用程序
- /usr/lib 啟動時程序依賴的基本共享庫文件以及內核模塊文件(/lib/modules)
- /usr/lib64 專用于x86_64系統上的輔助共享庫文件存放位置
使用ldd命令可以查看程序依賴哪些庫文件,如果庫文件被刪除那么會導致依賴該庫文件的所有程序無法使用
[root@centos8 ~]# ldd /bin/ls #查看ls命令依賴哪些庫文件
linux-vdso.so.1 (0x00007ffd01ffb000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fec0db4a000)
libcap.so.2 => /lib64/libcap.so.2 (0x00007fec0d944000)
libc.so.6 => /lib64/libc.so.6 (0x00007fec0d57f000)
libpcre2-8.so.0 => /lib64/libpcre2-8.so.0 (0x00007fec0d2fb000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fec0d0f7000)
/lib64/ld-linux-x86-64.so.2 (0x00007fec0df97000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fec0ced7000)
從ldd /bin/ls目錄的輸出結果可以看出ls命令依賴的都是64位的庫文件
Linux目錄結構-/boot目錄
/boot目錄存放的是系統啟動相關的文件,例如引導文件存放目錄,內核文件(vmlinuz)、引導加載器(bootloader, grub)都存放于此目錄,如果刪除/boot目錄,系統無法正常啟動。
[root@centos8 ~]# ls /boot 查看/boot目錄下的文件信息
config-4.18.0-305.3.1.el8.x86_64
efi
grub2
initramfs-0-rescue-ba0ec2df3d1a4aa1aa035218668c6140.img
initramfs-4.18.0-305.3.1.el8.x86_64.img
loader
lost+found
System.map-4.18.0-305.3.1.el8.x86_64
vmlinuz-0-rescue-ba0ec2df3d1a4aa1aa035218668c6140
vmlinuz-4.18.0-305.3.1.el8.x86_64
Linux目錄結構- /etc目錄
/etc目錄用于存放配置文件,后續所有服務(MySQL,redis等等)的配置文件都存放在該目錄中。
- /etc/sysconfig/network-scripts/ifcfg-ens33 目錄存放的是網絡配置文件
[root@centos8 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33 # 查看網絡配置
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME=ens33
UUID=0d0f57d1-1074-49dd-ad40-1f08395d9cae
DEVICE=ens33
ONBOOT=yes
- /etc/hostname 目錄存放系統主機名配置
[root@centos8 ~]# cat /etc/hostname # 查看主機名配置
centos8.ittimeline.net
- /etc/resolv.conf存放的是DNS客戶端配置文件
[root@centos8 ~]# cat /etc/resolv.conf # 查看DNS客戶端配置
# Generated by NetworkManager
search localdomain ittimeline.net
nameserver 10.0.0.2
Linux目錄結構- /var和/tmp目錄
- /var 目錄用于存放一些變化的文件
- /var/log目錄用于存放日志文件
- /var/cache目錄用于存放應用程序緩存數據目錄
[root@centos8 ~]# ls /var/log #查看系統日志文件列表
anaconda dnf.log messages sssd
audit dnf.rpm.log messages-20211010 swtpm
boot.log firewalld private tuned
boot.log-20211009 gdm qemu-ga vmware-network.1.log
boot.log-20211010 glusterfs rhsm vmware-network.2.log
btmp hawkey.log samba vmware-network.log
chrony hawkey.log-20211010 secure vmware-vgauthsvc.log.0
cron lastlog secure-20211010 vmware-vmsvc-root.log
cron-20211010 libvirt speech-dispatcher vmware-vmtoolsd-root.log
cups maillog spooler wtmp
dnf.librepo.log maillog-20211010 spooler-20211010 Xorg.9.log
/var/tmp目錄存放進程產生的臨時文件
[root@centos8 ~]# ls /var/tmp
systemd-private-b32fa66c27ce40509b87d850fbe6ea71-bluetooth.service-qHyFVg
systemd-private-b32fa66c27ce40509b87d850fbe6ea71-colord.service-4Di4Dg
systemd-private-b32fa66c27ce40509b87d850fbe6ea71-ModemManager.service-VwHWoj
systemd-private-b32fa66c27ce40509b87d850fbe6ea71-rtkit-daemon.service-NsfeKh
- /tmp 系統臨時目錄 用于存放一些臨時文件
Linux目錄結構-/dev目錄
/dev目錄用于存放設備文件,例如硬盤,光驅等等。
在/dev目錄下有幾個常用的特殊設備
- /deve/null 黑洞設備,只進不出,類似于垃圾回收站
- /dev/random 生成隨機數的設備
[root@centos8 ~]# echo $RANDOM #產生一個隨機數 該隨機數由/dev/random設備產生
10852
[root@centos8 ~]# echo $RANDOM|md5sum #產生一個隨機數,使用md5加密 該隨機數由/dev/random設備產生
fe8330279a460dacafed81c058b6b376 -
- /dev/zero 能源源不斷產生收據,類似于取款機,能隨時隨地取錢
[root@centos8 ~]# dd if=/dev/zero of=/tmp/data.txt bs=1M count=2048 #取2G的數據存儲到/tmp/data.txt文件中
2048+0 records in
2048+0 records out
2147483648 bytes (2.1 GB, 2.0 GiB) copied, 0.969928 s, 2.2 GB/s
[root@centos8 ~]# ll -h /tmp/data.txt #以人性化的方式查看/tmp/data.txt文件信息
-rw-r--r--. 1 root root 2.0G Oct 10 10:40 /tmp/data.txt
Linux目錄結構-/proc目錄
每個程序運行起來之后被稱為進程,系統會給每個進程隨機分配一個編號,即PID,在Windows的任務管理器的詳細信息中可以看到每個進程的PID
/proc目錄是虛擬的文件系統,如果對應的進程停止 ,則/proc目錄下的目錄會被刪除。
/proc目錄反映當前系統正在運行進程的實時狀態,類似于汽車正在運行過程中的儀表板,能夠看到汽車的時速,油耗,公里數等等。
[root@centos8 ~]# systemctl status crond #查看crond服務的狀態
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2021-10-10 10:08:49 CST; 48min ago
Main PID: 1226 (crond)
Tasks: 1 (limit: 24608)
Memory: 1.1M
CGroup: /system.slice/crond.service
└─1226 /usr/sbin/crond -n
Oct 10 10:08:49 centos8.ittimeline.net systemd[1]: Started Command Scheduler.
Oct 10 10:08:49 centos8.ittimeline.net crond[1226]: (CRON) STARTUP (1.5.2)
Oct 10 10:08:49 centos8.ittimeline.net crond[1226]: (CRON) INFO (Syslog will be used instead of sendmail.)
Oct 10 10:08:49 centos8.ittimeline.net crond[1226]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 47% if used.)
Oct 10 10:08:49 centos8.ittimeline.net crond[1226]: (CRON) INFO (running with inotify support)
crond進程的實時信息在/proc/1226目錄下,1226是crond服務的進程編號。后續可以通過命令讀取該目錄獲取對應的進程信息
[root@centos8 ~]# ll /proc/1226
total 0
dr-xr-xr-x. 2 root root 0 Oct 10 10:46 attr
-rw-r--r--. 1 root root 0 Oct 10 10:46 autogroup
-r--------. 1 root root 0 Oct 10 10:46 auxv
-r--r--r--. 1 root root 0 Oct 10 10:08 cgroup
--w-------. 1 root root 0 Oct 10 10:46 clear_refs
-r--r--r--. 1 root root 0 Oct 10 10:08 cmdline
-rw-r--r--. 1 root root 0 Oct 10 10:08 comm
-rw-r--r--. 1 root root 0 Oct 10 10:46 coredump_filter
-r--r--r--. 1 root root 0 Oct 10 10:46 cpu_resctrl_groups
-r--r--r--. 1 root root 0 Oct 10 10:46 cpuset
lrwxrwxrwx. 1 root root 0 Oct 10 10:46 cwd -> /
-r--------. 1 root root 0 Oct 10 10:46 environ
lrwxrwxrwx. 1 root root 0 Oct 10 10:08 exe -> /usr/sbin/crond
dr-x------. 2 root root 0 Oct 10 10:08 fd
dr-x------. 2 root root 0 Oct 10 10:46 fdinfo
-rw-r--r--. 1 root root 0 Oct 10 10:46 gid_map
-r--------. 1 root root 0 Oct 10 10:46 io
-r--r--r--. 1 root root 0 Oct 10 10:46 limits
-rw-r--r--. 1 root root 0 Oct 10 10:08 loginuid
dr-x------. 2 root root 0 Oct 10 10:46 map_files
-r--r--r--. 1 root root 0 Oct 10 10:46 maps
-rw-------. 1 root root 0 Oct 10 10:46 mem
-r--r--r--. 1 root root 0 Oct 10 10:46 mountinfo
-r--r--r--. 1 root root 0 Oct 10 10:46 mounts
-r--------. 1 root root 0 Oct 10 10:46 mountstats
dr-xr-xr-x. 6 root root 0 Oct 10 10:46 net
dr-x--x--x. 2 root root 0 Oct 10 10:46 ns
-r--r--r--. 1 root root 0 Oct 10 10:46 numa_maps
-rw-r--r--. 1 root root 0 Oct 10 10:46 oom_adj
-r--r--r--. 1 root root 0 Oct 10 10:46 oom_score
-rw-r--r--. 1 root root 0 Oct 10 10:46 oom_score_adj
-r--------. 1 root root 0 Oct 10 10:46 pagemap
-r--------. 1 root root 0 Oct 10 10:46 patch_state
-r--------. 1 root root 0 Oct 10 10:46 personality
-rw-r--r--. 1 root root 0 Oct 10 10:46 projid_map
lrwxrwxrwx. 1 root root 0 Oct 10 10:46 root -> /
-rw-r--r--. 1 root root 0 Oct 10 10:46 sched
-r--r--r--. 1 root root 0 Oct 10 10:46 schedstat
-r--r--r--. 1 root root 0 Oct 10 10:08 sessionid
-rw-r--r--. 1 root root 0 Oct 10 10:46 setgroups
-r--r--r--. 1 root root 0 Oct 10 10:46 smaps
-r--r--r--. 1 root root 0 Oct 10 10:46 smaps_rollup
-r--------. 1 root root 0 Oct 10 10:46 stack
-r--r--r--. 1 root root 0 Oct 10 10:08 stat
-r--r--r--. 1 root root 0 Oct 10 10:46 statm
-r--r--r--. 1 root root 0 Oct 10 10:08 status
-r--------. 1 root root 0 Oct 10 10:46 syscall
dr-xr-xr-x. 3 root root 0 Oct 10 10:08 task
-rw-r--r--. 1 root root 0 Oct 10 10:46 timens_offsets
-r--r--r--. 1 root root 0 Oct 10 10:46 timers
-rw-rw-rw-. 1 root root 0 Oct 10 10:46 timerslack_ns
-rw-r--r--. 1 root root 0 Oct 10 10:46 uid_map
-r--r--r--. 1 root root 0 Oct 10 10:46 wchan
如果停止crond進程,則該虛擬目錄則不存在
[root@centos8 ~]# systemctl stop crond #停止crond服務
[root@centos8 ~]# ll /proc/1226 #之前的/proc/1226目錄不存在了
ls: cannot access '/proc/1226': No such file or directory
再次啟動crond服務后發現進程編號是2482
[root@centos8 ~]# systemctl start crond
[root@centos8 ~]# systemctl status crond
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2021-10-10 11:01:35 CST; 11s ago
Main PID: 2482 (crond)
Tasks: 1 (limit: 24608)
Memory: 1.0M
CGroup: /system.slice/crond.service
└─2482 /usr/sbin/crond -n
Oct 10 11:01:35 centos8.ittimeline.net systemd[1]: Started Command Scheduler.
Oct 10 11:01:35 centos8.ittimeline.net crond[2482]: (CRON) STARTUP (1.5.2)
Oct 10 11:01:35 centos8.ittimeline.net crond[2482]: (CRON) INFO (Syslog will be used instead of sendmail.)
Oct 10 11:01:35 centos8.ittimeline.net crond[2482]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 58% if used.)
Oct 10 11:01:35 centos8.ittimeline.net crond[2482]: (CRON) INFO (running with inotify support)
Oct 10 11:01:35 centos8.ittimeline.net crond[2482]: (CRON) INFO (@reboot jobs will be run at computer's startup.)
然后又可以使用 ls /proc/2482命令 在/proc/2482 目錄下查看該進程信息