谈到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下的快捷方式。
Linux根目录下的几个你需要里了解的根目录下的一级子目录
/bin目录和/sbin目录都是用于存放命令的目录,命令的本质就是一个应用程序。
[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目录内容是一样的
[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
/home和/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
/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目录下的子目录说明
使用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位的库文件
/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
/etc目录用于存放配置文件,后续所有服务(MySQL,redis等等)的配置文件都存放在该目录中。
[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
[root@centos8 ~]# cat /etc/hostname # 查看主机名配置
centos8.ittimeline.net
[root@centos8 ~]# cat /etc/resolv.conf # 查看DNS客户端配置
# Generated by NetworkManager
search localdomain ittimeline.net
nameserver 10.0.0.2
[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
Linux目录结构-/dev目录
/dev目录用于存放设备文件,例如硬盘,光驱等等。
在/dev目录下有几个常用的特殊设备
[root@centos8 ~]# echo $RANDOM #产生一个随机数 该随机数由/dev/random设备产生
10852
[root@centos8 ~]# echo $RANDOM|md5sum #产生一个随机数,使用md5加密 该随机数由/dev/random设备产生
fe8330279a460dacafed81c058b6b376 -
[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
每个程序运行起来之后被称为进程,系统会给每个进程随机分配一个编号,即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 目录下查看该进程信息