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 | apt update |
4.2   源码编译的程序的安装和卸载
常规的编译安装过程:
1 | # 建议是添加prefix参数指定安装路径,日后卸载程序只需删除该目录以及删除软链接(如果有创建的话) |
卸载方式:
- 反安装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
15apt 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
下是不可见的,但如果不用sudo
,make
又无法在这些路径生成文件。
解决方式:使用make -f
参数指定makefile
文件,让它在有权限的路径中工作。例如,将工作路径切到home
目录中,make -f /opt/xxx/xxx/makefile
,make
可在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 | userdel [-r] [user_account] # 切换到其他账户再执行,建议是root账户 |
5.2   自动root登录
1 | gedit /etc/gdm/custom.conf |
5.3   重置密码(ubuntu为例)
- 进入到救援模式中,选择root选项(root Drop to root shell prompt),敲一次回车enter键显示:
root@ubuntu:~#
- 重置密码命令:
passwd 系统账户名
,按提示输入两次密码确认 - 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个部分。
- 账号名称
- 为密码占位符(x表示该账户需要密码才能登录,为空时,账户无须密码即可登录)。原先用来保存密码的,现在密码都放在/etc/shadow中,所以这里显示x。
- UID,也就是使用者ID。默认的系统管理员的UID为0,我们添加用户的时候最好使用1000以上的UID,1-1000范围的UID最好保留给系统用。
- GID,也就是群组ID
- 关于账号的一些说明信息(暂时可以忽略)
- 账号的家目录,家目录就是你登陆系统后默认的那个目录
- 账号使用的shell。/bin/bash为可登录系统Shell,/sbin/nologin表示账户无法登录系统。
5.4.2   /etc/shadow
示例:root:!:15324:0:99999:7:::
上面每一行都代表一个用户,每一行又通过[:]分为9个部分。
- 账户名称(密码需要与账户对应的)
- 加密后的密码:如果这一栏的第一个字符为!或者*的话,说明这是一个不能登录的账户,从示例可看出ubuntu默认的就不启用root账户。(账户未设置密码时为空,设置密码后加密显示。!为无效哈希,系统会自动锁定这些账户并阻止登录,通过在/etc/passwd设置/bin/false或者/sbin/nologin实现禁止登录)
- 最近改动密码的日期:上次修改密码的时间距离1970年01月01日多少天
- 密码不可被变更的天数:设置了这个值,则表示从变更密码的日期算起,多少天内无法再次修改密码,如果是0的话,则没有限制
- 密码需要重新变更的天数:密码经常更换才能保证安全,为了提醒某些经常不更换密码的用户,可以设置一个天数,强制让用户更换密码,也就是说该用户的密码会在多少天后过期(默认位99999天,可以理解为永不过期)
- 密码过期预警天数:如果在5中设置了密码需要重新变更的天数,则会在密码过期的前多少天进行提醒,提示用户其密码将在多少天后过期
- 密码过期的宽恕时间:如果在5中设置的日期过后,用户仍然没有修改密码,则该用户还可以继续使用的天数
- 账号失效日期,过了这个日期账号就不能用了
- 保留未使用
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 | lsblk #查看所有硬盘情况 |
6.2   将/home目录挂载到新分区(或新硬盘)
1 | # 通过包管理器安装 gparted,进行新建分区或者格式化硬盘等操作。 |
6.3   查看硬盘是不是固态硬盘(SSD)
1 | # 0表明为ssd,1是机械 |
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 | sudo nano /etc/netplan/01-netcfg.yaml |
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 | sudo apt install openssh-server |
7.3.1.1   系统自启ssh服务
1 | # 开机自动启动ssh命令 |
7.3.2   使用scp传递文件
- 下载安装PuTTY
- 在PuTTY安装路径中打开终端窗口
- 拷贝命令:
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进去到救援模式:
- 在grub选择菜单中,选择
Ubuntu
,按e键进入编辑模式 - 在以
linux
开头的一行末尾,删除字符串$vt_handoff
并添加字符串systemd.unit=rescue.target
- 修改完成后,按Ctrl+X或者F10,在救援模式中启动
1 | # 从救援模式切换到紧急模式 |
8.2   ubuntu紧急模式
在紧急模式中不启动任何东西。没有服务启动、没有挂载点、没有建立套接字,什么也没有。只是一个原始的 shell。
从紧急模式切换到救援模式:systemctl rescue
编辑grub进去到救援模式:
- 在grub选择菜单中,选择
Ubuntu
,按e键进入编辑模式 - 在以
linux
开头的一行末尾,删除字符串$vt_handoff
并添加字符串systemd.unit=emergency.target
- 修改完成后,按Ctrl+X或者F10,在救援模式中启动
8.3   开机出现initramfs(requires a manual fsck)
问题常见于以下常见场景:
- 异常断电或者关机引起文件数据损坏
- 系统无法启动
- 连接的驱动器(包括闪存驱动器/SD卡这类设备)未按预期工作
解决方法:
1 | # 查看提示中说明是哪个硬盘需要执行fsck修复(文件系统一致性检查),例如sda1 |
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.