
1. 先说清楚统信UOS、银河麒麟和Ubuntu的命令到底是不是一套刚接手统信UOS或者银河麒麟的机器很多人第一反应是这不就是个Linux吗命令我熟。结果敲下第一条apt install的时候终端回你一句 command not found或者更尴尬——命令能跑但装完的东西跟桌面上显示的版本对不上。这种落差我遇到过不止一次尤其是从Ubuntu一路用过来的老用户最容易在国产系统上想当然。这篇东西就是把这些年积累的Linux常用命令做一次系统梳理重点讲清楚三个问题统信UOS、麒麟系统这些国产发行版跟你熟悉的Ubuntu到底是不是同一套命令体系哪些命令可以放心照搬哪些必须换写法以及在实际排障、部署、日常维护中哪几条命令是真正高频、真正能救命的。适合谁来读如果你刚接触统信UOS或麒麟系统的运维、开发、测试或者你是个Linux新手想一次性把常用命令的脉络理清楚那这篇基本够用。老手也可以直接跳到包管理和文本处理那几节看看有没有值得抄的写法。1.1 同源不同宗内核与用户态的分层理解要理解命令为什么有的通用、有的不通得先把Linux这个体系拆成两层来看。最底下是内核层也就是Linux Kernel。统信UOS、银河麒麟、Ubuntu、Debian、CentOS这些发行版用的都是同一套Linux内核只是版本号和打了哪些补丁不一样。内核对外提供的系统调用system call是稳定的所以凡是直接依赖内核接口的命令行为基本一致。比如uname看内核版本、lsblk看块设备、ps看进程、mount挂载文件系统这些命令在任何发行版上跑出来的结果格式可能略有差异但语义完全一样。往上一层是用户态也就是GNU工具集、shell、各种命令的可执行文件再加上包管理器、初始化系统、桌面环境。这一层就是发行版之间分道扬镳的地方。同样是看目录ls在Ubuntu和UOS上都是GNU coreutils提供的参数一模一样但同样是装软件Ubuntu用apt麒麟的服务器版可能用yum或者dnf而麒麟的桌面版和统信UOS又是基于Debian的apt。这就是同源不同宗的真正含义。我见过最典型的误判是有人把银河麒麟高级服务器操作系统当成了Ubuntu来操作。桌面版和服务器版在包管理器上的选择并不完全统一具体得看发行版本和底层构建。我的做法是拿到一台陌生机器第一件事永远是敲这几条cat /etc/os-release uname -r which apt dnf yum rpm dpkg 2/dev/null echo $SHELL第一行看发行版标识第二行看内核版本第三行一次性确认这台机器上到底有哪些包管理工具可用第四行确认当前用的是bash还是别的shell。这四句话花不了五秒钟但能帮你省掉后面半小时的试错。1.2 包管理器分家带来的连锁反应包管理器是命令差异的最大来源没有之一。Linux世界的包管理主要分两大流派。Debian系用.deb包工具是dpkg和aptUbuntu、Debian、统信UOS、深度Deepin都属于这一派。RPM系用.rpm包工具是rpm和yum/dnfRedHat、CentOS、Fedora、openEuler以及部分麒麟服务器版本属于这一派。这个分家带来的连锁反应很广。装一个NginxDebian系是apt install nginxRPM系是dnf install nginx配置文件默认路径也可能不同服务的启动方式Debian系传统上用service现在统一到systemctl但老旧系统上两套都还在。更隐蔽的是依赖处理方式的差异。dpkg -i装一个本地deb包如果依赖缺失它会直接报错并且停在半路而apt install ./package.deb会自动把依赖一起装上。RPM系里rpm -ivh同样不解决依赖dnf localinstall才会。我今年年初帮人部署一套内网系统就因为在麒麟服务器上用了rpm -ivh装一个离线包缺了三个依赖卡了快一个小时才反应过来该用dnf。1.3 一张对照表哪些命令可以直接照搬不用记太多下面这张表覆盖了日常最高频的场景Debian系和RPM系的写法对照着看就行。操作场景Debian系Ubuntu/UOS/DeepinRPM系麒麟服务器/CentOS/openEuler更新软件源索引apt updatednf makecache或yum makecache升级已装软件apt upgradednf upgrade安装软件apt install 包名dnf install 包名卸载软件apt remove 包名dnf remove 包名搜索软件apt search 关键词dnf search 关键词查看已装包dpkg -lrpm -qa查某个文件属于哪个包dpkg -S 文件名rpm -qf 文件名查软件装了哪些文件dpkg -L 包名rpm -ql 包名装本地包apt install ./x.debdnf localinstall x.rpm推送到运维群里的脚本最好别假设对方的包管理器。我的习惯是写一个探测函数先判断命令存不存在再决定走哪条分支这样同一份脚本扔到UOS或者麒麟服务器上都能跑。2. 目录穿梭与文件操作每天都要敲的那二十条命令命令行最基础也最容易被忽视的部分就是文件和目录操作。之所以说容易被忽视是因为大部分人只记得住cd、ls、rm这几个真到了批量处理、跨目录查找的时候就开始一个个手敲效率低得离谱。这一节我把高频命令按使用频率和使用场景重新排一遍顺带讲讲参数背后的逻辑。2.1 cd、pwd、ls 里的细节比你想的多cd谁都会但几个快捷写法值得单独拎出来。cd -回到上一个目录在两个目录之间反复切换的时候特别爽cd ~回家目录cd ..上一级。这三个组合起来能省下大量敲路径的时间。pwd用来打印当前绝对路径。看着简单但在写脚本的时候它是保命命令——很多脚本挂掉就是因为相对路径算错了而pwd能帮你第一时间确认自己站在哪。要拿到脚本自身所在目录用cd $(dirname $0) pwd这行组合拳比直接用pwd更稳。ls是最被低估的命令。我日常用得最多的参数组合是ls -alh --time-stylelong-iso-a显示隐藏文件-l长格式-h让文件大小带单位KB、MB--time-stylelong-iso把时间格式统一成年-月-日 时:分不会像默认那样因为文件新旧而变格式看起来清爽得多。长格式输出的九个权限位从左到右每三位一组分别是属主、属组、其他人的rwx权限。第一位如果显示成d就是目录l是软链接-是普通文件。这个细节在排查为什么我改不了这个文件的时候是第一步依据。还有一个用得少但很好用的ls -i显示inode号。当两个看起来不相关的目录里出现了同一份文件看inode号就能判断是不是硬链接。2.2 创建、复制、移动、删除的边界在哪mkdir -p /path/a/b/c一次把多级目录建出来加-p的好处是父目录已存在也不报错脚本里几乎必加。cp和mv的坑集中在覆盖行为和递归上。默认情况下cp会静默覆盖目标文件这在批量操作里非常危险。我的做法是日常加-i覆盖前询问脚本里用-f强制不询问并且明确知道自己在干什么。复制目录必须加-r想保留权限、时间戳、软链接用-acp -a /data/app /backup/app_$(date %F)这行是备份的标准写法-a等价于-dR --preserveall能完整保留文件属性。rm是真正需要敬畏的命令。rm -rf加错一个变量比如rm -rf $DIR/而$DIR恰好为空就等于rm -rf /。防这一手的办法很土但有效在脚本开头判断变量非空或者干脆改用rm -rf ${DIR:?variable is empty}变量为空时直接中止而不执行。移到回收站而不是直接删也是个思路。命令行下装trash-cli之后可以用trash代替rm误删还能捞回来。2.3 find 与 xargs 组合起来才是真本事find单独用只能查配上-exec或者管道给xargs才能干活。几个我常用的写法# 找出7天前的日志并删除 find /var/log -name *.log -mtime 7 -delete # 找出大于100M的文件 find / -type f -size 100M -exec ls -lh {} \; # 批量给sh文件加执行权限 find /opt/scripts -name *.sh -exec chmod x {} \;-mtime 7表示修改时间在7天以前-mtime -7是7天以内。和-这两个符号特别容易记反我自己的记忆口诀是加号是过去减号是最近。-exec结尾的{}是占位符\;表示对每个文件单独执行一次命令。如果文件很多用代替\;会一次性把多个文件传给命令效率高得多但前提是你执行的那个命令支持多参数比如chmod、rm可以mv到固定目标就不行。用xargs的时候务必加-0配合find -print0因为文件名里如果带空格或换行不加-0会被当成多个文件名这是批量删文件时最容易出的安全事故find /data -name *.tmp -print0 | xargs -0 rm -f2.4 压缩解压与国产系统上的乱码问题tar的参数组合我建议直接背固定格式别每次都现推。tar -zcvf backup.tar.gz /data/app # 打包并压缩 tar -zxvf backup.tar.gz # 解压 tar -jxvf backup.tar.bz2 # 解压bz2 tar -Jxvf backup.tar.xz # 解压xz记忆方式是-c创建、-x解压、-v显示过程、-f指定文件名必须放最后。z是gzipj是bzip2J是大写的xz。国产系统上最常见的幺蛾子是解压Windows传过来的zip压缩包后中文文件名变成乱码。原因是Windows的zip默认用GBK编码而Linux默认用UTF-8。解决办法是解压时指定编码unzip -O GBK windows_file.zip unzip -O GB18030 windows_file.zip如果unzip版本太老不支持-O可以用7z7z x -mcp936 windows_file.zip其中936就是GBK的代码页。反过来Linux打包的zip到Windows上乱码就用zip -r时确保文件名已经是UTF-8或者干脆传tar.gz跨平台兼容性更好。3. 权限、账户与提权最容易出事的一段权限相关的问题是新手到老手都绕不过去的坎。表面上看chmod 755、chown user:group就完事了但真正踩过坑的人都知道拒绝访问和权限不够背后可能是一整套账户体系没理清楚。这一节我从账户创建讲到提权把这条链路补全。3.1 用户与用户组的增删改查创建用户最常用的两条useradd -m -s /bin/bash deploy passwd deploy-m表示同时创建家目录不加的话用户登进去发现没有家目录各种配置写不进去。-s指定登录shell不指定的话有些系统默认给/sbin/nologin用户根本登不上。创建完必须passwd设密码useradd本身不设密码。修改现有用户用usermodusermod -aG docker deploy # 追加到docker组 usermod -s /bin/bash deploy # 改登录shell usermod -L deploy # 锁定账户 usermod -U deploy # 解锁账户-aG里的-a是append没有-a只写-G会把用户从原有所有附加组里踢出来只保留你新写的那个组。这个坑我见过至少三个人踩过后果是用户的sudo权限莫名其妙没了。记住追加用-aG覆盖用-G。查看用户信息用id deploy能看到uid、gid和所属的附加组列表比翻/etc/passwd快得多。查某个组里有哪些人用getent group docker。删除用户用userdel deploy加-r会连家目录一起删。慎重家目录里的数据没了就真没了。3.2 chmod 数字法与符号法的取舍chmod有两套写法数字法和符号法。数字法是把rwx分别当成4、2、1相加。比如755就是属主rwx4217、属组r-x4015、其他人r-x5。符号法是chmod ux file、chmod g-w file这种。日常改单个文件权限符号法更安全因为它只动你点名的那一位不会误伤其他权限位。比如给脚本加执行权限chmod x run.sh比chmod 755 run.sh更好因为前者只加执行位后者会把权限强制改成755万一原来有别的特殊权限就被抹掉了。批量处理和写文档的时候数字法更简洁。几个常用值权限值含义典型用途644rw-r--r--普通配置文件755rwxr-xr-x可执行脚本、目录600rw-------私钥、密码文件700rwx------用户私有目录777rwxrwxrwx几乎不用坚决避免说到777网上遇到问题就让人chmod 777的说法非常害人。它等于把所有权限敞开任何用户都能改你这份文件安全上完全裸奔。正确的做法是先搞清楚到底是谁需要什么权限只给必需的那一位。比如Web服务器读不到上传目录通常是属主不对改chown就够了不是加权限。目录权限还有特殊之处目录上的x位表示能否进入r位表示能否列出内容。所以一个目录如果只有r没有x你能看到里面有啥但进不去只有x没有r你能进去但列不出内容。这个区别在排查Web目录的403错误时特别有用。3.3 chown 与 chgrp 和递归操作的陷阱chown改属主chgrp改属组可以合并成chown user:group file。递归目录加-Rchown -R www-data:www-data /var/www/html-R的陷阱在于它会连软链接指向的目标一起改。如果要保留软链接本身用-h如果目录里有挂载点-R可能跨越文件系统边界导致意料之外的修改。稳妥的做法是加-xdev限制在同一文件系统内。还有一个现实问题国内很多系统里的Web服务用户名不一定是www-data。Ubuntu上Nginx默认是www-dataCentOS系通常是nginx麒麟上可能因为安全加固而不同。拿不准就用ps aux | grep nginx看进程是哪个用户跑的再决定chown给谁。3.4 sudo、su 与 root 账户的差异su是切换用户su -是切换并加载目标用户的环境变量和家目录路径。不加横杠的话你会顶着root的权限但保留着原用户的环境变量导致很多命令找不到路径这是新手最常见的困惑来源。sudo是以其他身份执行单条命令默认是root。它的好处是不用知道root密码靠/etc/sudoers里的授权规则判断。编辑sudoers必须用visudo不能直接vim因为visudo会检查语法写错了会拒绝保存。直接改坏sudoers会导致所有sudo命令失效只能进单用户模式抢救。现代桌面版Linux包括UOS和麒麟的桌面版默认通常禁用root直接登录普通用户通过sudo提权。这样设计是出于安全考虑但代价是有些老脚本里写死了su root就会失败。如果真遇到忘记密码、进不去系统的情况思路是进单用户模式或者用启动参数进恢复模式再重置密码。这里有个前提能物理接触到机器或者有虚拟机的控制台权限。云服务器和远程机器上没法这么操作重置密码得靠服务商的控制台功能。而且有些系统在恢复模式下会要求输入root密码如果没有预设还得走更底层的启动参数修改普通用户不建议自己折腾。4. 软件包管理apt、dpkg、rpm、dnf 的分工与对照包管理这块前面点了个题这一节展开讲。因为装软件是绕不开的第一步很多人在国产系统上受挫都是从这里开始的。4.1 Debian系的两把工具apt 与 dpkgdpkg是底层工具直接操作.deb包apt是高层封装负责从软件源下载、解决依赖、调用dpkg安装。理解这个分层很关键想装本地已有的deb文件dpkg -i xxx.deb可以但依赖缺失它不管。想装本地deb并自动装依赖用apt install ./xxx.deb注意./不能省否则apt会当成远程包名去源里找。想看某个已装软件装了哪些文件dpkg -L 包名。想反查某个文件属于哪个软件包比如nginx命令装在哪了dpkg -S $(which nginx)。apt的常用组合apt update # 刷新源索引 apt list --upgradable # 列出可升级的包 apt upgrade # 升级不删包 apt full-upgrade # 升级可删包解决依赖 apt install -y 包名 # 免确认安装 apt remove 包名 # 卸载保留配置 apt purge 包名 # 卸载并删配置 apt autoremove # 清理无用依赖 apt clean # 清理下载的deb缓存remove和purge的区别值得记remove只删软件本体配置文件还留着重装后配置还在purge连配置一起删适合彻底重来。4.2 RPM系的 rpm 与 dnf/yum 怎么配合rpm和dpkg是对应关系dnf新一代和yum老一代很多情况下是dnf的软链对应apt。rpm -qa # 列出所有已装rpm包 rpm -ql 包名 # 查包装了哪些文件 rpm -qf /usr/bin/xxx # 反查文件属于哪个包 rpm -ivh xxx.rpm # 装本地包不解决依赖 rpm -Uvh xxx.rpm # 升级安装 rpm -e 包名 # 卸载 dnf install -y 包名 # 装包并解决依赖 dnf localinstall xxx.rpm # 装本地rpm并解决依赖 dnf remove 包名 dnf makecache # 刷新元数据缓存rpm -ivh里的i是installv显示过程h显示进度条。装本地包时如果缺依赖它会明确告诉你缺哪些你可以照着一个个手动补或者改用dnf自动补。麒麟系统上还有个现实问题部分版本默认没有启用软件源或者源的地址在内网。这种情况下dnf install会连不上得先检查/etc/yum.repos.d/下的repo文件确认baseurl写的是不是可达的地址。内网环境通常有本地源镜像配好之后速度反而比公网快。4.3 离线安装与本地源的落地思路生产环境经常是断网的这时候只能靠离线包。完整流程是这样的第一步在能联网的同版本机器上下载软件和依赖。Debian系有个好用的命令apt-get install --download-only -o Dir::Cache::archives/tmp/pkgs 包名它会把包和依赖都下载到指定目录不安装。RPM系可以用dnf download加--resolve把依赖一并拉下来或者用dnf install --downloadonly --downloaddir/tmp/pkgs 包名。第二步把整个目录拷到目标机器。Debian系直接在目录里dpkg -i *.deb注意顺序问题依赖包要先装实在搞不定就用apt install ./*.deb让它自己排序。RPM系用dnf localinstall *.rpm。第三步如果离线包要长期复用可以搭一个本地源。Debian系建仓库用dpkg-scanpackagesRPM系用createrepo。这个稍微重一点适合在运维层面做一次投入、长期收益的场景。实测下来离线安装最容易卡住的不是包本身而是依赖的循环和版本锁。比如A依赖BB又依赖A的某个特定版本apt能解手动dpkg就可能陷入死循环。遇到这种情况别硬啃直接换用apt install ./*.deb这种整体解依赖的方式。5. 磁盘、进程、服务、网络排障四条主线机器出问题的时候排查路径基本离不开四条线磁盘满没满、进程挂没挂、服务起没起、网络通不通。这四件事各有一组命令掌握了就能覆盖绝大部分线上故障。5.1 磁盘空间与挂载从 df 到 du 的定位链磁盘满了是Linux上最高频的故障没有之一。排查流程固定df -h # 看各分区使用率 df -i # 看inode使用率 du -sh /var/* # 逐层下钻找大目录 du -sh /var/* | sort -rh | head -10 # 排序取前10df -h的-h是human-readable自动带单位。如果发现某个分区100%了先看是空间满还是inode满。inode满的情况特别隐蔽——磁盘明明还有空间但创建不了新文件因为inode耗尽了。典型原因是某个目录里堆了几十万个小文件比如缓存或者未清理的日志。du逐层下钻的做法是先du -sh /下的每个一级目录找到最大的那个再进去继续下钻。配合sort -rh可以快速排序。这个命令组合慢但定位准。还有个常见现象是df显示已满但du统计出来对不上。这种情况通常是文件被删除但进程还持有文件句柄空间没释放。用lsof | grep deleted找到占用进程重启对应服务就释放了。挂载相关lsblk # 树状显示所有块设备 mount # 查看已挂载的文件系统 mount /dev/sdb1 /mnt/data # 挂载 umount /mnt/data # 卸载 blkid # 查设备的UUID要永久挂载编辑/etc/fstab建议用UUID而不是设备名因为设备名sdb1这种在重启后可能变。5.2 进程查看与终止ps aux # 查看所有进程 ps -ef --forest # 树状结构看父子关系 top # 动态查看 htop # 更友好的top需安装 pgrep -f 关键词 # 按命令行匹配pid kill -15 PID # 优雅终止 kill -9 PID # 强制终止 pkill -f 关键词 # 按名称终止kill -15SIGTERM是给进程一个优雅退出的机会让它保存数据、关闭连接。kill -9SIGKILL是直接毙掉进程没法做任何清理。先15后9是基本原则直接上9容易造成数据损坏或者残留锁文件。ps aux输出的各列含义要牢记USER是属主PID是进程号%CPU和%MEM是资源占用STAT是状态R运行、S睡眠、Z僵尸COMMAND是启动命令。僵尸进程Z是父进程没回收子进程导致的杀僵尸进程没用得杀它的父进程。5.3 systemctl 管理服务现代Linux都用systemd服务管理统一走systemctlsystemctl start nginx # 启动 systemctl stop nginx # 停止 systemctl restart nginx # 重启 systemctl reload nginx # 重载配置不中断 systemctl status nginx # 查看状态 systemctl enable nginx # 开机自启 systemctl disable nginx # 取消自启 systemctl is-enabled nginx # 查看是否自启restart和reload的区别很重要。restart是停掉再起会短暂中断服务reload是让服务重新读配置不断连接适用于Nginx、Apache这类支持热重载的服务。改完配置优先用reloadreload失败再restart。服务起不来的第一件事永远是systemctl status 服务名它会显示最近几行日志和退出码。接着用journalctl -u 服务名 -n 50看详细日志。5.4 网络与端口排查ip addr # 查看IP地址取代ifconfig ip route # 查看路由表 ss -tulnp # 查看监听端口取代netstat ping -c 4 目标IP # 测试连通性 curl -I http://目标地址 # 查看HTTP响应头 traceroute 目标IP # 路由追踪ss -tulnp这个参数组合拆开看-tTCP-uUDP-l监听中-n显示数字端口不解析服务名-p显示占用端口的进程。查出某个端口被谁占了就用这个。排查服务明明起了但访问不了按这个顺序走先ss -tulnp确认端口有没有监听再确认监听的是0.0.0.0还是127.0.0.1后者只能本机访问然后看防火墙firewall-cmd --list-all或者iptables -L最后才是网络层。现在很多国产系统上也装了ufw这类简化防火墙用法是ufw status、ufw allow 80。具体用哪套看系统预装了什么。6. 文本三剑客与日志grep、sed、awk、journalctlLinux的命令行强大很大程度上靠的是文本处理能力。日志、配置、数据文件都是纯文本能不能快速从里面提取信息直接决定了排障效率。这一节讲最核心的四个工具。6.1 grep 的常用参数与正则基础grep是文本搜索的第一工具。grep error app.log # 基础搜索 grep -i error app.log # 忽略大小写 grep -n error app.log # 显示行号 grep -c error app.log # 统计匹配行数 grep -v DEBUG app.log # 反向匹配排除 grep -r 关键词 /etc/ # 递归搜索目录 grep -A 3 -B 2 error app.log # 显示后3行和前2行 grep -E error|warn|fail app.log # 扩展正则多条件-Aafter和-Bbefore在查异常日志时非常好用因为错误信息往往和上下文几行相关联只看匹配行会丢失关键信息。-C 5是前后各5行等于-A 5 -B 5。-E开启扩展正则可以不写反斜杠直接用|、、?。-F是固定字符串匹配不解析正则速度更快适合搜索包含特殊字符的内容。递归搜索的时候配合--include和--exclude能大幅提速grep -rn listen /etc/nginx --include*.conf6.2 sed 的替换与就地修改sed最常用的场景是批量替换文本。sed s/old/new/ file.txt # 替换每行第一个匹配 sed s/old/new/g file.txt # 全局替换 sed -i s/old/new/g file.txt # 直接修改文件 sed -i.bak s/old/new/g file.txt # 修改前备份为.bak sed -n 10,20p file.txt # 只打印10-20行 sed /^#/d file.txt # 删除注释行 sed /^$/d file.txt # 删除空行-i是就地修改会直接改原文件用之前一定要想清楚。我自己的习惯是加.bak后缀等于顺手做了个备份出问题还能回滚。替换的内容里如果含路径斜杠可以把分隔符从/换成别的字符比如sed s#/old/path#/new/path#g这样不用转义斜杠可读性更好。6.3 awk 按列处理awk适合处理按列的数据比如配置里的某个字段、日志里的IP。awk {print $1} file.txt # 打印第一列 awk {print $1, $3} file.txt # 打印第1、3列 awk -F: {print $1} /etc/passwd # 以冒号为分隔符打印第一列 awk $3 100 {print $0} file.txt # 条件过滤 awk {sum $1} END {print sum} num.txt # 求和$0表示整行$1是第一列$NF是最后一列$(NF-1)是倒数第二列。-F指定分隔符默认是空格或制表符。一个特别实用的组合是统计日志里IP的访问次数awk {print $1} access.log | sort | uniq -c | sort -rn | head -10拆开看先取第一列IP排序用uniq -c统计连续重复的次数再按次数倒序排列取前10。这行是分析访问来源的标准套路改一下列号就能用于各种统计场景。6.4 日志查看与实时跟踪tail -f app.log # 实时跟踪日志 tail -n 100 app.log # 看最后100行 head -n 50 app.log # 看前50行 journalctl -u nginx # 看某服务的系统日志 journalctl -u nginx --since 1 hour ago # 按时间过滤 journalctl -xe # 查看最近错误tail -f是排查实时问题的利器配合grep用更爽tail -f app.log | grep ERROR只显示错误行。journalctl -xe在排查systemd服务启动失败时几乎是必敲的它会把最近的错误和高亮信息一起展示出来。加--since和--until可以限定时间窗口长时间运行的机器上查日志不加时间过滤会翻到崩溃。7. 国产发行版上的特色操作与系统信息获取前面讲的都是通用命令这一节专门说国产系统上比较特别的几个点也是很多人接手UOS和麒麟之后最想问的。7.1 系统版本、硬件信息一目了然接手一台陌生的国产系统机器想快速摸清底细cat /etc/os-release # 发行版详细信息 cat /etc/*release* # 有些系统信息在别的文件里 uname -a # 内核版本、架构 hostnamectl # 系统信息汇总systemd系统 lscpu # CPU信息 free -h # 内存使用 lsblk # 磁盘设备 lspci # PCI设备显卡、网卡/etc/os-release是标准化程度最高的包含 NAME、VERSION、ID、PRETTY_NAME 等字段脚本里判断发行版靠它最稳。有些老系统上可能还要看/etc/issue或/etc/redhat-release视出身而定。hostnamectl是个被低估的命令一次输出主机名、操作系统、内核、架构、虚拟化类型比东拼西凑强多了。虚拟化那行会告诉你这台机器是物理机还是跑在某种虚拟平台上对接部署方案的时候有用。硬件层面lspci和lsusb能列出所有PCI和USB设备排查显卡驱动、网卡识别问题的时候必看。国产系统在驱动适配上偶尔会有跟主流发行版不一致的地方确认硬件型号之后再去官方渠道找适配驱动比盲目试错快得多。7.2 桌面环境相关的命令与显示问题桌面版系统上有些操作通过图形界面更直观但命令行也能搞定。关机重启这类操作systemctl reboot # 重启 systemctl poweroff # 关机 systemctl suspend # 睡眠图形界面崩溃、卡住的时候可以按CtrlAltF2切到tty字符终端用普通账户登录后重启显示管理器。不同桌面环境的显示管理器名不一样需要根据实际情况确认常见的有lightdm、gdm。国产系统上还碰到过开机后黑屏的情况。第一反应是切tty看有没有反应如果能进tty说明系统本身活着问题出在图形层。这时候看journalctl -b -p err过滤出这次启动的错误日志往往能定位到是显卡驱动还是显示管理器挂了。如果是驱动问题可能需要在启动参数里加参数进安全模式再重装驱动。字体和输入法是国产系统上被问得最多的。系统字体通常放在/usr/share/fonts/下用户字体在~/.local/share/fonts/或者~/.fonts/。装完新字体后执行fc-cache -fv # 刷新字体缓存 fc-list | grep 字体名 # 确认字体已被识别fc-list能列出系统识别到的所有字体装完字体先用它确认再看应用里有没有出现。这一步能省掉很多我明明装了怎么不显示的困惑。输入法相关的问题通常需要确认输入法框架有没有在跑用ps aux | grep 输入法框架名检查。如果框架没起来桌面里当然敲不出中文。7.3 备份、还原与系统状态快照重装系统或者做大版本升级之前先做备份是个好习惯。最简单的是把关键目录打包tar -zcvf /backup/etc_$(date %F).tar.gz /etc tar -zcvf /backup/home_$(date %F).tar.gz /home/etc里的配置文件是重装后最需要恢复的东西/home是数据。这两个打包下来重装之后的恢复成本会低很多。系统状态的快照方面很多桌面版自带了备份还原工具图形界面操作更友好。命令行的思路是用rsync做增量同步rsync -avz --delete /data/ /backup/data/-a归档模式保留属性-v显示过程-z压缩传输本地同步时可以不加--delete让目标目录和源保持一致删掉源里已经不存在的文件。--delete要慎用写错源和目标就是灾难我一般先--dry-run空跑一次看看会删什么确认无误再去掉。8. 我踩过的坑和几条掏心窝的经验写了这么多命令最后聊点经验层面的东西这些是文档里不会写、但真正影响效率的部分。第一条永远先确认环境再动手。前面反复强调的cat /etc/os-release、which apt dnf看着啰嗦但真能救命。我见过有人把给Ubuntu写的脚本直接扔到麒麟服务器上跑前面几步都看起来正常直到某条命令静默失败把数据写错了位置才发现包管理器根本不是一套。第二条危险命令先加 --dry-run 或者 --help。rsync --delete、find -delete、sed -i这类会实际修改文件系统的命令拿不准的时候先空跑或者先在小范围测试。命令行的好处是快坏处是一旦跑错没有撤销按钮。第三条变量一定要加引号。rm -rf $DIR和rm -rf $DIR在$DIR为空时行为天差地别。养成所有变量都加双引号的习惯能规避掉一大类因变量为空导致的误操作。第四条命令历史是你自己的知识库。history加上CtrlR反向搜索是找回上次那条很长的命令最快的方式。我建议定期用history | awk {print $2} | sort | uniq -c | sort -rn | head -20看看自己最常用哪些命令针对性去补参数细节。第五条别迷信一键脚本。网上下载的安装脚本装之前至少less看一下内容确认它改了哪些文件、往哪写东西、装了什么源。很多故障的根源就是某条没看懂的脚本悄悄改掉了系统配置。第六条日志和文档比记忆可靠。遇到问题第一反应应该是查日志journalctl、应用自己的日志文件和官方文档而不是凭印象敲命令。印象这东西在换了发行版之后往往不准。把这些命令用熟其实不需要背靠的是遇到问题知道往哪个方向查。磁盘问题想到df和du网络问题想到ss和curl日志问题想到tail -f和journalctl权限问题想到ls -l和id。有了这张问题到命令的映射剩下的就是查手册和积累细节了。