# Linux文件树

Linux里一切皆是文件,而文件,又由一棵文件树组成,树的根节点是"/"路径,根节点下面是叶子节点,如"/dev"路径,"/tmp"路径,"/proc"路径。

# /

根目录,所有目录皆源于此。

# /bin 常用

bin(binary)目录包含系统引导执行所必需的二进制可执行文件(程序)。

# 可以看到该目录中文件非常多,有1000+,这些文件都是非常重要的。
[root@VM-8-5-centos bin]# ls -l | wc -l
1098

# /boot 常用

boot目录是Linux的开机引导目录。包括Linux内核文件,初始化RAM磁盘镜像(供引导期间所需的驱动程序使用),引导装载器(开机所需要的文件)。值得注意的文件包括用于配置引导装载器的/boot/grub2/grub.conf以及/boot/vmlinuz-3.10.0-1127.19.1.el7.x86_64。

# /boot/grub2/grub.conf

grub是引导操作系统的程序,它会根据自己的配置文件,去引导内核,当内核被加载到内存以后,内核会根据grub配置文件中的配置,找到根分区所使用的文件系统对应的驱动,通过根分区文件系统对应的驱动,挂载根分区,从而达到启动操作系统的目的。grub.conf文件是grub程序的配置文件。

# /boot/vmlinuz

/boot/vmlinuz-3.10.0-1127.19.1.el7.x86_64文件是Linux操作系统中的内核镜像文件。它包含了Linux内核的压缩版本,用于引导和启动操作系统。vmlinuz文件通常是一个zImage格式的压缩内核镜像,其中包含了操作系统所需的核心功能和驱动程序。

# /dev 常用

系统设备节点的特殊目录。“万物皆文件”同样适用于设备。Linux内核在其中维护着能够识别的所有设备。

# /dev/fd

软盘驱动器。

# /dev/hd

较久系统上的IDE硬盘。如/dev/hda代表整个硬盘的时候,/dev/hda1代表硬盘的第一个分区。

# /dev/lp

打印机设备。

# /dev/sd

SCSI硬盘。在最近的Linux系统中,内核把所有的类硬盘设备(包括PATA、SATA硬盘、闪存、USB海量存储设备如MP4播放器等)都当做SCSI硬盘。

# /dev/sr

光驱(CD/DV播放器和刻录机)。

# /etc 常用

/etc(贝尔实验室的解释是:etcetra directory,也称作Editable Text Configuration或Extended Tool Chest),早期UNIX系统中该目录是用来存放不能归类到其他目录的内容,后来FHS规定该目录用来存放系统主要的配置文件,如人员的账号密码文件、各种服务的起始文件等。一般来说,这个目录下的各文件属性是可以让一般用户用户查阅的,但是只有root有权利修改。

# /etc/passwd 常用

/etc/passwd文件里存储了Linux系统中所有的用户名以及密码信息(由于系统调整原因,现在Linux的密码一般都存储在/etc/shadow中,/etc/passwd中仅存储用户名信息,这也是这个文件虽然叫/etc/passwd但是却没有密码信息的原因)。

[root@VM-8-5-centos ~]# cat /etc/passwd
# 下面以root行介绍每个字段的含义
# 第一个字段:用户名
# 第二个字段: 密码(x代表密码存储在/etc/shadow文件中)
# 第三个字段:用户id
# 第四个字段: 主属组id
# 第五个字段: 描述信息(此字段只是用来解释为什么创建这个用户)
# 第六个字段: 用户的主目录(用户的家目录,也就是登录之后看到的目录)
# 第七个字段: 默认Shell (Shell是Linux的命令解释器,是用户和Linux内核之间沟通的桥梁,通常情况下,
# Linux默认使用的命令解释器是/bin/bash,当然还有其他的命令解释器。)
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
libstoragemgmt:x:998:997:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:997:995::/var/lib/chrony:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
syslog:x:996:994::/home/syslog:/bin/false
www:x:1000:1000::/home/www:/sbin/nologin
lighthouse:x:1001:1001::/home/lighthouse:/bin/bash

# /etc/shadow

如/etc/passwd文件的介绍,现在Linux系统中的密码一般都存储在/etc/shadow文件中。

# 第一个字段:用户名(也被称为登录名),在/etc/shadow中,用户名和/etc/passwd 是相同的,这样就把passwd 和shadow中用的用户记录联系在一起;这个字段是非空的;

# 第二个字段:密码(已被加密),如果是有些用户在这段是x,表示这个用户不能登录到系统;这个字段是非空的;
# 所有伪用户的密码都是 "!!" 或 "*",代表没有密码是不能登录的。当然,新创建的用户如果不设定密码,那么它的密码项也
# 是 "!!",代表这个用户没有密码,不能登录。

# 第三个字段:上次修改口令的时间;这个时间是从1970年01月01日算起到最近一次修改口令的时间间隔(天数),您可以通过
# passwd 来修改用户的密码,然后查看/etc/shadow中此字段的变化;

# 第四个字段:两次修改口令间隔最少的天数;如果设置为0,则禁用此功能;也就是说用户必须经过多少天才能修改其口令;此项
# 功能用处不是太大;默认值是通过/etc/login.defs文件定义中获取,PASS_MIN_DAYS 中有定义;

# 第五个字段:两次修改口令间隔最多的天数;这个能增强管理员管理用户口令的时效性,应该说在增强了系统的安全性;如果是
# 系统默认值,是在添加用户时由/etc/login.defs文件定义中获取,在PASS_MAX_DAYS 中定义;

# 第六个字段:提前多少天警告用户口令将过期;当用户登录系统后,系统登录程序提醒用户口令将要作废;如果是系统默认值,
# 是在添加用户时由/etc/login.defs文件定义中获取,在PASS_WARN_AGE 中定义;

# 第七个字段:在口令过期之后多少天禁用此用户;此字段表示用户口令作废多少天后,系统会禁用此用户,也就是说系统会不能
# 再让此用户登录,也不会提示用户过期,是完全禁用;

# 第八个字段:用户过期日期;此字段指定了用户作废的天数(从1970年的1月1日开始的天数),如果这个字段的值为空,帐号永久可用;

# 第九个字段:保留字段,目前为空,以备将来Linux发展之用;
[root@VM-8-5-centos ~]# cat /etc/shadow
root:$1$jCEBPdFr$RVhG15S/xuyZiIU9EyS12/:19696:0:99999:7:::
bin:*:17834:0:99999:7:::
daemon:*:17834:0:99999:7:::
adm:*:17834:0:99999:7:::
lp:*:17834:0:99999:7:::
sync:*:17834:0:99999:7:::
shutdown:*:17834:0:99999:7:::
halt:*:17834:0:99999:7:::
mail:*:17834:0:99999:7:::
operator:*:17834:0:99999:7:::
games:*:17834:0:99999:7:::
ftp:*:17834:0:99999:7:::
nobody:*:17834:0:99999:7:::
systemd-network:!!:17962::::::
dbus:!!:17962::::::
polkitd:!!:17962::::::
libstoragemgmt:!!:17962::::::
rpc:!!:17962:0:99999:7:::
ntp:!!:17962::::::
abrt:!!:17962::::::
sshd:!!:17962::::::
postfix:!!:17962::::::
chrony:!!:17962::::::
tcpdump:!!:17962::::::
syslog:!!:18205::::::
www:!!:19572:0:99999:7:::
lighthouse:!!:19572:0:99999:7:::

# /etc/group

/etc/group文件里存储了用户组信息。

[root@VM-8-5-centos ~]# cat /etc/group
# 第一个字段:用户组的名称,由字母或数字组成。
# 第二个字段:用户组密码,用于指定组管理员,一般不用这个功能。通常使用sudo命令代替。
# 第三个字段:用户组id
# 第四个字段:该用户组中的用户列表。如果该用户组是某个用户的初始组,该用户并不会添加到这个字段里。如root用户
# 的初始组是root,这里root的第四个字段却是空的。
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mem:x:8:
kmem:x:9:
wheel:x:10:
cdrom:x:11:
mail:x:12:postfix
man:x:15:
dialout:x:18:
floppy:x:19:
games:x:20:
tape:x:33:
video:x:39:
ftp:x:50:
lock:x:54:
audio:x:63:
nobody:x:99:
users:x:100:
utmp:x:22:
utempter:x:35:
input:x:999:
systemd-journal:x:190:
systemd-network:x:192:
dbus:x:81:
polkitd:x:998:
libstoragemgmt:x:997:
ssh_keys:x:996:
rpc:x:32:
ntp:x:38:
abrt:x:173:
sshd:x:74:
slocate:x:21:
postdrop:x:90:
postfix:x:89:
chrony:x:995:
tcpdump:x:72:
stapusr:x:156:
stapsys:x:157:
stapdev:x:158:
syslog:x:994:
www:x:1000:
lighthouse:x:1001:lighthouse
cgred:x:993:
docker:x:992:

# /etc/crontab 常用

crontab文件定义了Linux系统何时执行自动化作业。该文件内容如下:

[root@VM-8-5-centos etc]# cat crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

# /etc/fstab 常用

文件/etc/fstab(file system table文件系统表)列出了会在系统引导时自动挂载的各种设备(通常是硬盘分区)。

[root@VM-8-5-centos ~]# cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Thu Mar  7 06:38:37 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
# 第一个参数:设备描述
# 第二个参数:挂载目录
# 第三个参数:文件系统类型,ext4代表日志文件系统。 
# 第四个参数:选项
# 第五个参数:频率
# 第六个参数:优先级                                    
UUID=4b499d76-769a-40a0-93dc-4a31a59add28 /                       ext4    defaults        1 1
/www/swap    swap    swap    defaults    0 0

# /etc/sudoers 常用

文件/etc/sudoers描述了普通用户的权限配置。可以通过修改该文件对普通用户进行提升权限,修改后立刻生效。

# 可以通过修改/etc/sudoers文件来对其他用户进行提权,修改后立刻生效
[root@VM-8-5-centos ~]# cat /etc/sudoers
## Sudoers allows particular users to run various commands as
## the root user, without needing the root password.
##
## Examples are provided at the bottom of the file for collections
## of related commands, which can then be delegated out to particular
## users or groups.
##
## This file must be edited with the 'visudo' command.

## Host Aliases
## Groups of machines. You may prefer to use hostnames (perhaps using
## wildcards for entire domains) or IP addresses instead.
# Host_Alias     FILESERVERS = fs1, fs2
# Host_Alias     MAILSERVERS = smtp, smtp2

## User Aliases
## These aren't often necessary, as you can use regular groups
## (ie, from files, LDAP, NIS, etc) in this file - just use %groupname
## rather than USERALIAS
# User_Alias ADMINS = jsmith, mikem


## Command Aliases
## These are groups of related commands...

## Networking
# Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool

## Installation and management of software
# Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum

## Services
# Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig, /usr/bin/systemctl start, /usr/bin/systemctl stop, /usr/bin/systemctl reload, /usr/bin/systemctl restart, /usr/bin/systemctl status, /usr/bin/systemctl enable, /usr/bin/systemctl disable

## Updating the locate database
# Cmnd_Alias LOCATE = /usr/bin/updatedb

## Storage
# Cmnd_Alias STORAGE = /sbin/fdisk, /sbin/sfdisk, /sbin/parted, /sbin/partprobe, /bin/mount, /bin/umount

## Delegating permissions
# Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp

## Processes
# Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall

## Drivers
# Cmnd_Alias DRIVERS = /sbin/modprobe

# Defaults specification

#
# Refuse to run if unable to disable echo on the tty.
#
Defaults   !visiblepw

#
# Preserving HOME has security implications since many programs
# use it when searching for configuration files. Note that HOME
# is already set when the the env_reset option is enabled, so
# this option is only effective for configurations where either
# env_reset is disabled or HOME is present in the env_keep list.
#
Defaults    always_set_home
Defaults    match_group_by_gid

# Prior to version 1.8.15, groups listed in sudoers that were not
# found in the system group database were passed to the group
# plugin, if any. Starting with 1.8.15, only groups of the form
# %:group are resolved via the group plugin by default.
# We enable always_query_group_plugin to restore old behavior.
# Disable this option for new behavior.
Defaults    always_query_group_plugin

Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS"
Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"

#
# Adding HOME to env_keep may enable a user to run unrestricted
# commands via sudo.
#
# Defaults   env_keep += "HOME"

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

## Next comes the main part: which users can run what software on
## which machines (the sudoers file can be shared between multiple
## systems).
## Syntax:
##
##      user    MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL

## Allows members of the 'sys' group to run networking, software,
## service management apps and more.
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS

## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL

## Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL

## Allows members of the users group to mount and unmount the
## cdrom as root
# %users  ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom

## Allows members of the users group to shutdown this system
# %users  localhost=/sbin/shutdown -h now

## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d
lighthouse ALL=(ALL) NOPASSWD: ALL

# /etc/sysctl.conf 常用

/etc/sysctl.conf文件是Linux操作系统中的关键配置文件,用于设置系统的内核参数。通过理解该文件的作用、格式和常见配置项,你可以根据需要优化系统性能、调整网络设置和提高安全性。

注意事项

在修改配置项之前,请确保了解每个参数的含义和影响,并备份原始配置文件以便恢复。
修改/etc/sysctl.conf文件的配置项前,请确保你了解每个配置项的含义和影响。同时在修改前对原始的配置文件进行备份。
修改/etc/sysctl.conf文件后,需要使用以下命令使其生效:“sysctl -p /etc/sysctl.conf” 指令加载配置文件,使其生效。

常用的关键配置

net.ipv4.ip_forward=1:启用IP转发功能,允许数据包在网络接口之间转发。
kernel.sysrq=1:启用SysRq键,允许使用SysRq组合键进行系统调试和管理。
net.ipv4.tcp_syncookies=1:启用TCP SYN Cookies,提高对SYN洪泛攻击的抵御能力。
net.core.somaxconn=65535:设置套接字的最大连接数。
vm.swappiness=10:调整内存交换机制的行为,减少对交换空间的使用。

# /home

在正常配置中,每个用户在/home中都有各自的目录。普通用户仅对自己的主目录中的文件有写权限。这一限制可以保护系统免遭用户错误行为的破坏。

# /lib

包含系统核心程序用到的共享库文件。类似于Windows中的动态链接库(Dynamic Link Library,DDL)。

# /lost+found

每个采用Linux文件系统(例如ext3)格式化过的分区或设备都会包含该目录。它用于文件系统损坏时的部分恢复。除非系统发生了严重故障,否则这个目录总是空的。

# /media

在现代Linux系统中,/media目录包含各种可移动存储设备(如USB设备,CD-ROM)的挂载点,这些设备在插入时会自动挂载。

# /mnt

在先前的Linux系统中,/mnt目录包含手动挂载的各种可移动存储设备的挂载点。

# /opt

用于安装“可选”软件,主要存放系统中可能安装的商业软件。

# /proc 常用

proc是一个特殊的目录,它并非存在于磁盘上的真实文件系统,而是虚拟文件系统(文件在操作系统运行时直接存储在内存空间中),该目录存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。

# /proc/version 常用

/proc/version文件里存储的是系统的版本信息,通过如下指令即可查看当前系统的版本信息。

# 查看当前操作系统的版本信息,这里使用的是cat指令直接读取/proc/version文件里的内容并且展示在console控制台上
cat /proc/version

指令的执行结果如图,可以看到当前系统是Red Hat 4.8.5-44版本。

[root@VM-8-5-centos ~]# cat /proc/version
Linux version 3.10.0-1160.92.1.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) 
(gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ) 
#1 SMP Tue Jun 20 11:48:01 UTC 2023

# /root

超级用户的主目录。

# /sbin

sbin(system binary)目录包含“系统”二进制可执行文件。这些文件负责执行重要的系统任务,通常保留给超级用户使用。

# /tmp

用于保存各种程序生成的临时文件。有些配置会使该目录在每次系统重新引导(重启操作系统)时都被清空。

# /usr

/usr目录是Linux系统中最大的目录树,其中包含了普通用户用到的所有程序和支持文件。

# /usr/bin

包含了Linux发行版安装的程序,数量有几千个。可以看到,/usr/bin与/bin的功能完全一致,只不是一个存放的是系统安装的程序,一个存放的是当前用户安装的程序。

# /usr/lib

/usr/bin目录要用到的共享库。

# /usr/local 常用

包含的程序并非Linux发行版自带的,但是计划在系统范围内使用。**通过源代码编译生成的程序通常安装在/usr/local/bin。**在刚安装好的Linux系统中,该目录树存在,但却是空的,直到超级用户向其中添加内容。

# /usr/sbin

包含更多系统管理工具。

# /usr/share

包含/usr/bin中的程序用到的共享数据。其中包含默认的配置文件,图标,桌面背景,声音文件等。

# /usr/share/doc

系统中安装的大部分软件包自带文档。在该目录中,文档文件是按照软件包来分类组织的。

# /var

除/tmp和/home目录以外,到目前位置看到的目录都是静止的,也就是说,目录不怎么发生变化,那些可能会改变的数据保存在/var(variable)目录树中。各种数据库,假脱机文件,用户邮件等都在其中。

# /var/log

包含日志文件,各种系统活动记录。这些文件非常重要,应该被随时监控。其中较有用的是/var/log/messages和/var/log/syslog。注意,出于安全考虑,在有些系统中,只有超级用户才能查看日志文件。