实用命令
查看连接你服务器 top10 用户端的 IP 地址
netstat -nat | awk '{print $5}' | awk -F ':' '{print $1}' | sort | uniq -c | sort -rn | head -n 10
# 查看一下你最常用的10个命令
cat .bash_history | sort | uniq -c | sort -rn | head -n 10
htop
是 top 的一个加强版。然而,还有很多的各式各样的top,比如:用于看IO负载的 iotop,网络负载的 iftop, 以及把这些top都集成在一起的 atop。
dnf install htop
tmux
在需要经常登录远程服务器工作的时候会很有用,可以保持远程登录的会话,还可以在一个窗口中查看多个 shell 的状态。
yum install tmux
使用
tmux
上面命令会启动 Tmux 窗口,底部有一个状态栏。状态栏的左侧是窗口信息(编号和名称),右侧是系统信息。

按下Ctrl+d或者显式输入exit命令,就可以退出 Tmux 窗口。
```bash
$ exit
Tmux 窗口有大量的快捷键。所有快捷键都要通过前缀键唤起。默认的前缀键是Ctrl+b,即先按下Ctrl+b,快捷键才会生效。
举例来说,帮助命令的快捷键是Ctrl+b ?。它的用法是,在 Tmux 窗口中,先按下Ctrl+b,再按下?,就会显示帮助信息。
然后,按下 ESC 键或q键,就可以退出帮助。
最简单操作流程
新建会话tmux new -s my_session。
在 Tmux 窗口运行所需的程序。
按下快捷键Ctrl+b d将会话分离。
下次使用时,重新连接到会话tmux attach-session -t my_session。
httpie
是一个可以用来替代 curl 和 wget 的 http 客户端,httpie 支持 json 和语法高亮,可以使用简单的语法进行 http 访问: http -v github.com。
dnf install httpie
https httpie.io/hello
http http://www.baidu.com
https://github.com/httpie/httpie
GoAccess
这个是一个轻量级的分析统计日志文件的工具,主要是分析各种各样的 access log。
https://github.com/allinurl/goaccess
yum install goaccess
goaccess access.log
goaccess access.log -a > report.html
goaccess access.log -a -d -o json > report.json
goaccess access.log --no-csv-summary -o csv > report.csv
tail -f access.log | goaccess -
tail -f access.log | grep -i --line-buffered 'firefox' | goaccess --log-format=COMBINED -
tail -f -n +0 access.log | grep -i --line-buffered 'firefox' | goaccess -o report.html --real-time-html -
goaccess access.log -o /usr/share/nginx/html/your_site/report.html --real-time-html
goaccess access.log -o report.html --real-time-html --ws-url=goaccess.io
goaccess access.log -o report.html --real-time-html --port=9870
goaccess access.log -o report.html --real-time-html --addr=127.0.0.1
CFSSL
https://github.com/cloudflare/cfssl
生成 ca 配置
client certificate: 用于服务端认证客户端,例如etcdctl、etcd proxy、fleetctl、docker客户端
server certificate: 服务端使用,客户端以此验证服务端身份,例如docker服务端、kube-apiserver
peer certificate: 双向证书,用于etcd集群成员间通信
创建ca配置文件 (ca-config.json)
"ca-config.json":可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile;
"signing":表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE;
"server auth":表示client可以用该 CA 对server提供的证书进行验证;
"client auth":表示server可以用该CA对client提供的证书进行验证;
创建配置文件
vi ca-config.json
{
"signing": {
"default": {
"expiry": "43800h"
},
"profiles": {
"server": {
"expiry": "43800h",
"usages": [
"signing",
"key encipherment",
"server auth"
]
},
"client": {
"expiry": "43800h",
"usages": [
"signing",
"key encipherment",
"client auth"
]
},
"peer": {
"expiry": "43800h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
},
"kubernetes": {
"expiry": "43800h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
},
"etcd": {
"expiry": "43800h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
创建ca证书签名(ca-csr.json)
"CN":Common Name,从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;
"O":Organization,从证书中提取该字段作为请求用户所属的组 (Group);
这两个参数在后面的kubernetes启用RBAC模式中很重要,因为需要设置kubelet、admin等角色权限,那么在配置证书的时候就必须配置对了,具体后面在部署kubernetes的时候会进行讲解。
"在etcd这两个参数没太大的重要意义,跟着配置就好。"
创建配置文件
vi ca-csr.json
{
"CN": "SelfSignedCa",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "shanghai",
"O": "cfssl",
"ST": "shanghai",
"OU": "System"
}
]
}
生成ca证书和私钥
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
ls
ca.csr ca.pem(ca公钥) ca-key.pem(ca私钥,妥善保管)
签发Server Certificate
cfssl print-defaults csr > server.json
vim server.json
{
"CN":"Server",
"hosts":[
"192.168.1.1"
],
"key":{
"algo":"ecdsa",
"size":256
},
"names":[
{
"C":"CN",
"L":"SH",
"ST":"SH"
}
]
}
生成服务端证书和私钥
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server server.json | cfssljson -bare server
签发Client Certificate
cfssl print-defaults csr > client.json
vim client.json
{
"CN":"Client",
"hosts":[
],
"key":{
"algo":"ecdsa",
"size":256
},
"names":[
{
"C":"CN",
"L":"SH",
"ST":"SH"
}
]
}
生成客户端证书和私钥
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client client.json | cfssljson -bare client
签发peer certificate
cfssl print-defaults csr > member1.json
vim member1.json
```json
{
"CN":"member1",
"hosts":[
"192.168.1.1"
],
"key":{
"algo":"ecdsa",
"size":256
},
"names":[
{
"C":"CN",
"L":"SH",
"ST":"SH"
}
]
}
为节点member1生成证书和私钥:
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=peer member1.json | cfssljson -bare member1
针对etcd服务,每个etcd节点上按照上述方法生成相应的证书和私钥
最后校验证书
校验生成的证书是否和配置相符
openssl x509 -in ca.pem -text -noout openssl x509 -in server.pem -text -noout openssl x509 -in client.pem -text -noout
k8s集群所需证书
命令行编辑
按键 | 操作 |
---|---|
Ctrl - A | 移动光标至行首 |
Ctrl - E | 移动光标至行尾 |
Ctrl - W | 删除前一个词 |
Ctrl - U | 删除从光标至行首的内容 |
Ctrl - K | 删除从光标至行尾的内容 |
Ctrl - Y | 粘贴已删除的文本(例如粘贴 Ctrl - U 所删除的内容) |
Ctrl - ← | 光标向前移动一个单词 |
Ctrl - → | 光标向后移动一个单词 |
Ctrl - L | 清屏 |
重定向
标准输出重定向
ls > ls.log
标准错误重定向
ls /ff > f > 2>e
标准输出和错误输出重定向
ls /ff > f 2>&1
常用 shell 脚本模板
处理命令行参数的一个样例
while [ "$1" != "" ]; do
case $1 in
-s ) shift
SERVER=$1 ;;
-d ) shift
DATE=$1 ;;
--paramter|p ) shift
PARAMETER=$1;;
-h|help ) usage # function call
exit ;;
* ) usage # All other parameters
exit 1
esac
shift
done
命令行菜单的一个样例
#!/bin/bash
# Bash Menu Script Example
PS3='Please enter your choice: '
options=("Option 1" "Option 2" "Option 3" "Quit")
select opt in "${options[@]}"
do
case $opt in
"Option 1")
echo "you chose choice 1"
;;
"Option 2")
echo "you chose choice 2"
;;
"Option 3")
echo "you chose choice $REPLY which is $opt"
;;
"Quit")
break
;;
*) echo "invalid option $REPLY";;
esac
done
颜色定义,你可以使用 echo -e "$blue $red $etc...." 进行有颜色文本的输出
RCol='\e[0m' # Text Reset
# Regular Bold Underline High Intensity BoldHigh Intens Background High Intensity Backgrounds
Bla='\e[0;30m'; BBla='\e[1;30m'; UBla='\e[4;30m'; IBla='\e[0;90m'; BIBla='\e[1;90m'; On_Bla='\e[40m'; On_IBla='\e[0;100m';
Red='\e[0;31m'; BRed='\e[1;31m'; URed='\e[4;31m'; IRed='\e[0;91m'; BIRed='\e[1;91m'; On_Red='\e[41m'; On_IRed='\e[0;101m';
Gre='\e[0;32m'; BGre='\e[1;32m'; UGre='\e[4;32m'; IGre='\e[0;92m'; BIGre='\e[1;92m'; On_Gre='\e[42m'; On_IGre='\e[0;102m';
Yel='\e[0;33m'; BYel='\e[1;33m'; UYel='\e[4;33m'; IYel='\e[0;93m'; BIYel='\e[1;93m'; On_Yel='\e[43m'; On_IYel='\e[0;103m';
Blu='\e[0;34m'; BBlu='\e[1;34m'; UBlu='\e[4;34m'; IBlu='\e[0;94m'; BIBlu='\e[1;94m'; On_Blu='\e[44m'; On_IBlu='\e[0;104m';
Pur='\e[0;35m'; BPur='\e[1;35m'; UPur='\e[4;35m'; IPur='\e[0;95m'; BIPur='\e[1;95m'; On_Pur='\e[45m'; On_IPur='\e[0;105m';
Cya='\e[0;36m'; BCya='\e[1;36m'; UCya='\e[4;36m'; ICya='\e[0;96m'; BICya='\e[1;96m'; On_Cya='\e[46m'; On_ICya='\e[0;106m';
Whi='\e[0;37m'; BWhi='\e[1;37m'; UWhi='\e[4;37m'; IWhi='\e[0;97m'; BIWhi='\e[1;97m'; On_Whi='\e[47m'; On_IWhi='\e[0;107m';
取当前运行脚本绝对路径的示例:(注:Linux下可以用 dirname $(readlink -f $0) )
FILE="$0"
while [[ -h ${FILE} ]]; do
FILE="`readlink "${FILE}"`"
done
pushd "`dirname "${FILE}"`" > /dev/null
DIR=`pwd -P`
popd > /dev/null
如何在远程服务器运行一个本地脚本
#无参数
ssh user@server 'bash -s' < local.script.sh
#有参数
ssh user@server ARG1="arg1" ARG2="arg2" 'bash -s' < local_script.sh
如何检查一个命令是否存在
如何检查一个命令是否存在,用 which 吗?最好不要用,因为很多操作系统的 which 命令没有设置退出状态码,这样你不知道是否是有那个命令。所以,你应该使用下面的方式。
# POSIX 兼容:
command -v [the_command]
# bash 环境:
hash [the_command]
type [the_command]
# 示例:
gnudate() {
if hash gdate 2> /dev/null; then
gdate "$@"
else
date "$@"
fi
}
写出健壮脚本技巧
- 使用 -e 参数,如:set -e 或是 #!/bin/sh -e,这样设置会让你的脚本出错就会停止运行,这样一来可以防止你的脚本在出错的情况下还在拼拿地干活停不下来。
- 使用 -u 参数,如: set -eu,这意味着,如果你代码中有变量没有定义,就会退出。
- 对一些变理,你可以使用默认值。如:${FOO:-'default'}
- 处理你代码的退出码。这样方便你的脚本跟别的命令行或脚本集成。
- 尽量不要使用 ; 来执行多个命令,而是使用 &&,这样会在出错的时候停止运行后续的命令。
- 对于一些字符串变量,使用引号括起,避免其中有空格或是别的什么诡异字符。
- 如果你的脚有参数,你需要检查脚本运行是否带了你想要的参数,或是,你的脚本可以在没有参数的情况下安全的运行。
- 为你的脚本设置 -h 和 --help 来显示帮助信息。千万不要把这两个参数用做为的功能。
- 使用 $() 而不是 “ 来获得命令行的输出,主要原因是易读。
- 小心不同的平台,尤其是 MacOS 和 Linux 的跨平台。
- 对于 rm -rf 这样的高危操作,需要检查后面的变量名是否为空,比如:rm -rf $MYDIDR/* 如果 $MYDIR为空,结果是灾难性的。
- 考虑使用 “find/while” 而不是 “for/find”。如:for F in $(find . -type f) ; do echo $F; done 写成 find . -type f | while read F ; do echo $F ; done 不但可以容忍空格,而且还更快。
- 防御式编程,在正式执行命令前,把相关的东西都检查好,比如,文件目录有没有存在。
sudo
/etc/sudoers
User_Alias ADMINS = user1, user2
ADMINS ALL= NOPASSWD: ALL
root ALL=(ALL) ALL
第一行 user1 和 user2 指定一个 ADMINS 别名
第二行 赋予它们权限 ALL = NOPASSWD:ALL 表示有 ADMINS 别名的用户可以运行 sudo 命令。该行中第二个 ALL 代表允许执行任何命令,第一个 ALL 表示允许在任何主机运行命令(如果你有多个主机,你可以针对某个主机或者某一组主机设置)
第三行 表示 root 用户能够在任何主机上执行任何命令。(ALL)表示 root 用户可以以任何用户的身份运行命令。你可以通过以下方式将(ALL)权限赋予有 ADMINS 别名的用户。将 (ALL) 加入到 /etc/sudoers 行,如下所示:
ADMINS ALL = (ALL) NOPASSWD: ALL
或者直接写成
user1 ALL=(ALL) NOPASSWD: ALL
user2 ALL=(ALL) NOPASSWD: ALL
visudo
可以使用 visudo 命令,该命令会在保存的时候做语法检查。
sysfs 设备路径
传统的 Unix /dev 目录为用户进程与使用内核支持的设备进行引用与交互提供了便利,但是它过于简单。/dev 目录中的文件包含有关设备的一些信息,但不是很详尽。另一个问题时内核根据其找到设备的顺序为设备文件命名,所以系统每次重新启动后,设备文件名有可能不同。
Linux 通过一个文件和目录系统提供 sysfs 界面,旨在基于硬件属性统一显示设备的相关信息。设备以 /sys/devices 为 root 路径。例如, /dev/vda 代表的硬盘在 sysfs 中的路径可能是:
/sys/devices/pci0000:00/0000:00:06.0/virtio1/block/vda
你可以看到,这个路径比文件名 /dev/vda 长很多,后者也是一个目录。但你实际上不能对比这两个路径,因为它们的作用不一样。 /dev 目录中的文件是供用户进程使用设备的,而 /sys/devices 中的文件是用来查看设备信息和管理设备用的。如果你打开上述设备路径,就能够看到类似的内容。
[root@server1 vda]# ls
alignment_offset cache_type dev discard_alignment hidden inflight mq queue removable serial slaves subsystem uevent
bdi capability device ext_range holders integrity power range ro size stat trace vda1
这些文件和子目录一般都是供程序而不是用户访问的,但你可以通过诸如 /dev 文件这样的例子来了解它们包含和代表的内容。运行命令 cat dev 会显示数字 253:0,这刚好是 /dev/vda 设备的主要和次要编号。
/sys 目录下有几个快捷方式。例如,/sys/block 目录中包含系统中的所有块设备文件,不过它们都是符号链接。运行命令 ls -l /sys/block 可以显示指向 sysfs 的实际路径。
在 /dev 目录中查看设备文件的 sysfs 路径不太方便,可以使用 udevadm 命令来查看路径和其他属性
[root@server1 vda]# udevadm info --query=all --name=/dev/vda
P: /devices/pci0000:00/0000:00:06.0/virtio1/block/vda
N: vda
S: disk/by-path/pci-0000:00:06.0
S: disk/by-path/virtio-pci-0000:00:06.0
E: DEVLINKS=/dev/disk/by-path/pci-0000:00:06.0 /dev/disk/by-path/virtio-pci-0000:00:06.0
E: DEVNAME=/dev/vda
E: DEVPATH=/devices/pci0000:00/0000:00:06.0/virtio1/block/vda
E: DEVTYPE=disk
E: ID_PART_TABLE_TYPE=dos
E: ID_PART_TABLE_UUID=89ee0607
E: ID_PATH=pci-0000:00:06.0
E: ID_PATH_TAG=pci-0000_00_06_0
E: MAJOR=253
E: MINOR=0
E: SUBSYSTEM=block
E: TAGS=:systemd:
E: USEC_INITIALIZED=5486273
udev
devtmpfs
内核根据需要创建设备文件,并且在新设备可用时通知 udevd。udevd 在收到通知后并不创建设备文件,而是进行设备初始化以及发送消息通知。此外还在 /dev 目录中为设备创建符号链接文件。你可以在 /dev/disk/by-id 目录中找到一些实例,其中每个影片对应一个或者多个文件。
[root@server1 ~]# ll /dev/disk/by-id/
total 0
lrwxrwxrwx 1 root root 9 Aug 20 18:25 ata-QEMU_DVD-ROM_QM00002 -> ../../sr0
lrwxrwxrwx 1 root root 10 Aug 28 11:53 dm-name-ceph--05bfb123--8120--490e--8879--a41dfcb5b508-osd--block--8aab2d56--7e42--4a68--8a1d--e5c46c42f19c -> ../../dm-2
lrwxrwxrwx 1 root root 10 Aug 28 11:53 dm-name-ceph--2384f7e2--bb44--452b--8663--d17e8bdb9cec-osd--block--425ac1b4--d870--4b1d--adae--23ca0b9d55c7 -> ../../dm-0
lrwxrwxrwx 1 root root 10 Aug 28 11:53 dm-uuid-LVM-Fd3Z3MeNpSiV7jSjMTD91KFoloKa4Uyr5WUZ8mHikV8OFHMvZjSOLiJ9E79vFVc3 -> ../../dm-2
lrwxrwxrwx 1 root root 10 Aug 28 11:53 dm-uuid-LVM-MAOi66IEsf6bhGVcQLGhTJq0BskoZd4gKzk1v7Eka1dSPCDMX8fgLID4cXYEvzSL -> ../../dm-0
lrwxrwxrwx 1 root root 9 Aug 20 18:25 lvm-pv-uuid-bkhsTb-LQrJ-U1fT-zGhY-3NJR-mE2c-NO5Ye9 -> ../../vdc
lrwxrwxrwx 1 root root 9 Aug 20 18:25 lvm-pv-uuid-dM9Qbx-lbzG-0RqE-hcBB-kqjK-oADj-XYQ5iM -> ../../vdb
lrwxrwxrwx 1 root root 9 Aug 25 09:13 virtio-disk-2tz3vimn -> ../../vdd
lrwxrwxrwx 1 root root 10 Aug 25 09:14 virtio-disk-2tz3vimn-part1 -> ../../vdd1
lrwxrwxrwx 1 root root 9 Aug 20 18:25 virtio-disk-apis1cul -> ../../vdb
lrwxrwxrwx 1 root root 9 Aug 20 18:25 virtio-disk-i289ndz9 -> ../../vdc
[root@server1 ~]# ll /dev/disk/by-path/
total 0
lrwxrwxrwx 1 root root 9 Aug 20 18:25 pci-0000:00:01.1-ata-1 -> ../../sr0
lrwxrwxrwx 1 root root 9 Aug 20 18:25 pci-0000:00:06.0 -> ../../vda
lrwxrwxrwx 1 root root 10 Aug 20 18:25 pci-0000:00:06.0-part1 -> ../../vda1
lrwxrwxrwx 1 root root 9 Aug 20 18:25 pci-0000:00:07.0 -> ../../vdb
lrwxrwxrwx 1 root root 9 Aug 20 18:25 pci-0000:00:08.0 -> ../../vdc
lrwxrwxrwx 1 root root 9 Aug 25 09:13 pci-0000:00:09.0 -> ../../vdd
lrwxrwxrwx 1 root root 10 Aug 25 09:14 pci-0000:00:09.0-part1 -> ../../vdd1
lrwxrwxrwx 1 root root 9 Aug 20 18:25 virtio-pci-0000:00:06.0 -> ../../vda
lrwxrwxrwx 1 root root 10 Aug 20 18:25 virtio-pci-0000:00:06.0-part1 -> ../../vda1
lrwxrwxrwx 1 root root 9 Aug 20 18:25 virtio-pci-0000:00:07.0 -> ../../vdb
lrwxrwxrwx 1 root root 9 Aug 20 18:25 virtio-pci-0000:00:08.0 -> ../../vdc
lrwxrwxrwx 1 root root 9 Aug 25 09:13 virtio-pci-0000:00:09.0 -> ../../vdd
lrwxrwxrwx 1 root root 10 Aug 25 09:14 virtio-pci-0000:00:09.0-part1 -> ../../vdd1
udevd 使用接口类型名称、厂商、型号、序列号以及分区(如果有的话)的组合来命名符号链接。
udevd 的操作和配置
udevd 的守护进程是这样工作的。
- 内核通过一个内部网络链接向 udevd 发送一个通知事件,称作 uevent。
- udevd 加载 uevent 中的所有属性信息
- udevd 通过规则解析来决定执行哪些操作和增加哪些属性信息。
规则文件位于 /lib/udev/rules.d 和 /etc/udev/rules.d 目录中。默认规则在 /lib 目录中,会被 /etc 中的规则覆盖。
[root@server1 rules.d]# cat /etc/udev/rules.d/80-max-sectors-blk.rules
KERNEL=="vd*[a-z]", ACTION=="add|change", SUBSYSTEM=="block", RUN+="/bin/sh -c '/bin/echo 512 > /sys/%p/queue/max_sectors_kb'"
上面是腾讯云主机的硬盘命名规则。
为磁盘设备分区
分区表有很多种,比较典型的一种叫主引导记录(Master Boot Record,MBR)。另一种逐渐普及的是全局唯一标识符分区表(Globally Unique Identifier Partition Table,GPT)。
分区工具
parted,支持 MBR 和 GPT
fdisk,只支持 MBR,不支持 GPT
parted 虽然也能够创建和操作文件系统,但是你最好不要使用它来操作文件系统,因为这样会引发一些混淆。分区操作和文件系统操作还是有本质的不同。分区表划分磁盘的区域,而文件系统侧重数据管理,因此我们使用 parted 分区,使用另外的工具来创建文件系统,parted 的文档中也是这样建议的。
# 查看分区表
parted -l
非交互式分区脚本
vim p.sh
#!/bin/bash
parted /dev/$1 mklabel gpt
parted /dev/$1 print
echo "Ignore" | parted /dev/$1 "mkpart primary ext4 0 -1"
mkfs.ext4 /dev/"$1"1
分区
./p.sh vdb
创建文件系统
mkfs -t ext4 /dev/vdb1
mkfs.ext4 /dev/vdb1
挂载文件系统
mount -t type device mountpoint
mount -t ext4 /dev/vdb1 /home.extra
umount mountpoint
mount -t vfat /dev/hda1 /doc -o ro,conf=auto
mount -o remount,rw /
文件系统 UUID
挂载文件系统使用设备名,但是设备名会根据内核发现设备的顺序而改变,因此你可以使用文件系统的通用唯一标识(Universally Unique Identifier, UUID)来挂载。UUID 是一系列的数字,并且保证每个唯一。mke2fs 这些文件系统创建程序在初始化文件系统数据结构时会生成一个 UUID。
blkid
[root@server1 ~]# blkid
/dev/vda1: UUID="659e6f89-71fa-463d-842e-ccdf2c06e0fe" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="89ee0607-01"
/dev/vdb: UUID="dM9Qbx-lbzG-0RqE-hcBB-kqjK-oADj-XYQ5iM" TYPE="LVM2_member"
/dev/vdc: UUID="bkhsTb-LQrJ-U1fT-zGhY-3NJR-mE2c-NO5Ye9" TYPE="LVM2_member"
/dev/vdd1: UUID="25d02774-0211-44ea-a198-a590cb93d782" TYPE="swap" PARTUUID="d6c186d0-01"
使用 UUID 挂载文件系统
mount UUID=25d02774-0211-44ea-a198-a590cb93d782 /home/extra
fstab
UUID=659e6f89-71fa-463d-842e-ccdf2c06e0fe / ext4 defaults 1
/dev/vdd1 swap swap defaults 0 0
172.21.16.14:/nfs /mnt/nfs nfs nfsvers=4.1,rw,proto=tcp 0 0
设备名
挂载点
文件系统类型
挂载选项
提供给 dump 命令使用的备份信息(应该总是使用 0)
文件系统完整性测试顺序:为了确保 fsck 总是第一个在 root 上运行,对 root 文件系统总是将其设置为1,硬盘上的其它文件系统设置为2。使用 0 来禁止其它启动检查,包括 CD-ROM、交换分区和 /proc 文件系统。
defaults:该选项使用 mount 的默认值——读写模式、启动设备文件、可执行、setuid 等等。如果你不想对任何列设置特殊值的话就应该使用该选项。
检查和修复文件系统
fsck /dev/vda1
特殊文件系统
/proc: 挂载在 /proc。包括大量的内核和硬件系统信息。
sysfs: 挂载在 /sys
tmpfs: 挂载在 /run 和其他位置。通过 tmpfs,你可以将物理内存和交换空间作为临时存储。
内核相关
内核参数
[root@worker1 ~]# cat /proc/cmdline
BOOT_IMAGE=(hd0,msdos1)/boot/vmlinuz-4.18.0-305.12.1.el8_4.x86_64 root=UUID=659e6f89-71fa-463d-842e-ccdf2c06e0fe ro crashkernel=auto console=ttyS0,115200 console=tty0 panic=5 net.ifnames=0 biosdevname=0 intel_idle.max_cstate=1 intel_pstate=disable
GRUB 配置信息
配置目录通常是 /boot/grub2
编辑完 /etc/default/grub 后,使用 sbin/grub2-mkconfig -o /boot/grub2/grub.cfg 重新生成配置文件。
systemd
查看 systemd 配置文件的搜索路径
UnitPath=/etc/systemd/system.control /run/systemd/system.control /run/systemd/transient /run/systemd/generator.early /etc/systemd/system /run/systemd/transient /run/systemd/generator.early /etc/systemd/system /run/systemd/system /run/systemd/generator /usr/lib/systemd/system
查漏补缺
/etc/nsswitch.conf 文件
掌管着一些域名相关的优先级设定。
hosts: files dns
files 在 dns 之前,表明先查找 /etc/hosts,后查找 DNS 服务器。
/etc/services
保存着一些常用端口及其服务的名字。