Linux系统与网络管理

黄玮

第三章:Linux服务器系统管理基础


System Administrator is root

Linux服务器管理员的典型工作场景和需求


远程管理工具箱



Visual Studio Code Remote - SSH


系统依赖条件


Windows 平台安装与配置


使用 git-bash 配置 SSH 免密登录

  1. 添加新的 SSH Targets
  2. 打开 git bash ,输入以下指令完成 git bash SSH 免密登录
  3. 在选择 SSH 配置文件 时,选择当前用户 家目录.ssh/config 用于保存远程主机配置信息
  4. VSCode 里连接新添加的远程 SSH 主机
# 检查是否已经生成过 SSH 公私钥对 id_rsa.pub 和 id_rsa
ls ~/.ssh/

# 如果没有上述 2 个文件时
# 生成 RSA 算法 4096 位秘钥长度的 SSH 公私钥对
# 否则,跳过当前步骤
ssh-keygen -t rsa -b 4096

# 配置免密登录
# 假设远程主机的连接信息为 cuc@192.168.56.161
ssh-copy-id -i ~/.ssh/id_rsa.pub cuc@192.168.56.161

# 连接验证免密登录配置成功
ssh cuc@192.168.56.161

配置示例截图


已知缺陷

# 验证 vscode 远程服务进程的内存占用率
ps -o pid,user,%mem,command ax | sort -b -k3 -r | head

tmux

# 开启一个tmux会话
tmux
# CTRL-B d 脱离(detach)当前tmux会话
# 再开启一个tmux会话
tmux
# CTRL-B d 再脱离(detach)当前tmux会话
# 查看当前可用的tmux会话列表
tmux ls
# 连接到会话编号0的会话
tmux attach -t 0
# 退出并关闭当前会话
exit

用tmux重做上一章的ping前后台执行方式实验

# 本实验建议通过SSH远程登录到虚拟机上执行
ping www.baidu.com 2>&1 1>/dev/null &
ping www.cuc.edu.cn 2>&1 1>/dev/null &
# 注意查看输出结果,观察ping进程的父进程是谁
pstree -A
# 此时退出SSH登录
exit
# 再重新SSH登录到虚拟机上执行
# 注意查看输出结果,观察ping进程的父进程是谁,和退出SSH登录之前相比是否有变化?
pstree -A
# 开启一个tmux会话
tmux
# 重复上述实验,用后台进程方式开启新的ping进程
# 再次SSH登录到虚拟机上执行
# 注意查看输出结果,观察ping进程的父进程是谁,和退出SSH登录之前相比是否有变化?
pstree -A

用户/组与权限管理



用户标识(uid)

id --help
id
id -g
id -u

查看和理解文件和目录的属主与权限

从🌰开始

$ ls -ld /tmp
drwxrwxrwt 8 root root 4096 Jan 20 15:26 /tmp

$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 54256 Mar 29  2016 /usr/bin/passwd

$ ls -l /etc/shadow
-rw-r----- 1 root shadow 941 Jan 16 12:37 /etc/shadow

问题来了:


文件类型

FreeBSD 的 man 手册页 ls 摘录


Saved UID (SUID)


Saved GID (SGID)


Sticky Bit


关于 SUID 和 SGID 的实践验证 🌰

asciicast


改变文件和目录的属主与权限

# 设置SUID
chmod 4755 filename

# 设置SGID
chmod 2755 dirname

# 同时设置SUID和SGID(罕见)
chmod 6755 filename

# 设置Sticky Bit
chmod 1755 dirname

sudo 的一些坑


shell 内部命令无法 sudo

cmds=(echo cd history getopts kill pwd); for cmd in "${cmds[@]}";do type -a "$cmd";done
# echo is a shell builtin
# echo is /usr/bin/echo
# echo is /bin/echo
# cd is a shell builtin
# history is a shell builtin
# getopts is a shell builtin
# kill is a shell builtin
# kill is /usr/bin/kill
# kill is /bin/kill
# pwd is a shell builtin
# pwd is /usr/bin/pwd
# pwd is /bin/pwd

以下场景不要 sudo

文件系统与存储管理



常规磁盘管理步骤

# 0. 使用管理员权限
sudo su -

# 1. 选择物理磁盘
lsblk

# 2. 创建分区 
fdisk {{/dev/sdX}}

# 3. 在指定分区上创建文件系统 
# 通过 Shell 「自动补全」功能查看当前支持的文件系统类型
# mkfs.<TAB><TAB>
mkfs -t {{ext4}} {{path/to/partition}}

# 4. 将分区挂载到指定目录 
mount -t {{filesystem_type}} {{path/to/device_file}} {{path/to/target_directory}}

逻辑卷管理 - LVM, Logical Volume Management

LVM利用Linux内核的device-mapper来实现存储系统的虚拟化(系统分区独立于底层硬件)。 通过LVM,你可以实现存储空间的抽象化并在上面建立虚拟分区(virtual partitions),可以更简便地扩大和缩小分区,可以增删分区时无需担心某个硬盘上没有足够的连续空间,LVM是用来方便管理的,不会提供额外的安全保证

配合存储硬件的Raid技术,提供高可靠性


LVM 的基本组成块(building blocks)


基于 LVM 的磁盘管理体系结构


基于 LVM 的磁盘管理步骤

# 0. 使用管理员权限
sudo su -

# 1. 选择物理磁盘
lsblk

# 2. 创建分区 
gdisk {{/dev/sdX}}

# 2.1. PV 管理阶段
# 2.1.1. 在物理分区上创建 PV
pvcreate {{/dev/sdX1}}

# 查看所有可用 PV
pvs
pvscan

# 2.2. VG 管理阶段
# 2.2.1. 创建 VG
# 以下例子将 3 个物理分区加入到一个名为 ubuntu-vg 的 VG
vgcreate {{ubuntu-vg}} {{/dev/sda1}} {{/dev/sdb1}} {{/dev/sdc1}}

# 2.2.2. 从指定 VG 中移除一个 PV
vgreduce {{ubuntu-vg}} {{/dev/sdc1}}

# 2.2.3. 将一个 PV 加入到一个指定 VG 中
vgextend {{ubuntu-vg}} {{/dev/sda5}}

# 查看 VG 详细信息
vgdisplay

# 2.3. LV 阶段
# -L 指定分区大小,-n 指定逻辑分区名称
lvcreate -L 10G -n {{demo-lv}} {{ubuntu-vg}}
lvcreate -l {{100%FREE}} -n {{demo-lv}} {{ubuntu-vg}}

# 查看 LV 详细信息
lvdisplay
# --- Logical volume ---
#   LV Path                /dev/ubuntu-vg/demo-lv
#   LV Name                demo-lv
#   VG Name                ubuntu-vg
#   LV UUID                FKJDB5-KJkj-aIp1-t5BR-lp1w-68Yb-BVor5k
#   LV Write Access        read/write
#   LV Creation host, time cuc-lab, 2021-03-19 13:36:21 +0000
#   LV Status              available
#   # open                 0
#   LV Size                <29.50 GiB
#   Current LE             7551
#   Segments               1
#   Allocation             inherit
#   Read ahead sectors     auto
#   - currently set to     256
#   Block device           253:1

# 3. 在指定分区上创建文件系统 
# 通过 Shell 「自动补全」功能查看当前支持的文件系统类型
# mkfs.<TAB><TAB>
# 此处 {{path/to/partition}} 对应 lvdisplay 输出信息里的 LV Path 字段值
mkfs -t {{ext4}} {{path/to/partition}}

# 4. 将分区挂载到指定目录 
mkdir -p {{path/to/target_directory}}
mount -t {{filesystem_type}} {{path/to/device_file}} {{path/to/target_directory}}

# 5. 调整分区大小
# 5.1. 卸载指定 LVM 分区
umount {{path/to/device_file}}

# 5.2. 检查 ext2/ext3/ext4 分区是否有损坏
e2fsck -f {{path/to/device_file}}

# 5.3. 分区扩容
lvresize --size +{{120G}} --resizefs {{volume_group}}/{{logical_volume}}
lvresize --size {{100}}%FREE {{volume_group}}/{{logical_volume}}

# 5.4. 分区缩减(可能会由于缩减后存储容量不足导致数据丢失)
lvresize --size -{{120G}} --resizefs {{volume_group}}/{{logical_volume}}

LVM 优点(1/2)


LVM 优点(2/2)

这些优点使得LVM对服务器的管理非常有用,对于桌面系统管理的帮助则没有那么显著,你需要根据实际情况进行取舍。


LVM 缺点

文件备份 - 文件打包


文件备份 - 文件归档


文件恢复


系统备份


备份策略设计约束性因素


备份策略设计约束性因素


系统备份与恢复

开机自启动项管理



Systemd - 目前主流发行版支持情况


Systemd - 特性(优点)


Systemd - 争议


Systemd - 架构

动手实战Systemd


NetPlan


又一个「网络配置管理」工具

设计用于「替代」经典 Linux 网络管理工具 ifupdown


哪些发行版本在用


快速上手


配置示例

# https://netplan.io/examples#using-dhcp-and-static-addressing
# https://netplan.io/reference
# https://github.com/CanonicalLtd/netplan/tree/master/examples
network:
  version: 2
# renderer: NetworkManager
  renderer: networkd
  ethernets:
    enp3s0:
      dhcp4: true 
    enp5s0:
      addresses:
        - 10.10.10.2/24
      match:
        macaddress: 56:2d:d1:8e:62:17
      gateway4: 10.10.10.1
      nameservers:
          search: [mydomain, otherdomain]
          addresses: [10.10.10.1, 1.1.1.1]

新的网卡命名风格

enp3s0


摘自 udev/udev-builtin-net_id.c

/* http://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames
 *
 * Two character prefixes based on the type of interface:
 *   en — Ethernet
 *   ib — InfiniBand
 *   sl — serial line IP (slip)
 *   wl — wlan
 *   ww — wwan
 *
 * Type of names:
 *   b<number>                             — BCMA bus core number
 *   c<bus_id>                             — bus id of a grouped CCW or CCW device,
 *                                           with all leading zeros stripped [s390]
 *   o<index>[n<phys_port_name>|d<dev_port>]
 *                                         — on-board device index number
 *   s<slot>[f<function>][n<phys_port_name>|d<dev_port>]
 *                                         — hotplug slot index number
 *   x<MAC>                                — MAC address
 *   [P<domain>]p<bus>s<slot>[f<function>][n<phys_port_name>|d<dev_port>]
 *                                         — PCI geographical location
 *   [P<domain>]p<bus>s<slot>[f<function>][u<port>][..][c<config>][i<interface>]
 *                                         — USB port number chain
 *   v<slot>                               - VIO slot number (IBM PowerVM)
 *   a<vendor><model>i<instance>           — Platform bus ACPI instance id
 */

其他过时的知名网络管理工具


net-tools 已过时,iproute2 是现在。

Most network configuration manuals still refer to ifconfig and route as the primary network configuration tools, but ifconfig is known to behave inadequately in modern network environments. They should be deprecated, but most distros still include them.


过时命令 net-tools 替代命令 iproute2
arp ip n (ip neighbor)
ifconfig ip a (ip addr), ip link, ip -s (ip -stats)
iwconfig iw
nameif ip link, ifrename
netstat ss
netstat -i ip -s link
netstat -r ip route
netstat -g ip maddr
route ip r (ip route)

不同发行版的不同网络管理方案流派


网络管理方案流派

  1. ifconfig/route
  2. iproute2
  3. NetworkManager
  4. systemd-networkd
  5. netplan

以 Debian 系发行版为例

Linux 发行版 桌面版 服务器版
Ubuntu 22.04 NetworkManager(默认)
netplan 或 systemd-networkd(可选)
netplan(默认)
NetworkManager 或 systemd-networkd(可选)
Debian 11 NetworkManager(默认)
ifupdown、iproute2 或 systemd-networkd(可选)
ifupdown(默认)
iproute2、NetworkManager 或 systemd-networkd(可选)

本章完成后的自查清单


参考文献