Linux系统排障总结

1   Bash终端

1.1   符号输入控制

  • ctrl+c:停止
  • ctrl+z:停止输入

2   基础命令

  • 关机:
    • poweroff(也是调用shutdown工具链实现)
    • halt(实际调用shutdown -h)
    • shutdown -h now
    • init 0(init是所有进程的祖先,他是Linux系统操作中不可缺少的程序之一。它的进程号始终为1,所以发送TERM信号给init会终止所有的用户进程,shutdown就是使用这种机制。init定义了8个运行级别(runlevel),init 0为关机,init 1为重启。)
  • 重启
    • reboot
    • shutdown -r now(root权限可使用)
    • init 1

3   包管理器

3.1   apt

3.1.1   apt update证书验证错误

错误信息:Certificate verification failed: The certificate is NOT trusted.

1
sudo apt install --reinstall ca-certificates

4   编译问题

4.1   编译环境的常规配置

以ubuntu举例,下载和更新相关的依赖:

1
2
3
4
apt update
apt upgrade
apt install linux‑headers‑amd64 # 若失败,则先通过上面两条更新系统(因为/etc/apt/sources.list 源 repo 没有目前系统内核的 header,被移除了)除非换 repo branch
apt install build‑essential

4.2   源码编译的程序的安装和卸载

常规的编译安装过程:

1
2
3
4
# 建议是添加prefix参数指定安装路径,日后卸载程序只需删除该目录以及删除软链接(如果有创建的话)
sudo ./configure --prefix=/path_to_install
sudo make -j32
make install

卸载方式:

  • 反安装target: make uninstall/distclean/veryclean
  • make install之后目录下有一个install_mainfest.txt的文件记录安装的所有内容:xargs rm < install_manifest.txt
  • 若未指定prefix且没有install_mainfest.txt,临时目录重新安装:./configure --prefix=/tmp/to_remove && make install,遍历/tmp/to_remove内的文件,把最初安装诶只的文件删除(缺点:部分文件夹可能无法删除,无法确定是系统安装或者源码编译安装)
  • debian系列linux可尝试使用auto-apt 和 checkinstall:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    apt install auto-apt checkinstall
    # 构建生成deb包
    auto-apt run ./configure
    make
    checkinstall
    # 完全卸载包,包名在checkinstall后有提示
    dpkg -r packagename
    # 用生成的deb包重新安装
    dpkg -i ***.deb
    # 列出包中安装的文件位置
    dpkg -L packagename
    # 检查是否安装成功
    dpkg -l | grep packagename
    # 同上
    apt list --installed | grep packagename

4.3   普通用户导致的编译问题

普通用户中如果在系统关键目录中,如/opt,执行sudo make可能会出现xxx command not found,这是因为有些命令在sudo下是不可见的,但如果不用sudomake又无法在这些路径生成文件。

解决方式:使用make -f参数指定makefile文件,让它在有权限的路径中工作。例如,将工作路径切到home目录中,make -f /opt/xxx/xxx/makefilemake可在home路径中生成文件。

4.4   常见编译错误

  • make /lib/modules/xxx/build no such file or directory:证明无 header
  • 在新系统上编译老驱动可能会遇到'SUBDIRS' was removed in Linux 5.3 Use 'M=' or 'KBUILD_EXTMOD=' instead:这代表驱动太老了,驱动代码的编译流程已不适合新系统。

5   账户管理

5.1   删除账户

1
2
userdel [-r] [user_account] # 切换到其他账户再执行,建议是root账户
userdel -r kin # 删除账户kin,-r参数是移除该账户的home目录和用户邮箱(mail spool)

5.2   自动root登录

1
2
3
4
gedit /etc/gdm/custom.conf
# 在daemon下添加
AutomaticLoginEnable=True
AutomaticLogin=root

5.3   重置密码(ubuntu为例)

  1. 进入到救援模式中,选择root选项(root Drop to root shell prompt),敲一次回车enter键显示:root@ubuntu:~#
  2. 重置密码命令:passwd 系统账户名,按提示输入两次密码确认
  3. exit退出shell,选择resume回到正常启动中。

5.4   帐号和密码文件(/etc/passwd和/etc/shadow)

Linux系统中,所有用户(包括系统管理员root)的账号和密码存储在/etc/passwd和/etc/shadow这两个文件中。其中,passwd保存的是账号,shadow保存的是账号的密码等信息(/etc/passwd只有root才可以修改的,/etc/shadow只有root才能查看)

5.4.1   /etc/passwd

示例:root:x:0:0:root:/root:/bin/bash

上面每一行都代表一个用户,每一行又通过[:]分为7个部分。

  1. 账号名称
  2. 为密码占位符(x表示该账户需要密码才能登录,为空时,账户无须密码即可登录)。原先用来保存密码的,现在密码都放在/etc/shadow中,所以这里显示x。
  3. UID,也就是使用者ID。默认的系统管理员的UID为0,我们添加用户的时候最好使用1000以上的UID,1-1000范围的UID最好保留给系统用。
  4. GID,也就是群组ID
  5. 关于账号的一些说明信息(暂时可以忽略)
  6. 账号的家目录,家目录就是你登陆系统后默认的那个目录
  7. 账号使用的shell。/bin/bash为可登录系统Shell,/sbin/nologin表示账户无法登录系统。

5.4.2   /etc/shadow

示例:root:!:15324:0:99999:7:::

上面每一行都代表一个用户,每一行又通过[:]分为9个部分。

  1. 账户名称(密码需要与账户对应的)
  2. 加密后的密码:如果这一栏的第一个字符为!或者*的话,说明这是一个不能登录的账户,从示例可看出ubuntu默认的就不启用root账户。(账户未设置密码时为空,设置密码后加密显示。!为无效哈希,系统会自动锁定这些账户并阻止登录,通过在/etc/passwd设置/bin/false或者/sbin/nologin实现禁止登录)
  3. 最近改动密码的日期:上次修改密码的时间距离1970年01月01日多少天
  4. 密码不可被变更的天数:设置了这个值,则表示从变更密码的日期算起,多少天内无法再次修改密码,如果是0的话,则没有限制
  5. 密码需要重新变更的天数:密码经常更换才能保证安全,为了提醒某些经常不更换密码的用户,可以设置一个天数,强制让用户更换密码,也就是说该用户的密码会在多少天后过期(默认位99999天,可以理解为永不过期)
  6. 密码过期预警天数:如果在5中设置了密码需要重新变更的天数,则会在密码过期的前多少天进行提醒,提示用户其密码将在多少天后过期
  7. 密码过期的宽恕时间:如果在5中设置的日期过后,用户仍然没有修改密码,则该用户还可以继续使用的天数
  8. 账号失效日期,过了这个日期账号就不能用了
  9. 保留未使用

5.4.3   /etc/shadow文件中密码的加密方式

示例:root:$1$Bg1H/4mz$X89TqH7tpi9dX1B9j5YsF.:14838:0:99999:7:::

示例的密码域:$1$Bg1H/4mz$X89TqH7tpi9dX1B9j5YsF.,密码域密文也是由三部分组成的,即:$id$salt$encrypted,详细参见linux标准源文件passwd.c中的pw_encrypt函数。

加密算法:明文密码和一个叫salt的东西通过函数crypt()完成加密

id为1时,采用md5进行加密;id为5时,采用SHA256进行加密;id为6时,采用SHA512进行加密。

得知加密方式,可以复制密文到相关工具上逆向破解:

6   硬盘和分区管理

6.1   挂载一个新硬盘

1
2
3
4
5
6
7
8
9
lsblk    #查看所有硬盘情况
df -lh #查看硬盘占用情况,以及挂载位置
sudo fdisk -l #查看硬盘分区情况
sudo fdisk /dev/sdb #给硬盘sdb创建分区
sudo mkfs.ext4 /dev/sdb #格式化硬盘sdb,并写入文件系统
sudo mkdir /mnt/pan #创建目录
sudo mount /dev/sdb /mnt/pan #将硬盘sdb挂载到 /mnt/pan 目录
sudo vim /etc/fstab # 设置开机自动挂载
/dev/sdb /mnt/pan ext4 defaults 0 0

6.2   将/home目录挂载到新分区(或新硬盘)

1
2
3
4
5
6
7
8
9
10
11
# 通过包管理器安装 gparted,进行新建分区或者格式化硬盘等操作。
sudo mkdir /mnt/home
sudo mount /dev/新分区 /mnt/home # 挂载新分区到/mnt/home
sudo rsync -aXS /home/ /mnt/home # a归档模式(递归传输并保持文件属性),X保持扩展属性
sudo mv /home /home_old
sudo mkdir /home
sudo umount /dev/新分区
sudo mount /dev/新分区 /home
blkid|grep /dev/新分区 # 查看新分区的uuid
sudo gedit /etc/fstab # 将新分区的uuid填入fstab
sudo rm -rf /home_old # 重启无异常,即可删除旧home目录

6.3   查看硬盘是不是固态硬盘(SSD)

1
2
3
4
5
# 0表明为ssd,1是机械
cat /sys/block/sda/queue/rotational

# 0表明为ssd,1是机械
lsblk -d -o name,rota

7   网络

7.1   查看网卡信息

查看ip信息:

  • windows:ipconfig /a
  • linux: ifconfig(配置网络接口)或者iwconfig(配置无线网络接口)

网卡名称解析:

  • lo:表示local
  • wl:表示wlan(Wireless Local Area Network)无线局域网
  • en:表示ethernet以太网
  • PCI接口的物理位置的坐标(bus, slot),其中bus表示总线,slot表示插槽

例子:

  • wlp3s0表示,WLAN PCI接口位置:bus=3, slot=0。
  • enp2s0表示,Etnernet PCI接口位置:bus=2, slot=0。

7.2   ubuntu配置网卡

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
sudo nano /etc/netplan/01-netcfg.yaml

# 静态ip设置示例
network:
version: 2
renderer: networkd
ethernets:
eth0:
addresses:
- 192.168.1.10/24
gateway4: 192.168.1.1
nameservers:
addresses: [8.8.8.8, 8.8.4.4]

# DHCP设置示例
network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: yes

# 应用网络配置
sudo netplan apply

7.3   ssh登录远程服务器

大部分系统都预装ssh程序客户端,方便连接其他ssh服务器使用,包括windows系统。如果需要设置作为被连接的ssh端,需要自行手动安装ssh的server。

连接命令:ssh 系统账户名@远程服务器ip,例如ssh root@192.168.1.1

查看ssh版本:ssh -V

7.3.1   Ubuntu开启ssh服务及允许root登录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sudo apt install openssh-server

# 修改/etc/ssh/sshd_config文件
sudo nano /etc/ssh/sshd_config

# 修改如下字段
#PermitRootLogin prohibit-password
PermitRootLogin yes

# 重启sshd服务
sudo systemctl restart sshd.service

#默认情况下,在Ubuntu 20.04上未设置root用户的密码,当尝试以root用户身份进行SSH登录时,将显示错误消息Permission denied,please try again。因此,我们需要设置root用户的密码。出现提示时,输入当前用户密码,然后输入新的根密码:
sudo passwd
# 输入两次密码确定即可

7.3.1.1   系统自启ssh服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 开机自动启动ssh命令
# 注意在恢复模式中设置sshd自启服务,再次重启到恢复模式中的话,仍然是未启动的,但是按正常模式启动会自启(ubuntu18.04的实测结论)
sudo systemctl enable ssh

# 关闭ssh开机自动启动命令
sudo systemctl disable ssh

# 单次开启ssh
sudo systemctl start ssh

# 单次关闭ssh
sudo systemctl stop ssh

#查看ssh是否启动,看到Active: active (running)即表示成功
sudo systemctl status ssh

# 检查 SSH 守护进程是否已经运行
systemctl status sshd

7.3.2   使用scp传递文件

windows和linux之间传输更推荐使用WinSCP工具。

  1. 下载安装PuTTY
  2. 在PuTTY安装路径中打开终端窗口
  3. 拷贝命令:pscp [Linux用户名]@[Linux服务器ip地址]:[Linux服务器源文件] [本地目标文件夹],示例:pscp d:\Old\test.jpg root@ipaddress:/var/www/html/

7.4   arch linux安装远程软件

P.S.配置好arch的“国内源”和“社区源”,安装yay。

  • 安装teamviewer
    1
    2
    3
    4
    5
    6
    #安装teamviewer
    yay -S teamviewer
    #启动服务
    sudo teamviewer daemon start
    sudo teamviewer daemon enable
    sudo teamviewer daemon restart
  • 安装todesk
    1
    2
    3
    4
    5
    #安装todesk
    yay -S todesk
    #启动服务
    sudo systemctl start todeskd.service
    sudo systemctl enable todeskd.service
  • 安装向日葵
    1
    2
    3
    4
    5
    #安装向日葵
    yay -S sunloginclient
    #启动服务
    sudo systemctl start runsunloginclient.service
    sudo systemctl enable runsunloginclient.service

P.S.若遇到todesk打开系统就注销的问题,尝试下先删除teamviewer再重新安装一下,之后再打开todesk测试(yay社区编译版本的todesk和teamviewer可能存在冲突)。

8   开机排障

8.1   ubuntu恢复模式(recovery mode)/linux救援模式(rescue mode)

救援模式相当于使用 SysV 作为默认的服务管理器的 Linux 发行版中的单用户模式。ubuntu和debian系列常用说法就是恢复模式,其他不同类的linux发行版更多常说救援模式。在救援模式下,将挂载所有本地文件系统,仅启动一些重要服务。但是,不会启动正常服务(例如网络服务)。一般系统无法正常启动时,进入该模式修复,例如重置root。

如果同时需要网络的话,在Recovery Menu中选择network模式即可。

  • 若硬盘挂载失败,会自动进入到救援模式中。修正fstab表中正确的硬盘uuid,之后正确恢复到
  • ubuntu摁一次esc键可以进入可grub选择界面,重复摁会导致无法进入的。进入到grub选择界面后,选择ubuntu的高级选项(Advanced options for Ubuntu)并选择recovery mode进入到救援模式。如果没有可选择的界面,尝试重启长摁SHIFT键或者shift+esc组合键看看,出现后可以使用上下方向键,防止自动读秒。

编辑grub进去到救援模式:

  1. 在grub选择菜单中,选择Ubuntu,按e键进入编辑模式
  2. 在以linux开头的一行末尾,删除字符串$vt_handoff并添加字符串systemd.unit=rescue.target
  3. 修改完成后,按Ctrl+X或者F10,在救援模式中启动
1
2
3
4
5
6
7
8
# 从救援模式切换到紧急模式
systemctl emergency

# 重启
systemctl reboot

# exit退出恢复模式,并选择recovery菜单中的resume选项
exit

8.2   ubuntu紧急模式

在紧急模式中不启动任何东西。没有服务启动、没有挂载点、没有建立套接字,什么也没有。只是一个原始的 shell。

从紧急模式切换到救援模式:systemctl rescue

编辑grub进去到救援模式:

  1. 在grub选择菜单中,选择Ubuntu,按e键进入编辑模式
  2. 在以linux开头的一行末尾,删除字符串$vt_handoff并添加字符串systemd.unit=emergency.target
  3. 修改完成后,按Ctrl+X或者F10,在救援模式中启动

8.3   开机出现initramfs(requires a manual fsck)

问题常见于以下常见场景:

  • 异常断电或者关机引起文件数据损坏
  • 系统无法启动
  • 连接的驱动器(包括闪存驱动器/SD卡这类设备)未按预期工作

解决方法:

1
2
3
# 查看提示中说明是哪个硬盘需要执行fsck修复(文件系统一致性检查),例如sda1
fsck /dev/sda1 -y
# 等执行到出现FILE SYSTEM WAS MODIFIED即可reboot系统

9   参考文献

[1] ubuntu开机出现initramfs(requires a manual fsck)解决办法[EB/OL]. https://www.cnblogs.com/yibeimingyue/p/14261416.html.
[2] 如何在 Ubuntu 18.04 中启动到救援模式或紧急模式[EB/OL]. https://zhuanlan.zhihu.com/p/53902139.
[3] Linux下如何查看一块硬盘是不是固态硬盘(SSD)[EB/OL]. https://blog.csdn.net/qq_42303254/article/details/89317618.
[4] Ubuntu 18.04 apt update failed for https repository[EB/OL]. https://askubuntu.com/questions/1229122/ubuntu‑18‑04‑apt‑update‑failed‑for‑https‑repository.
[5] 将/home 目录挂载到新分区(或新硬盘)[EB/OL]. https://blog.51cto.com/runixcn/4605838.
[6] ubuntu修改密码(详细版)「建议收藏」[EB/OL]. https://cloud.tencent.com/developer/article/2159425.
[7] Linux账号和密码文件 /etc/passwd和/etc/shadow[EB/OL]. https://www.cnblogs.com/fuyuanming/p/6519758.html.
[8] What means * and ! at second field of /etc/shadow?[EB/OL]. https://superuser.com/questions/623881/what-means-and-at-second-field-of-etc-shadow.
[9] SSH and locked users[EB/OL]. http://arlimus.github.io/articles/usepam/.
[10] Linux shadow文件中密码的加密方式[EB/OL]. https://www.cnblogs.com/7-58/p/13328148.html.
[11] 使用root ssh登录ubuntu22.4配置[EB/OL]. https://www.cnblogs.com/waldron/p/16864613.html.
[12] Windows连接ssh、scp到Ubuntu服务器[EB/OL]. https://blog.csdn.net/renshy5/article/details/117735410.
[13] Ubuntu下移动硬盘的分区、格式化、挂载操作[EB/OL]. https://zhuanlan.zhihu.com/p/397440213.
[14] Ubuntu ifconfig 查看网卡信息 lo enp2s0 wlp3s0 具体含义[EB/OL]. https://blog.csdn.net/wuyujin1997/article/details/105460929.
[15] arch linux 安装teamviewer,todesk,向日葵,远程软件方法[EB/OL]. https://www.jianshu.com/p/e4b61f754071.
[16] 怎么卸载用 make install 编译安装的软件?[EB/OL]. https://www.zhihu.com/question/20092756.
[17] Ubuntu网络配置:使用DHCP自动配置网卡[EB/OL]. https://blog.csdn.net/VqaEditor/article/details/133605050.
[18] The Ultimate Guide to Recovery and Rescue Mode in Ubuntu[EB/OL]. https://www.fosslinux.com/113044/the-ultimate-guide-to-recovery-and-rescue-mode-in-ubuntu.htm.
[19] 如何启动 Ubuntu 22.04 进入救援/紧急模式[EB/OL]. https://linux.cn/article-14750-1.html.