做运维和开发这些年,被问得最多的就是一句话:有没有一份靠谱的Linux命令手册?我每次都会反问一句:你只是想背命令,还是想把文件系统这几个字真正搞明白?区别很大。光背命令的人,换个发行版、换个平台、遇到一次“根文件系统起不来”就抓瞎;把文件系统底层逻辑想清楚的人,遇到的每个命令都是顺理成章的事。这篇东西就是按这个思路写的——从Linux文件系统的设计讲起,把日常最高频的命令拆开揉碎,再落到几个真实的实操场景上,包括基于RK3588这类国产平台搭建Ubuntu根文件系统、HDFS分布式文件系统的命令操作,最后给你一张能直接抄作业的速查总表。适合刚入门的运维、转行过来的开发,也适合那些用了几年Linux但总觉得差口气的人。
1. 文件系统是命令的地基——先把结构看懂
1.1 一套目录约定,所有命令都在为这套规矩服务
Linux文件系统最核心的设计,就是一棵从根开始的目录树。你看到的/、/etc、/home、/var,并不是某个盘符下的文件夹,而是整棵目录树上的一个个挂载点。用过Windows的人刚接触时最容易懵:为什么没有C盘D盘的概念?因为Linux把所有存储设备都“挂”到了这棵树上,挂到哪里,哪里就是目录。
这套规矩叫FHS(Filesystem Hierarchy Standard),虽然不是一个强制标准,但几乎所有主流发行版都遵守。/etc放配置文件,/usr放系统软件,/var放日志和临时可变数据,/home放用户目录,/tmp放临时文件。这套约定的价值在于:哪怕换了一台完全陌生的机器,只要按FHS找目录,你也能立刻定位到想要的配置文件或日志。
根文件系统这四个字,说的就是/所在的那个文件系统。系统启动时,内核先挂载根文件系统,再去读init程序、加载服务和模块。根文件系统如果坏了,系统直接起不来——这也是为什么“linux根文件系统”和“搭建根文件系统”相关的搜索热度一直很高。
1.2 文件不是“文件”,是inode加数据块的组合
很多人以为文件就是一个完整存在磁盘上的东西,这其实是个错误认知。Linux里一个文件由两部分组成:inode和data block。inode里记录的是元数据——文件大小、权限、属主、时间戳、数据块位置,而实际内容放在数据块里。你可以把inode理解成图书馆的索引卡,data block才是书架上的实体书。
这就解释了很多现象。为什么ls -l有时候看到的文件大小和实际du占用的磁盘空间不一样?因为稀疏文件和不连续分配会让逻辑大小与物理占用出现偏差。为什么硬链接看起来像两个文件,却只占一份空间?因为硬链接实际上就是多个目录项指向同一个inode,用ls -i看看inode号就一目了然。
stat命令可以看inode的完整信息,file命令则根据文件头内容判断真实类型。实操中我经常用这两个命令排查“文件明明存在却读不了”“目录里啥都看不到但磁盘满了”这类问题,后面会细说。
1.3 ls、stat、file怎么配合着看
ls -l是每个Linux用户用的最多的命令,但很多人只会看权限位。完整的ls -l输出有七列:权限、硬链接数、属主、属组、大小、修改时间、文件名。硬链接数这一列,很多人忽略了,它其实是判断“这个目录下有多少个子目录”“这个inode被多少个目录项引用”的重要线索。
stat命令则更详细,它会把inode号、文件类型、权限(数字和符号两种形式)、三个时间戳(atime访问时间、mtime修改时间、ctime状态变更时间)、块大小、数据块数全部列出来。有一个小技巧:stat -c '%a' file可以直接输出纯数字权限,写脚本判断权限时特别好用。
file命令看起来不起眼,但排查问题时很关键。比如你从网上下载了一个所谓的镜像文件,file一眼就能告诉你它到底是不是ext4镜像,还是只是一个文本文件。我曾经踩过一次坑,烧录SD卡时用了一个被截断的镜像,开机后文件系统报错,file一看是“data”而不是“Linux rev 1.0 ext4 filesystem data”,才反应过来下载出了问题。
2. 日常文件与目录命令速查——按场景拆解
2.1 目录穿梭与增删改查
目录操作看似简单,但有不少细节值得说清楚。
cd是最基础的命令,但真正用熟的人会知道三个变体:cd直接回当前用户家目录;cd -回上一次所在目录,这个在xshell一类的终端里切换前后两个目录时非常高效;cd ..回上级目录。如果你跟我一样经常在多个深层目录之间跳来跳去,建议用pushd和popd维护一个目录栈,配合dirs -v查看栈内容,比反复敲cd省事得多。
文件操作里,cp和mv要特别注意分区问题。同一文件系统内mv只是改一下目录项,秒完成;跨文件系统mv则是先复制再删除,文件大了会明显卡顿。cp的常用参数要形成肌肉记忆:cp -a保留所有属性,cp -i覆盖前确认,cp -u只在源文件更新时复制。批量复制时我会先用ls加通配符确认匹配范围,再执行cp,避免手滑把.txt复制成批量覆盖。
mkdir -p创建多级目录,rmdir只能删空目录,想删除非空目录用rm -rf。但rm -rf一定要谨慎再谨慎,我见过有人把rm -rf /opt/app/*写成rm -rf /opt/app*,结果把整个软件目录连带上级目录都删了。稳妥的做法是:删除前先ls确认路径,或者用rm -rf /path/to/dir时把最后一个斜杠跟着的目录名写完整。
2.2 查找定位:find、locate、which、type、grep
这是排查问题时最依赖的一组命令,也是面试题里出现频率最高的。
find功能极其强大,核心用法是:find 路径 条件 动作。常用的条件有-name按名字匹配、-type按类型匹配(f文件、d目录、l软链接)、-mtime按修改时间匹配(-mtime -7表示7天内修改过的文件)、-size按大小匹配(-size +100M)。动作方面,-exec后面可以接命令,{}代表找到的每个文件,结尾必须是;或+。比如找所有大于500MB的日志文件并列出占用空间:
find /var/log -type f -size +500M -exec ls -lh {} \;find在大型目录树里可能很慢,所以快速查找通常用locate,它查的是系统预建的数据库,命令执行前可以updatedb更新一次。which和whereis用来查命令所在路径,type则是shell内建命令,能区分“命令是外部程序、shell内建函数还是别名”,排查命令行为异常时非常有用。
grep主要用于文本内容匹配,它是另一个大话题,但日常最常用的就是grep -r递归搜索、grep -n显示行号、grep -i忽略大小写、grep -E扩展正则。排查日志时习惯先grep关键词,再按时间范围sed或awk切片,效率比一把梭快很多。
2.3 权限、特殊权限与属性管理
权限管理是Linux区别于Windows的一大特色,也是新手最容易懵的地方。
普通权限就是读r写w执行x,分别对应数字4、2、1。chmod 750 file代表属主可读可写可执行、属组可读可执行、其他人不可访问。chown user:group file改属主和属组。这里有个小坑:修改目录权限时,如果要递归生效,很多教程让你用chmod -R 777 /some/dir,但这不是最佳实践——更好的做法是只对文件目录本身递归,或者用find去精确匹配文件与目录分别设置权限。
特殊权限有三个:SUID、SGID、Sticky Bit。SUID位出现在文件属主的执行位上,表现为s,比如/usr/bin/passwd。它的作用是让普通用户执行时临时拥有文件属主的权限,这样才能修改/etc/shadow。SGID类似,作用在属组执行位上。Sticky Bit出现在目录的其他人执行位上,/tmp目录就是典型,只有文件属主才能删除自己的文件。
理解特殊权限不仅是知识储备,也是安全加固的基础。运维上要定期排查系统中设置了SUID/SGID的可执行文件,避免提权风险:可以用find / -perm -4000 -type f列出来,逐个确认。
chattr和lsattr是文件属性管理命令。chattr +i file给文件加不可修改属性,连root都没法直接改或删,篡改文件和防误删很好用。lsattr查看属性。注意chattr对普通文件、目录、不同文件系统的支持度有所差异,部分文件系统不一定完全支持全部属性位。
2.4 磁盘与文件系统管理
判断磁盘空间是运维日常中的高频操作。df -hT查看各挂载点的使用情况,-T会额外显示文件系统类型,比如ext4、xfs、vfat。du -sh /path统计目录总大小,du -h --max-depth=1按层级列出各子目录占用,是排查“磁盘满了但找不到大文件”问题的利器。
磁盘分区层面,lsblk看设备拓扑最直观,blkid查看分区的UUID和文件系统类型。分区操作用fdisk,但新机器我用parted更多,支持GPT和大硬盘,脚本化也好用。格式化用mkfs.ext4、mkfs.xfs等命令,注意mkfs会毁掉整个分区的数据,执行前务必确认设备名。
挂载与卸载是文件系统管理的核心动作。mount /dev/sdb1 /mnt/data把分区挂到目录,umount /mnt/data卸载。卸载时如果提示“target is busy”,说明有进程正在使用该挂载点的文件,用lsof +D /mnt/data或fuser -mv /mnt/data找出占用进程再处理。日常拿U盘折腾时还要注意文件系统兼容:FAT系列的设备一般用mount -t vfat /dev/sdb1 /mnt/usb挂载,NTFS则可能需要ntfs-3g。文件系统出问题后,基于ext4的可以用fsck.ext4尝试修复,但修复前最好先备份,因为fsck本身也是一把双刃剑。
3. 深入一层:VFS、sync与一次RK3588根文件系统实操
3.1 从VFS到sync:数据到底什么时候落盘
文件系统不是你敲完命令就立刻写进磁盘的。Linux内核里有一个虚拟文件系统层,叫VFS。VFS是所有具体文件系统(ext4、xfs、vfat等)之上的抽象层,它让用户态的程序可以忽略底层文件系统差异,统一用open/read/write/close这套接口操作文件。每个具体文件系统只需要实现VFS定义的操作接口就行了。
既然有抽象层,就必然有缓存。write()系统调用把数据从用户态copy到内核的页缓存(Page Cache)就返回了,此时数据并不在磁盘上。内核里的pdflush(新内核里是writeback机制)会在后续某个时刻把脏页刷回磁盘。这带来一个巨大的性能收益,但也带来风险:如果突然断电,内核来不及回写,文件就丢了。
这时候sync命令就派上用场了。sync把所有未落盘的数据强制刷到磁盘。更精细的是fsync(fd),它针对单个文件,确保文件数据和元数据都落盘;再进一步,fdatasync(fd)只刷数据不刷元数据,性能更好,所以数据库这类对一致性要求高的场景,Write Ahead Log用的就是类fsync机制。
实操建议:手动拷贝重要文件后,建议执行一次sync再拔U盘或者关机;生产环境备份任务结束后跑一次sync,再验证备份文件md5,这样能避免很多玄学问题。热词里“linux sync”和“vfs”能排到前面,说明很多人确实在文件落盘这件事上栽过跟头。
3.2 基于RK3588平台的Ubuntu 20.04.5根文件系统搭建
RK3588是瑞芯微旗下的一颗ARM架构SoC,在国产开发板上很常见。你要在这样一块板子上跑Ubuntu 20.04.5,有两种思路:用厂商提供的现成镜像,或者自己从基础包开始构建根文件系统。自己构建的好处是能完全掌控软件包列表、裁剪体积、理解系统组成。折腾过一次之后,你对Linux启动流程、文件系统布局的理解会提升一个档次。
我当时用的主机是x86_64的Ubuntu,目标架构是arm64,所以需要debootstrap加qemu-user-static这套组合。先安装工具:
apt install debootstrap qemu-user-static然后创建根文件系统目录,用debootstrap拉取Ubuntu focal(20.04)的base系统:
mkdir -p /mnt/rootfs debootstrap --arch=arm64 --foreign focal /mnt/rootfs http://mirrors.aliyun.com/ubuntu/注意这里用了--foreign,因为x86主机不能直接chroot执行arm64程序,需要先复制基础包,再用qemu-aarch64-static模拟执行第二次安装。具体做法是:
cp /usr/bin/qemu-aarch64-static /mnt/rootfs/usr/bin/ chroot /mnt/rootfs /debootstrap/debootstrap --second-stage这一步会跑几分钟,期间网络会持续下载。走完以后,根文件系统的基本骨架就出来了,但还不能直接启动,因为少了几个关键配置。
3.3 根文件系统后期的配置与打包
chroot进去之前,要先把宿主机的一些虚拟文件系统挂载进去,如果不挂,很多配置命令会报错:
mount --bind /dev /mnt/rootfs/dev mount --bind /proc /mnt/rootfs/proc mount --bind /sys /mnt/rootfs/sys然后chroot进去,配置DNS、添加普通用户、设置root密码,顺便装几个常用工具:
chroot /mnt/rootfs echo "nameserver 8.8.8.8" > /etc/resolv.conf apt update apt install vim net-tools openssh-server systemd echo "root:123456" | chpasswd useradd -m -s /bin/bash ubuntu echo "ubuntu:123456" | chpasswd这里有个容易忽略的点:/etc/fstab必须配置好,否则系统启动时根文件系统挂载逻辑会乱。还要确认/etc/hostname写入了主机名,SSH服务默认只监听本地回环地址时还需要检查/etc/ssh/sshd_config里的PermitRootLogin和监听地址设置,不然板子启动后你根本连不上。
同时要注意,debootstrap出来的系统是纯软件包骨架,没有内核。你需要单独编译或使用厂商提供的内核,把内核模块安装到根文件系统里:
make modules_install INSTALL_MOD_PATH=/mnt/rootfs打包成镜像时,推荐先创建ext4镜像文件,再挂载拷贝,而不是直接用dd整个磁盘:
dd if=/dev/zero of=ubuntu-rootfs.img bs=1M count=4096 mkfs.ext4 ubuntu-rootfs.img mount -o loop ubuntu-rootfs.img /mnt/img cp -a /mnt/rootfs/* /mnt/img/ umount /mnt/img最后把镜像写到SD卡或eMMC,再配合RK3588的引导分区,就能启动了。启动后如果遇到Kernel panic - not syncing: VFS: Unable to mount root fs,大概率是内核命令行里的root=参数写错了,或者文件系统里没有对应内核模块。这类问题排查多了,你会发现VFS、根文件系统、内核启动参数这几个概念真的是一环扣一环。
4. 高频命令专题:编辑器、进程、网络与密码策略
4.1 vim命令速记:高频操作这套就够
编辑文件绕不开vim,但很多人被它的学习曲线劝退了。我的建议是:别追求学完vim全部功能,先掌握最核心的操作,然后形成肌肉记忆。
vim有四种模式:普通模式、插入模式、可视模式、命令行模式。进入vim默认是普通模式,按i进入插入模式,按Esc回普通模式,按:进入命令行模式。最常用的移动是gg到文件头、G到文件尾、0行首、$行尾。删除有dd删一行、dw删一个词、x删一个字符,复制粘贴对应yy和p。搜查找/关键词加回车,n下一个、N上一个。全局替换是:%s/旧/新/g,加了g才是替换全部,不加只替换每行第一个。
退出和保存是新手最恐惧的::w保存,:q退出,:wq保存并退出,q!强制退出不保存。我自己常用ZZ保存退出,少敲一个冒号很顺手。
多说一句,vim配置建议至少开启语法高亮和行号,在~/.vimrc里写上syntax on和set number。我在RK3588的根文件系统里装vim后,第一件事就是补这两行配置。
4.2 top命令详解:系统状态的仪表盘
top是看系统负载和资源占用的一线工具,但很多人只盯着CPU和内存百分比看,忽略了其它关键信息。
第一行最左边是当前时间和系统运行时间,中间是登录用户数,最后是load average三个数。这三个数代表了1分钟、5分钟、15分钟的平均负载。负载高不等于CPU满,它还包含不可中断的IO等待。我见过一台机器CPU占用不到30%,但load average跑到20,最后发现是底层存储性能瓶颈,大量进程卡在IO上。
第二行的Tasks要关注zombie僵尸进程数量。第三行和第四行是CPU和内存分布,CPU这行里us用户态、sy系统态、ni优先级调整、id空闲、waIO等待、hi硬中断、si软中断、st被虚拟机偷走的时间。排查性能问题时,wa高说明IO在拖后腿,sy高说明系统调用或上下文切换频繁。第五行是内存和交换分区,注意available才是真正可用内存。
进入top之后,按P按CPU排序、M按内存排序、k可以杀进程、q退出。想看某个进程下面的线程,可以用top -H -p PID。这些交互键和参数是运维面试很喜欢问的点,也是实际排查问题时的必备操作。
4.3 telnet、xshell这类连接工具怎么用
telnet现在不常用于日常管理了,因为它是明文协议,用户名密码都会被抓包看到。但telnet有一个无法替代的用途:测试端口连通性。比如你怀疑某台服务器上的某个端口没开,又不想用nc,直接:
telnet 192.168.1.100 3306能连上说明端口通,连不上会报Connection refused或者直接超时。退出telnet的时候有个容易卡住的地方:按Ctrl+]进入telnet命令行提示符,然后输入quit回车退出,别直接按Ctrl+C,容易把终端搞乱。
xshell这类SSH终端工具本身跟命令没有关系,但很多人经常问“xshell命令回退目录怎么弄”。其实这不是xshell的功能,而是shell层面的技巧:cd -回退到上一次所在的目录,history可以看历史命令,Ctrl+R反向搜索历史命令,Ctrl+A把光标移到命令行开头,Ctrl+E移到结尾。把这些快捷键用起来,平时切目录和敲命令的效率能明显提升。
4.4 用户密码策略与到期提醒
生产环境的账号管理,最容易被忽略的就是密码策略。Ubuntu里密码过期策略由chage命令管理。chage -l username可以查看用户的密码过期信息,chage -M 90 username设置密码最长使用90天,chage -E YYYY-MM-DD设置账号到期日期。
实际生效的密码策略在/etc/login.defs里,比如PASS_MAX_DAYS、PASS_MIN_DAYS、PASS_WARN_AGE。而/etc/shadow里每个用户那一行,用冒号分隔的字段就包含了最后一次修改密码的日期、最短使用天数、最长使用天数和过期警告天数,chage改的就是这些字段。
密码快要过期时,用户登录就会看到系统提示,但不一定每个人都注意。我之前维护的一批设备,就靠一个简单脚本定期检查chage -l输出的“密码过期”时间,再通过cron把提醒邮件发给相关负责人,避免了因密码过期导致服务中断的尴尬。类似的通知脚本还可以在登录时通过/etc/profile.d放一个检查脚本,用户一登进去就看到“您的密码将在X天后过期”。
5. 从单机到集群:HDFS命令操作速查
5.1 HDFS也算文件系统,但它“分布式”在哪
把话题拉远一点。很多学大数据的人一开始会懵:HDFS里的/user/root/input看起来跟Linux路径一模一样,但ls、cat却不能直接操作它,为什么?因为HDFS是一个分布式文件系统,它管理的不是某一个磁盘的设备节点,而是一整个集群里的数据节点。客户端通过NameNode拿到文件元数据,再跟DataNode传输实际数据块。
HDFS不需要mkdir、rm这些系统命令去操作,而是提供了自己的命令行工具:hdfs dfs。这套命令的风格是刻意模仿Linux的,为的就是降低学习成本,但它的路径里的/指的是HDFS的根目录,跟Linux的根目录是两个世界。
5.2 高频hdfs dfs命令实操
hdfs dfs -ls /列出HDFS根目录,hdfs dfs -ls /user可以加-R递归列出。hdfs dfs -mkdir -p /user/hive/warehouse创建多级目录。本地和HDFS之间传数据用-put和-get:
hdfs dfs -put /local/data.csv /user/hive/warehouse/ hdfs dfs -get /user/hive/warehouse/data.csv /local/output/查看内容用-cat或-tail,后者适合看大文件末尾。删除用-rm,注意HDFS上删除的文件先进回收站,方便找回。-chmod、-chown的用法和Linux一模一样。磁盘和配额相关命令有-df -h、-du -h,-setrep -R 3 /path可以递归设置副本数,这是HDFS特有的操作,Linux里没有对应概念。
跟着在线课程或头歌平台练习时,最常见的就是自己动手跑一遍hdfs dfs的操作题。我建议在练习前先拆清楚HDFS的NameNode和DataNode角色、副本机制、块大小这些概念,命令是操作层面的,概念才是理解层的。
5.3 常见报错排查思路
HDFS命令的报错信息比Linux命令的更抽象,但排查路径是固定的。
权限类报错一般先看是不是当前用户不在超级用户组里,看hdfs dfs -ls能不能列,列不了就看日志里的AccessControlException。NameNode处于安全模式时,任何写操作都会被拒,表现为Name node is in safe mode,原因是集群启动后正在加载元数据或者副本数不足,等一会儿或用hdfs dfsadmin -safemode leave强制退出。空间不足与副本策略有关,检查数据节点剩余容量、块副本数、配额三类信息,多半能找到原因。
No such file or directory这类报错,很多情况下不是HDFS路径写错,而是本地路径写错了,因为-put的第一段参数是本地路径,这是新手最容易搞混的点。解决方式永远是:先ls本地路径确认存在,再lsHDFS路径确认父目录存在。
6. 版本管理、容器与国产生态:现代运维避不开的场景
6.1 git命令:从提交到回滚的完整闭环
git是开发必备,也是运维日常绕不开的工具。最基础的一套操作只需要记住几个命令。初始化或克隆:git init、git clone url。改动流程是git status查看状态、git add .暂存、git commit -m "message"提交。推送远程用git push origin main,拉取更新用git pull。
分支操作里,git branch查看分支,git checkout -b feature创建并切换分支,合并用git merge。常见的坑是冲突:同一个文件不同分支都改了,合并时会冲突。处理思路是先手动改文件,去掉<<<<<<<、=======、>>>>>>>标记,再add和commit。
回滚是git最有价值的能力。git reset --hard commitId直接回退到某个提交,会丢掉之后的所有改动,慎用。更温和的是git revert commitId,它会生成一个新的提交来撤销历史提交,不会覆盖远程历史,适合已经推送到远程仓库的场景。临时切换工作现场用git stash,干完活再git stash pop,这个操作在频繁切换需求时非常救命。
6.2 containerd、systemctl与Docker快速上手
容器化的时代,containerd是k8s默认的容器运行时,所以ctr和crictl这两套工具也变成了高频命令。ctr -n k8s.io images pull docker.io/library/nginx:latest拉镜像,ctr -n k8s.io c run运行容器。而crictl更像docker cli,crictl ps、crictl logs、crictl rm这些命令风格跟docker几乎一样,上手成本低很多。如果你装了nerdctl,甚至可以直接用nerdctl替代docker cli。
系统服务层面,systemctl是Systemd体系下的统一管理工具,日常工作里最常用的就是systemctl start|stop|restart|status|enable|disable六个动作,再加一个systemctl daemon-reload(修改service文件后重载配置)。排查服务启动失败时,journalctl -u 服务名 -n 100看日志,比翻/var/log/messages高效得多。
Docker安装方面,Ubuntu上最简单的路径是官方脚本,或者用apt安装docker.io包。不管哪种方式,装完第一件事是把当前用户加入docker组,否则每次都要sudo。
6.3 国产Linux生态与发行版选型
这几年国产Linux的讨论热度很高,热搜里“linux国产”“生态最好的linux系统”一直被点击。从技术角度看,国产Linux生态主要分两个方向:一个是面向桌面办公的麒麟、统信UOS这类发行版,它们的亮点是做了大量的国产软硬件适配;另一个是面向服务器和云计算的openEuler、龙蜥Anolis这类发行版,它们更强调在数据中心和云原生场景下的长期演进能力。
如果你做的是板卡或嵌入式相关的工作,国产SoC加Ubuntu根文件系统这条路已经很成熟了。像RK3588这类芯片,跑Ubuntu桌面或服务器系统完全没有问题,编译内核、配置设备树、移植根文件系统这些操作,跟x86平台差别不大——这恰恰说明Linux文件系统和命令的基础知识具有极强的迁移性。
选发行版的时候,我比较务实:先看目标场景、社区支持、厂商技术支持周期,再考虑个人喜好。生态“最好”本身没有标准答案,只要能顺利装到软件、长期能维护、遇到问题能搜到解决方案,对你来说就是好系统。但无论选哪个,文件系统结构、shell命令、权限模型、包管理逻辑,底层都是通的。
7. 命令速查总表与踩坑清单
7.1 按用途分组的速查总表
下面这张表按场景做了分组,覆盖了日常运维、开发和数据处理的最常用命令,建议直接收藏当速查手册用。
| 场景 | 命令 | 说明 |
|---|---|---|
| 目录操作 | pwd/cd -/pushd/popd | 当前路径 / 回退上一目录 / 目录栈 |
| 文件操作 | cp -a/mv/rm -rf/ln -s | 复制保留属性 / 移动 / 删除 / 软链接 |
| 权限管理 | chmod/chown/umask/chattr +i | 权限 / 属主 / 默认权限 / 不可修改属性 |
| 查找定位 | find/locate/which/type/grep -r | 条件搜索 / 数据库搜索 / 命令路径 / 命令类型 / 递归匹配 |
| 磁盘管理 | df -hT/du -sh/lsblk/blkid/fdisk | 挂载点容量 / 目录大小 / 设备拓扑 / UUID / 分区 |
| 挂载备份 | mount/umount/sync/fsck | 挂载 / 卸载 / 落盘 / 文件系统修复 |
| 进程资源 | top/ps aux/kill/free -h | 系统仪表盘 / 进程列表 / 杀进程 / 内存 |
| 网络调试 | telnet ip port/nc -vz/ss -tlnp | 端口测试 / 端口检查 / 监听端口 |
| 包管理 | apt update/apt install/dpkg -l | apt源更新 / 安装软件 / 已安装包列表 |
| 服务管理 | systemctl status/journalctl -u | 服务状态 / 日志 |
| 版本管理 | git add/commit/push/pull/reset | 提交 / 推送 / 拉取 / 回滚 |
| 容器命令 | crictl ps/nerdctl run/ctr images | 容器 / 镜像 |
| 密码策略 | chage -l/chage -M 90 | 查看 / 设置过期时间 |
| HDFS | hdfs dfs -ls/-put/-get/-rm/-setrep | 分布式文件系统操作 |
7.2 实战踩坑清单与个人心得
命令背得再熟,不如踩一次坑记得牢。我把这几年实操中反复出现的坑集中列一下。
第一,sync是最后一道保险,但别迷信它。sync能确保数据落盘,却防不住硬件故障和文件系统损坏。重要数据至少要双备份,一份本地一份异地,甚至考虑对象存储,别等到磁盘坏了才想起RAID也不是万能的。
第二,rm -rf是运维界最大杀器。一个可行的小习惯:危险命令执行前先echo一遍,比如rm -rf /opt/app/*先敲成echo rm -rf /opt/app/*,确认无误再删掉echo执行。写脚本的时候,给所有rm -rf加上变量非空判断。
第三,chroot之后忘记挂载/proc和/sys是新手高频翻车点。在chroot环境里执行某些命令会莫名卡住,原因往往就是内核文件系统没有挂载。排查思路:mount | grep /mnt/rootfs看挂载记录。
第四,find和grep的组合最容易写出超慢命令。在跨整个文件系统做find / -name之前,先想想是不是可以把范围缩小到/usr、/etc、/home等具体目录。grep -r搜索时,排除掉二进制文件和大型日志目录能省一大半时间。
第五,HDFS命令操作中,本地路径和HDFS路径必须分开理解。在头歌或课程平台上练习时,-put的第一个参数永远是本地路径,第二个参数永远是HDFS路径,搞反了就会报“No such file or directory”。
第六,内核模块没装进根文件系统,是自行构建根文件系统后最常见的问题。板子启动后网卡不识别、ext4挂载失败,很多都是/lib/modules/$(uname -r)目录为空。检查内核模块是否齐全,是烧录之前必须做的一项验证。
结尾:一个持续十年的建议
我个人在实际操作中养成了一个习惯:每过一段时间,就把最近用到的陌生命令记到一个纯文本文件里,按场景分组,加上一两句“为什么这么用”的注释。这份个人速查手册比任何网上找到的教程都顺手,因为它记录的是你真实踩过的坑、真正用到的场景。Linux命令不是靠一次背完的,而是在不断查、不断用、不断复盘中长进肉里的。你把这篇文章当成一个起点,把目录里的表格当成一个框架,剩下的,靠时间去积累。