拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Linux基础操作从入门到排查:目录、权限、Shell与网络故障实战

Linux基础操作从入门到排查:目录、权限、Shell与网络故障实战

很多刚接触Linux的朋友都会问我同一个问题:Linux到底该怎么入门?网上教程多得看不完,但往往是看了就忘、忘了又看,最后还是停留在"会敲几个命令"的阶段。这篇我不打算罗列什么"十大必会命令",而是把Linux最核心的基础操作串成一条完整的线:从目录结构讲起,逐步覆盖用户权限、系统体检、软件安装、Shell脚本自动化,最后再聊聊网络和启动异常的排查思路。标题虽然是"linux相关基础操作分享",但我会尽量把每个命令背后的原理、实际使用场景和常见的坑都讲透,适合刚入行的运维新手、准备转做服务端的开发,以及正在准备Linux基础面试的朋友。

1. 先搞懂Linux的"房子结构"——目录体系与文件操作

1.1 从Windows思维切换到Linux思维

很多人第一次登录Linux服务器,脑子里还是Windows的C盘、D盘思维,习惯性地找"我的文档",结果发现Linux根本没有盘符这个概念。整个系统就是一棵树,所有东西都挂在根目录/下面。

我第一次接触Linux时花了很长时间才适应这个逻辑。Windows是把硬盘分成几个分区,每个分区有自己的根;Linux恰好反过来,不管你有几块硬盘、几个分区,最终都会被挂载到/这棵树下的某个目录里。比如你加了一块数据盘,可能要手动挂载到/data,挂载之后,/data就是这个树的某个分支节点。

用生活化的比喻来说,Linux的目录结构更像一栋房子,每个房间都有固定用途:

  • /home:住户的房间,普通用户的家目录基本都在这下面,比如/home/zhangsan
  • /etc:房子的配电箱和总开关,存放系统所有配置文件的"总开关"就在这里
  • /var:杂物间,日志、缓存、邮件这些经常变化的动态数据都在这里
  • /tmp:临时的垃圾桶,系统随时清空,别把重要文件放里面
  • /usr:客厅和储物柜,系统自带的软件和库文件大多在这里
  • /bin、/sbin:工具间,常用的命令程序都放这儿

这个结构设计是有讲究的。系统配置统一放/etc,日志放/var/log,用户数据放/home,这样备份、恢复、排查问题时思路就很清晰——出了问题知道去哪翻,不用满世界找。

1.2 最常用的文件操作命令

文件操作是Linux里最基础也最高频的操作,我挑几个真正每天都在用的命令,结合具体场景说。

pwd用来查看当前位置,这个没啥好说的;ls查看当前目录下的文件,cd切换目录。这三兄弟是日常操作的起点。

复制用cp,移动或重命名用mv,删除用rm,新建目录用mkdir,创建空文件用touch。这些命令看起来简单,但实际使用中有几个细节必须注意:

  • rm删除的文件不会进回收站,删了就没了。没有十足的把握,不要在生产环境执行rm -rf。
  • cp -r才能复制目录,不加-r会报错。
  • mv在同一个文件系统内几乎是秒完成的,因为只是改了个路径名,并没有真正搬数据。

我举个例子,新手常问的"怎么批量把文件名统一改掉"。比如当前目录下有一堆日志文件app_20240101.log、app_20240102.log,想把app_改成backend_,一条命令搞定:

rename 's/app_/backend_/' *.log

不过不是每个发行版都自带rename,而且它的语法在不同系统上略有差异。更通用、更好理解的做法是用循环加mv:

for f in app_*.log; do mv "$f" "${f/app_/backend_}"; done

这里${f/app_/backend_}是Shell里的字符串替换语法,把变量f中的app_替换成backend_。

1.3 查找文件的三板斧

服务器上文件一多,找文件就成了一件头疼的事。我的经验是记住三个命令就够了:find、locate、grep。

find是最灵活的,按名字、按大小、按修改时间都能找。比如我想找出/home目录下所有大于500M的文件:

find /home -type f -size +500M -exec ls -lh {} \;

-type f限定只找普通文件,-size +500M表示大于500MB,-exec ls -lh {} \;表示对找到的每个文件执行ls命令,这样能直观看到文件大小。

locate适合快速按名字找文件,它依赖一个文件数据库,速度极快,但数据库是定时更新的,刚创建的文件可能搜不到。

grep则是按内容搜索,配合-r可以递归搜索整个目录里的文本。比如我想在某个项目目录下找到所有配置了数据库地址的文件:

grep -r "192.168.1.100" /opt/project/config/

这三个命令各有侧重,组合起来基本能解决90%的文件查找需求。

2. 权限不是玄学——用户、组与文件权限的底层逻辑

2.1 root与普通用户的分工

Linux系统里,root用户是"万能钥匙",可以做任何事。但正因为它权限太大,日常操作中我不建议直接用 root 登录操作,一旦手滑输错命令,代价可能非常大。

正确的姿势是:日常用普通用户干活,需要管理员权限时用sudo临时提权。比如更新软件:

sudo apt update

这里sudo会临时把当前用户提升为管理员身份执行后面的命令,但需要输入该用户的密码。相比su(切到root用户)再执行命令,sudo的好处是只临时提权,不会改变整个会话的身份,而且系统日志里会记录谁执行了什么提权操作。万一出事了,审计起来非常方便。

2.2 新建用户竟然有这么多细节

创建用户这个操作,很多人以为就是一条useradd zhangsan完事,其实远没那么简单。

useradd -m -s /bin/bash -G wheel zhangsan

这里的参数含义很关键:

  • -m:自动创建用户家目录/home/zhangsan
  • -s /bin/bash:指定该用户的登录Shell
  • -G wheel:把用户加入wheel组,这个组在CentOS/Rocky上通常被允许使用sudo

然后给用户设置初始密码:

passwd zhangsan

如果不加-m,新用户是没有家目录的,SSH登录进去连个落脚本的地方都没有,会很别扭。如果忘了-G wheel,你会发现这用户啥权限都没有,想装个软件都装不了。

顺手说一句排查用户信息时的常用操作:id zhangsan可以看用户ID、所属组;userdel -r zhangsan删除用户的同时删除家目录,-r一定别忘了,否则会留下一堆垃圾文件。

2.3 rwx权限位到底在说什么

用ls -l查看文件,最前面那一串drwxr-xr-x很多人看不懂。我来拆解一下:

位置含义
第1位文件类型,d表示目录,-表示普通文件,l表示软链接
第2-4位属主(owner)的权限:r读、w写、x执行
第5-7位属组(group)的权限
第8-10位其他用户(others)的权限

所以drwxr-xr-x的意思是:这是一个目录,属主能读能写能进入,属组和其他用户只能读和进入,但不能修改里面的内容。

修改权限用chmod,有两种写法。一种是字母法:chmod u+x file.sh表示给属主加执行权限。更多时候直接用数字法,r=4, w=2, x=1:

  • chmod 755 file.sh:属主7(rwx),属组5(r-x),其他5(r-x),这是最常见的一种
  • chmod 644 file.txt:属主6(rw-),属组4(r--),其他4(r--),普通文本文件的默认权限

修改文件属主用chown,比如把目录/data/web的所有者改成www用户:

chown -R www:www /data/web

-R表示递归处理子目录和文件。这个命令在部署Web服务、配置Nginx时特别常用,权限不对时很容易出现"502 Bad Gateway"或"403 Forbidden"这种报错,排查半天最后发现只是权限没给对。

3. 系统体检三件套:进程、内存、磁盘怎么看

3.1 ps与top:从静态到动态

一台服务器运行得好不好,第一眼要看的就是进程。静态查看进程我用ps aux,它会列出所有进程的PID、CPU占用、内存占用、启动命令等信息。比如我只想找Nginx的进程:

ps aux | grep nginx

但ps看的是某一瞬间的状况,想实时观察系统的动态变化,就得用top。top打开后是个实时刷新的界面,按P按CPU排序,按M按内存排序,按q退出。如果系统变卡了,先top看一眼,通常能立刻发现是哪个进程在捣乱。

我个人更喜欢用htop,因为它的界面更友好,支持鼠标操作,还能直接按F键杀掉进程。虽然要安装,但强烈建议装上:

sudo apt install htop

3.2 内存和磁盘:free、df、du

内存查看用free -h,-h表示以人类可读的格式显示。很多人有个误解:看到free命令显示的可用内存很少就慌了,以为内存快满了。其实Linux有一个"缓存回收"机制,空闲内存会被系统用来做文件缓存(buffer/cache),当有程序需要内存时,这些缓存会主动释放出来。所以判断内存是否紧张,要关注的是available这一列,而不是free列。

磁盘空间看df -h,可以看到各个分区挂载点的使用率。如果发现某个分区快满了,要找出哪些文件占地方,用du:

du -sh /var/* | sort -rh | head -10

这条命令会把/var下面各个子目录的大小列出来,按从大到小排序,取前10名。哪个目录在默默吃掉磁盘空间,一眼就能发现。

du和df的区别也需要理解:df是从文件系统的层面看"分区还剩多少空间",du是从目录的层面统计"这堆文件一共多大"。有时候du统计出来很大,但df显示分区还很空,可能是因为文件被删除了,但进程还占着文件句柄没释放。遇到这种情况,得重启占用的进程才能释放空间。

3.3 systemctl与日志排查

现在的Linux发行版基本都用systemd管理服务,对应的工具就是systemctl。最常用的几个:

systemctl status nginx # 查看服务状态 systemctl start nginx # 启动服务 systemctl enable nginx # 设置开机自启 systemctl restart nginx # 重启服务

服务起不来是日常运维里最常遇到的问题。我的排查思路是这样的:先systemctl status看有没有报错信息,如果信息不完整,再用journalctl查服务单元对应的日志:

journalctl -u nginx --since "1 hour ago" -n 50

-u指定服务名,--since限定时间范围,-n 50只看最近50行。往往真正有用的错误信息就藏在最后几行里,比在搜索引擎里干着急有用得多。

4. 装软件不是双击安装包——包管理与环境配置实战

4.1 apt和yum怎么选

Linux装软件和Windows不同,一般不是去官网下载安装包,而是通过包管理器从软件仓库里安装,自动解决依赖关系。

Debian/Ubuntu系用的是apt,日常三连是:

sudo apt update # 更新软件源索引 sudo apt upgrade # 升级所有可升级的软件 sudo apt install nginx # 安装软件

CentOS/Rocky/Fedora系用的是yum或dnf,用法大同小异:

sudo yum install -y nginx

这里的-y表示过程中所有交互式询问都默认选Yes,写脚本批量安装时特别常用。

软件源是包管理器的心脏。默认软件源有时候速度慢或者缺软件,国内环境下常见做法是换成清华、阿里等镜像源加速,一般叫"换源"。Ubuntu的软件源配置文件在/etc/apt/sources.list,CentOS/Rocky则在/etc/yum.repos.d/下的.repo文件里。换源操作各发行版略有差异,最好参考对应镜像站提供的官方说明来做,不要盲目复制粘贴网上的帖子。

4.2 一个"离线安装Python"的真实场景

有时候生产服务器不能访问外网,只能在内网环境安装软件,这就是"离线安装"。热词里提到"linux python离线下载",这确实是很多人会遇到的场景。

我的做法是:找一台能联网的同系统机器,下载Python源码包或轮子文件,然后拷贝到内网服务器上安装。比如离线装Python 3.11,先下载源码包Python-3.11.8.tgz,传到目标机器上编译安装:

tar xzf Python-3.11.8.tgz cd Python-3.11.8 ./configure --prefix=/usr/local/python311 make -j4 && sudo make install

注意两点:一是./configure时尽量指定--prefix,免得安装散落到系统各个目录,不好管理;二是编译依赖(比如gcc、zlib、openssl-devel)必须先装好,否则编译到一半会报错。内网没有gcc是最头疼的,所以离线操作的第一步永远是先确认基础编译工具链齐不齐。

Python装好后,把它的路径加到PATH环境变量里:

export PATH=/usr/local/python311/bin:$PATH

但export只对当前终端会话生效,下次登录又没了。想要永久生效,得把这行写进用户配置文件~/.bashrc里,然后执行source ~/.bashrc让配置立即生效。

4.3 安装Docker和MySQL,一次真实的体检

既然聊到装机,就顺便说说两个最常见的应用:Docker和MySQL。

Docker在Ubuntu上的安装很简单,官方给了一键脚本,但不建议直接curl | sh这种形式,风险太大。正确做法是先装依赖,再添加官方仓库,然后安装:

sudo apt update sudo apt install -y ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg

后面还要配置仓库源、再apt install docker-ce docker-ce-cli containerd.io。这一步对新手来说稍微繁复,但胜在安全可控。装完以后如果拉取镜像速度很慢,可以给Docker配置镜像加速器,配置文件在/etc/docker/daemon.json。

MySQL的安装在不同发行版上差别比较大。Ubuntu上执行sudo apt install mysql-server,装完后运行一个安全初始化脚本:

sudo mysql_secure_installation

这个脚本会引导你设置root密码、删除匿名用户、禁用远程root登录,生产环境一定要跑一遍,不要跳过。

Rocky/CentOS上默认的MySQL包可能是MariaDB,如果确实要装MySQL,一般是用官方提供的Yum仓库安装,细节较多。我的建议是:如果只是测试环境,用系统自带的MariaDB就完全够用;生产环境再认真规划MySQL的安装方式和版本选择。

4.4 Anaconda环境变量配置

热词里还有"linux设置anaconda环境变量",这也是一个绕不开的话题。很多做数据分析的人会在Linux上装Anaconda,装完发现终端里敲conda提示找不到命令,这就是典型的PATH没配好。

Anaconda默认安装到家目录下的anaconda3文件夹,安装完成后它会提示你是否执行conda init。如果之前没做这一步,或者换了终端,就需要手动把环境变量写进~/.bashrc:

export PATH="$HOME/anaconda3/bin:$PATH"

然后:

source ~/.bashrc conda --version

这里我想多说一句关于PATH的理解。PATH就是系统找命令时搜索的目录列表,用冒号分隔,按顺序逐个查找。你把anaconda3/bin放在最前面,就是告诉系统:找命令时先来我这里看看。这也是为什么换了顺序,某些命令就会被不同的版本接管。

5. 把重复劳动写成一条命令——Shell脚本与自动化

5.1 脚本其实没那么高深

很多新手一听到写脚本就头大,其实Shell脚本就是把平时在终端里敲的命令按顺序放到一个文件里,再加点变量和判断而已。

比如我要每天清理/tmp下超过7天的临时文件,手动敲太累,就写个脚本clean_tmp.sh:

#!/bin/bash find /tmp -type f -mtime +7 -delete echo "$(date '+%Y-%m-%d %H:%M:%S') 清理完成" >> /var/log/clean_tmp.log

第一行#!/bin/bash叫Shebang,告诉系统这个脚本用哪个解释器执行。脚本写完后要赋予执行权限才能运行:

chmod +x clean_tmp.sh ./clean_tmp.sh

脚本里还可以加变量和条件判断,比如判断磁盘使用率超过80%时发提醒:

#!/bin/bash usage=$(df / | awk 'NR==2 {print $5}' | sed 's/%//') if [ "$usage" -gt 80 ]; then echo "磁盘使用率已超过80%" >> /var/log/disk_alert.log fi

这里特别要说一下,在 if 判断语句里,变量名最好加上双引号包住,比如"$usage",防止变量为空时语法报错。另外变量赋值时=两边不能有空格,写usage = 5会直接报错,这是新手最容易踩的坑。

5.2 定时任务cron

脚本写好了,还得让它自动运行。Linux的定时任务叫cron,用crontab -e编辑当前用户的定时任务:

0 2 * * * /home/zhangsan/clean_tmp.sh

这个时间格式有5个字段,分别表示:分、时、日、月、周。0 2 * * *就是每天凌晨2点整执行,*表示任意值。常见的写法还有:

  • */5 * * * *:每5分钟执行一次
  • 0 3 * * 1:每周一凌晨3点执行
  • 0 0 1 * *:每月1号凌晨0点执行

写定时任务有个重要原则:脚本里的命令最好都用绝对路径,因为cron执行时环境变量跟登录终端不一样,有时候脚本在终端里能跑,到了cron里就找不到命令。比如脚本里用了docker,但cron执行时PATH里没有docker相关的路径,就会报错。解决办法要么在脚本开头显式定义PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin,要么命令都用绝对路径。

5.3 实战:密码过期提醒脚本

热词里有"linux密码过期提醒通知",这个需求确实很常见。运维中经常有安全策略要求用户定期改密码,但用户总是忘,结果某天突然发现自己SSH登不上去了。

先看一个用户的密码过期信息:

chage -l zhangsan

输出里有上次改密码日期、密码过期时间、密码失效时间等信息。修改密码过期策略用chage,比如设置密码90天后过期:

chage -M 90 zhangsan

但光设置还不行,用户会在过期前几天毫无察觉。我的做法是写个脚本,扫描所有用户,找出密码即将在7天内过期的用户,然后发邮件通知。脚本核心逻辑是这样的:

#!/bin/bash expiring_users=$(awk -F: '/\/bin\/bash|\/bin\/sh/{print $1}' /etc/passwd) for user in $expiring_users; do days=$(chage -l "$user" | awk -F': ' '/password expires/{print $2}') if [ "$days" = "never" ]; then continue fi remaining=$(( ($(date -d "$days" +%s) - $(date +%s)) / 86400 )) if [ "$remaining" -le 7 ]; then echo "$user 的密码将在 $remaining 天后过期,请尽快修改密码" | mail -s "密码过期提醒" "$user"@example.com fi done

这个脚本里最核心的是把过期日期转成天数差,用date -d把日期转成时间戳再相除。脚本要预先测试好,再放到crontab里每天执行一次。不同系统的chage -l输出字段名有中文/英文差异,所以写脚本时最好先跑一遍确认字段名,别直接复制网上的。

6. 网络与启动异常:连接不上和开不了机怎么办

6.1 网络排查基本功

服务器连不上了,很多人的第一反应是打电话给机房。先别急,在控制台或者本地终端上按这个顺序排查,往往能发现真相:

第一步,ping测试网络连通性,看目标地址是否可达:

ping -c 4 8.8.8.8

-c 4表示只发4个包。能通说明链路没问题;不通就得检查网卡状态和路由。

第二步,测试端口连通性,用telnet或者更通用的nc:

nc -zv 192.168.1.100 22

如果端口不通,可能是服务没起来,也可能是防火墙拦截。查看防火墙状态:

sudo systemctl status firewalld # CentOS/Rocky sudo ufw status # Ubuntu

第三步,查看本机监听的端口和服务状态:

ss -lntp

ss是查看socket状态的利器,-l只看监听端口,-n不做域名解析,-t只看TCP,-p显示对应进程。如果发现某个服务的端口根本没监听,问题多半出在服务本身。

第四步,测试DNS解析是否正常:

dig example.com nslookup example.com

连不上服务器,有时候只是DNS配置写错了,改一下/etc/resolv.conf里的nameserver就行。

6.2 网卡配置文件到底在哪

热词里提到"rocky linux网卡文件",这个我也踩过坑。不同发行版的网络配置方式差异很大,不搞清楚的话,改完配置重启系统就断网了。

在Rocky/CentOS/RHEL 7及以上版本里,传统网卡配置文件在/etc/sysconfig/network-scripts/目录下,文件名一般是ifcfg-ens33这样的格式。文件内容大概是这样:

TYPE=Ethernet BOOTPROTO=static NAME=ens33 DEVICE=ens33 ONBOOT=yes IPADDR=192.168.1.100 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 DNS1=223.5.5.5

把BOOTPROTO=dhcp改成static,再加上IPADDR、NETMASK、GATEWAY等信息,然后重启网络服务:

sudo systemctl restart network

不过新一代系统更推荐用nmcli来管理网络。比如给网卡设置静态IP:

nmcli con mod ens33 ipv4.addresses 192.168.1.100/24 nmcli con mod ens33 ipv4.gateway 192.168.1.1 nmcli con mod ens33 ipv4.dns "223.5.5.5 119.29.29.29" nmcli con mod ens33 ipv4.method manual nmcli con up ens33

Ubuntu系的网络配置又不一样,新版用的是netplan,配置文件在/etc/netplan/目录下,格式是YAML。所以我经常提醒自己:拿到一台新服务器,第一件事就是搞清楚它是什么发行版、什么版本,再决定用哪套网络配置工具,不要拿CentOS的经验硬套Ubuntu。

6.3 开机卡在emergency mode怎么办

还有一种典型故障:服务器开机后进不了系统,界面提示进入了应急模式(emergency mode)。新手看到这个界面往往手足无措,其实原因通常比较简单——多半是/etc/fstab里的挂载配置写错了。

比如你加了一块数据盘,在/etc/fstab里加了一行开机自动挂载,结果UUID写错了,或者那块盘临时拿掉了,系统开机时就找不到挂载点,于是只能进应急模式等你处理。

处理步骤是这样的:

先让根文件系统变成可读写状态,因为在应急模式下根分区通常是只读的:

mount -o remount,rw /

然后查看日志确认具体是哪个挂载点报错:

journalctl -xb | grep -i error

再看/etc/fstab文件:

cat /etc/fstab

找到出问题的行,用#注释掉,或者修正UUID/设备路径,然后执行reboot重启。这里有个小技巧:在/etc/fstab里写挂载项时,不要用设备名(比如/dev/sdb1),因为在多盘环境下设备名可能变化,要用UUID或者LVM逻辑卷这种稳定的标识。用blkid可以查到设备的UUID:

sudo blkid

写fstab时也建议给中间一列加上dump和pass两个参数,最末位的pass填0或2,不要填1或者随意填,否则开机检查文件系统时也可能出问题。

最后再说说我的学习心得。Linux基础操作学起来并不难,关键是不要死记命令,而是理解每个操作背后的设计逻辑:目录为什么这样分、权限为什么这样设、包管理为什么这样设计。我在实际工作中见过太多人背熟了100条命令,遇到问题还是不会排查,原因就是只记住了"怎么做",没理解"为什么"。所以这篇分享我特意把很多坑和排查思路都写了出来,哪怕你现在还记不住所有命令,只要理解了排查的顺序和思路,遇到问题到时候查文档也能很快定位解决。这也是我觉得Linux最有魅力的地方——它给你足够强大的工具,也给你足够清晰的线索,剩下的就是动手实践了。

返回列表