news 2026/8/5 2:47:53

Linux系统管理核心技能:从用户权限到故障排查的实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux系统管理核心技能:从用户权限到故障排查的实战指南

1. 项目概述:从“会用”到“管好”的跨越

提到Linux,很多人的第一反应是黑乎乎的终端和一堆需要记忆的命令。确实,对于初学者而言,Linux的门槛似乎不低。但当你真正开始用它来部署一个网站、搭建一个数据库,或者仅仅是作为日常的开发环境时,你会发现,会敲几个命令只是起点。真正的挑战,或者说真正体现价值的地方,在于“系统管理”。这不是一个具体的项目,而是一整套贯穿Linux使用生命周期的技能集合。它意味着你从一个被系统规则限制的用户,转变为一个能够规划、部署、配置、监控、维护乃至优化整个系统环境的掌控者。

简单来说,Linux系统管理就是确保你的Linux服务器或工作站能够稳定、高效、安全地运行,并满足业务或工作需求的一系列实践活动。这听起来很宏大,但拆解开来,无非是几个核心领域:用户与权限管理、软件与包管理、存储与文件系统管理、网络配置与服务管理、进程管理与系统监控、以及安全加固。无论你是在个人电脑上折腾,还是在公司里维护着成百上千台服务器,这些核心技能都是相通的。区别只在于规模和自动化程度。

我接触Linux超过十年,从最早在虚拟机里安装Red Hat感到新奇,到后来在生产环境里处理线上故障彻夜难眠,深感系统管理这门“手艺”的重要性。它不像学习一门编程语言那样有明确的“Hello World”到“框架应用”的路径,它更像是一个工具箱,里面装满了各种工具(命令),你需要的是知道在什么场景下该用什么工具,以及如何组合使用它们。这篇文章,我就想结合自己踩过的坑和积累的经验,把这些工具箱里的核心工具和关键思路梳理一遍,目标是让你不仅能“会用”Linux,更能“管好”一个Linux系统。无论你是刚通过软考的信息系统管理工程师,还是日常需要与Linux打交道的开发者、运维,甚至是好奇的爱好者,这些内容都能为你提供一个扎实的实践指南。

2. 系统管理核心领域深度解析

Linux系统管理涵盖的范围非常广,但我们可以将其归纳为几个既独立又相互关联的核心领域。理解这些领域,就相当于拿到了系统管理的地图。

2.1 用户、组与权限:系统安全的基石

这是所有管理的起点。Linux是一个多用户操作系统,清晰的用户和权限划分是系统安全的第一道防线。

用户(User)与组(Group):每个文件和进程都属于一个特定的用户和组。root用户是超级管理员,拥有至高无上的权力。日常操作中,我们应尽量避免直接使用root,而是创建普通用户,并通过sudo机制临时获取管理权限。创建用户不仅仅是useradd一个名字那么简单,你需要考虑:

  • 家目录(Home Directory):用户登录后的起始位置,通常为/home/username。权限设置是否正确(一般为755700),关系到用户隐私和安全性。
  • 登录Shell:用户登录后使用的解释器,通常是/bin/bash。对于仅用于运行服务的系统用户(如nginx,mysql),应将其Shell设置为/sbin/nologin/bin/false,防止其通过SSH登录。
  • 用户ID(UID)和组ID(GID):系统内部通过数字ID识别用户和组。通常,UID 0是root,1-999是系统用户,1000以上是普通用户。保持UID/GID的一致性在跨服务器同步用户时至关重要。

文件权限与所有权:这是Linux最经典的特性之一。通过ls -l命令,你可以看到类似-rwxr-xr--的字符串和root root的所有者/组信息。

  • 权限三元组:分别对应所有者(u)所属组(g)其他用户(o)的读(r)、写(w)、执行(x)权限。数字表示法(如755)是修改权限的常用方式。
  • 特殊权限位:除了基本的rwx,还有三个高级权限位:
    • SetUID(s):当文件被设置SetUID后,任何用户执行此文件时,都将以文件所有者的身份运行。典型例子是/usr/bin/passwd,普通用户执行它可以修改自己的密码(修改/etc/shadow需要root权限)。
    • SetGID(s):对文件而言,效果类似SetUID,但以文件所属组的身份运行。对目录而言,在该目录下创建的新文件,其所属组会自动继承目录的所属组,常用于团队协作的共享目录。
    • Sticky Bit(t):通常用于像/tmp这样的公共可写目录。它确保用户只能删除或重命名自己创建的文件,而不能删除其他人的文件。
  • 访问控制列表(ACL):当基本的9位权限不够精细时(例如,需要给某个特定用户而非整个组授权),ACL就派上用场了。使用setfaclgetfacl命令可以设置和查看更复杂的权限规则。

实操心得:修改系统关键目录(如/etc,/usr,/var)的权限是极其危险的操作,很可能导致系统无法启动或服务异常。一个常见的坑是,错误地执行了chmod -R 777 /(递归将根目录权限改为777),这几乎等同于将系统大门完全敞开,必须通过救援模式修复。对于生产环境,任何权限修改操作前,务必先在测试环境验证,并明确知晓每一步的影响。

2.2 软件包管理:系统的“应用商店”

如何在Linux上安装、更新、卸载软件?这取决于你使用的发行版(Distribution)。主流的包管理系统分为两大阵营:Debian/Ubuntu系的APT和Red Hat/CentOS/Fedora系的YUM/DNF

APT(Advanced Package Tool)

  • 核心命令apt update(更新软件包索引),apt upgrade(升级所有可升级软件包),apt install <package_name>(安装),apt remove <package_name>(卸载),apt search <keyword>(搜索)。
  • 仓库管理:软件源列表位于/etc/apt/sources.list及其/etc/apt/sources.list.d/目录下的独立文件。国内用户通常需要更换为阿里云、腾讯云、清华大学的镜像源以加速下载。
  • 离线安装:有时服务器无法连接外网(即“离线环境”),这就需要离线安装。基本思路是:在一台有网络的同版本系统上,使用apt download <package>下载所需软件包及其所有依赖(可能需要apt-rdependsdpkg相关工具来递归获取依赖),然后将所有.deb文件拷贝到目标服务器,使用dpkg -i *.deb按依赖顺序手动安装。这是一个繁琐但必须掌握的技能。

YUM/DNF(Yellowdog Updater, Modified / Dandified YUM)

  • 核心命令yum updatednf upgrade(更新),yum install <package_name>dnf install(安装),yum remove(卸载),yum search(搜索)。DNF是YUM的下一代版本,速度更快,依赖解析更好。
  • 仓库管理:仓库配置文件位于/etc/yum.repos.d/目录下,后缀为.repo。同样支持更换国内镜像。
  • RPM包:底层是RPM(Red Hat Package Manager)包,可以使用rpm -ivh <package.rpm>直接安装本地文件,但不会自动解决依赖。

通用包管理技巧

  • 查看已安装软件apt list --installedyum list installed
  • 查看软件信息apt show <package>yum info <package>
  • 清理缓存apt clean/apt autocleanyum clean all,释放/var/cache下的空间。
  • 锁定软件版本:在生产环境中,为了防止意外升级导致服务不兼容,有时需要锁定某个关键软件(如PHP、Nginx)的版本。在APT中可以使用apt-mark hold <package>,在YUM中可以通过在yum.conf中设置exclude或使用versionlock插件实现。

2.3 存储与文件系统管理:数据的家园

磁盘空间不足是运维最常见的报警之一。管理存储不仅仅是分区和格式化,更包括日常的监控、扩容和优化。

磁盘与分区:使用fdisk(适用于MBR分区表)或gdisk(适用于GPT分区表)对磁盘进行分区。lsblk命令可以清晰列出所有块设备及其挂载点,是查看磁盘布局的首选。

文件系统:分区后需要创建文件系统,也就是“格式化”。常见的文件系统有:

  • ext4:Linux上最主流、最稳定的日志文件系统,适用于绝大多数场景。
  • XFS:高性能的日志文件系统,特别擅长处理大文件和高并发,是很多企业级发行版的默认选择。
  • Btrfs/ZFS:支持高级特性如写时复制(CoW)、快照、压缩、RAID功能的高级文件系统,但复杂度也更高。

创建文件系统的命令通常是mkfs.ext4 /dev/sdb1mkfs.xfs /dev/sdb1

挂载(Mount):创建好的文件系统需要“挂载”到目录树的某个位置(挂载点)才能访问。手动挂载使用mount /dev/sdb1 /data。为了让系统启动时自动挂载,需要将配置写入/etc/fstab文件。fstab的每一行定义了设备、挂载点、文件系统类型、挂载选项、dump标志和fsck检查顺序。

逻辑卷管理(LVM):这是应对存储需求变化的利器。LVM在物理磁盘(PV)之上抽象出卷组(VG),再从卷组中划分出逻辑卷(LV)。它的最大优势是可以在线动态调整逻辑卷的大小,而无需重启系统或移动数据。基本流程是:pvcreate->vgcreate->lvcreate->mkfs->mount。当空间不足时,可以扩展VG(添加新PV)或直接扩展LV。

交换空间(Swap):当物理内存不足时,系统会将部分不常用的内存数据暂存到磁盘上的交换空间。虽然Swap速度远慢于内存,但它可以防止因内存耗尽导致的进程被强制终止(OOM Killer)。交换空间可以是一个独立的分区,也可以是一个文件。使用swapon -s查看当前交换空间状态。

磁盘空间监控df -h命令查看各文件系统的磁盘使用情况。du -sh *命令查看当前目录下各文件和目录的磁盘占用大小,常用于定位“空间被谁吃了”。对于持续增长的业务目录(如日志、上传文件),需要建立监控告警。

注意事项/etc/fstab文件编辑错误可能导致系统无法启动。一个保险的做法是,在修改fstab后,先执行mount -a命令测试所有配置是否正确无误,然后再重启。此外,对于云服务器,数据盘通常需要手动分区、格式化并挂载,很多新手会忽略这一步,导致系统重启后数据盘“消失”。

2.4 网络配置与服务管理:系统的对外通道

让系统接入网络并对外提供服务,是服务器最重要的职能。

网络接口配置:现代Linux通常使用NetworkManagersystemd-networkd进行网络管理,但传统的配置文件方式依然需要了解。网卡配置文件位于/etc/sysconfig/network-scripts/(RHEL系)或/etc/netplan/(Ubuntu 18.04+)。配置内容包括IP地址、子网掩码、网关、DNS等。修改后需要重启网络服务(systemctl restart networknetplan apply)。

防火墙:防火墙是系统的门卫。iptables是传统的命令行工具,功能强大但规则复杂。firewalld(RHEL系)和ufw(Ubuntu)提供了更易用的前端。核心是理解“区域(Zone)”、“服务(Service)”和“端口”的概念。例如,通过firewall-cmd --permanent --add-service=http开放HTTP服务,比直接写iptables规则要直观得多。

系统服务管理:现代Linux普遍采用systemd作为初始化系统和服务管理器。服务管理是日常高频操作。

  • 核心命令systemctl start/stop/restart <service_name>(启停服务),systemctl enable/disable <service_name>(设置开机自启/禁用),systemctl status <service_name>(查看服务状态和日志)。
  • 服务状态解读status输出中的“Active (running)”表示运行中,“loaded”表示单元文件已加载。最有用的是底下的日志片段,能快速定位服务启动失败的原因。
  • 查看日志journalctl -u <service_name>是查看某个服务所有日志的标准命令。journalctl -f可以实时追踪所有系统日志。

SSH服务:这是远程管理Linux服务器的生命线。配置文件位于/etc/ssh/sshd_config。安全加固SSH是系统上线后的首要任务之一,常见措施包括:修改默认端口(如22改为其他端口)、禁止root用户直接登录(PermitRootLogin no)、使用密钥认证替代密码认证、限制允许登录的用户或IP(AllowUsers,DenyHosts)。

域名解析(DNS)/etc/resolv.conf文件定义了系统使用的DNS服务器。但注意,在由NetworkManagersystemd-resolved管理的系统上,这个文件可能是动态生成的,直接修改可能无效。更稳妥的方式是在网卡配置里指定DNS。

3. 日常运维与监控实操指南

系统配置好后,日常的运维和监控才是保证其长期稳定运行的关键。这部分工作往往占据了管理员大部分时间。

3.1 进程管理与系统资源监控

系统变慢了?程序没响应?首先得看看资源被谁消耗了。

进程查看与管理

  • ps:最基础的进程查看命令。ps auxps -ef可以列出所有进程的详细信息,包括PID(进程ID)、CPU/内存占用、启动命令等。
  • top/htop:动态的、交互式的进程监控工具。top是经典,htop是其增强版,界面更友好,支持鼠标操作和颜色高亮。在这里,你可以实时观察CPU、内存、Swap的使用情况,以及各个进程的资源消耗排名。按P(CPU排序)、M(内存排序)是常用操作。
  • kill/pkill:终止进程。kill -9 <PID>是强制杀死进程的最后手段,但可能导致数据不一致或资源未释放,应优先尝试kill -15(SIGTERM,允许进程进行清理工作)。pkill <process_name>可以根据进程名来杀进程。

系统资源监控命令

  • free -h:快速查看内存和Swap使用情况。
  • df -h:查看磁盘空间使用情况。
  • iostat:查看CPU统计信息和磁盘I/O情况,对于诊断磁盘瓶颈非常有用。
  • netstat/ss:查看网络连接、路由表、接口统计等。ss命令比netstat更快速、高效,是现代Linux的推荐工具。例如,ss -tlnp可以列出所有TCP监听端口及其对应的进程。
  • lsof:列出系统打开的文件。当你想知道哪个进程占用了某个文件或端口时,lsof是神器。例如,lsof -i :80查看谁在占用80端口。

系统负载(Load Average):在topuptime命令中看到的三个数字(如0.05, 0.10, 0.15),分别代表过去1分钟、5分钟、15分钟的系统平均负载。对于单核CPU,1.00表示CPU刚好满负荷。对于多核CPU,负载值可以超过核心数。如果15分钟负载远高于CPU核心数,说明系统持续繁忙。

3.2 日志分析:系统的“黑匣子”

日志是排查问题的第一手资料。系统日志主要存放在/var/log/目录下。

核心日志文件

  • /var/log/messages/var/log/syslog:通用的系统活动日志。
  • /var/log/auth.log/var/log/secure:认证和安全相关的日志,包括SSH登录成功/失败记录。
  • /var/log/dmesg:内核环形缓冲区日志,记录了硬件设备驱动和内核启动信息。
  • /var/log/cron:定时任务cronat的日志。
  • 各个应用程序的日志,如/var/log/nginx//var/log/mysql/等。

日志查看工具

  • tail -f /var/log/syslog:实时追踪日志尾部,这是监控服务启动或事件发生的常用方式。
  • grep:最强大的文本搜索工具。grep -i error /var/log/syslog搜索包含“error”的行(忽略大小写)。grep -A 5 -B 5可以显示匹配行前后5行的上下文。
  • less:分页查看大日志文件,支持搜索(/键)。
  • journalctlsystemd系统的统一日志工具,功能强大。journalctl -xe查看最近的错误日志及其详情。

日志轮转(Logrotate):为了防止日志文件无限增长占满磁盘,Linux使用logrotate服务定期对日志进行归档、压缩和清理。其配置文件在/etc/logrotate.conf/etc/logrotate.d/目录下。理解其配置(如dailyrotate 7compressmissingok等)对于管理应用日志至关重要。

3.3 计划任务与自动化

自动化是提升运维效率、减少人为错误的核心。

Cron:最经典的计划任务工具。用户通过crontab -e编辑自己的定时任务,系统级任务则可以直接在/etc/crontab/etc/cron.d/目录下添加文件。Cron表达式由五段组成(分 时 日 月 周),需要特别注意环境变量问题,因为在Cron环境下执行命令时,其环境与用户交互式Shell的环境不同,可能导致命令找不到。一个最佳实践是在脚本中使用绝对路径,或者在Cron任务中显式设置PATH等环境变量。

Systemd Timer:作为systemd生态的一部分,Timer提供了比Cron更精确(支持单调时间、实时时间)和更集成(与Service单元紧密绑定)的定时任务方案。它由两个单元文件定义:一个.service文件定义要执行的任务,一个.timer文件定义何时触发。虽然配置比Cron稍复杂,但对于需要与系统服务深度集成的定时任务(如定期备份数据库服务),它是更现代、更可靠的选择。

Shell脚本:将一系列命令和逻辑封装成脚本,是实现复杂自动化任务的基础。一个好的运维脚本应该包含:清晰的注释、错误处理(set -euo pipefail)、日志记录、参数校验等。例如,一个自动备份网站数据和数据库的脚本,是每个运维人员的必备工具。

4. 高级主题与故障排查实战

掌握了基础管理后,一些更深入的主题和排错技巧能让你在问题面前更加从容。

4.1 内核、模块与驱动

Linux内核是系统的核心。虽然普通管理员很少需要重新编译内核,但了解一些基本操作很有必要。

  • 内核版本uname -r查看当前运行的内核版本。
  • 内核模块:驱动和许多内核功能以模块形式存在。lsmod列出已加载的模块,modprobe <module_name>加载模块,rmmod <module_name>卸载模块。模块配置文件在/etc/modules-load.d/目录下。
  • 内核参数调优/proc/sys/目录下的虚拟文件暴露了众多内核参数,可以通过sysctl命令临时修改或通过/etc/sysctl.conf文件永久修改。例如,调节网络性能的net.ipv4.tcp_tw_reuse,调节虚拟内存管理的vm.swappiness等。

4.2 性能分析与优化

当系统出现性能瓶颈时,需要一套方法论和工具链来定位问题。

  1. 明确指标:是CPU高、内存不足、磁盘IO慢还是网络拥堵?先用topfreeiostatiftop等工具快速定位资源瓶颈类型。
  2. 定位进程:找到消耗该资源最多的进程(top中按P/M等)。
  3. 深入分析
    • CPU高:使用perf toppidstat 1查看进程的CPU使用细分(用户态/内核态)。如果是Java应用,可以用jstack抓取线程栈分析是否死锁或陷入循环。
    • 内存高:使用pmap -x <PID>smem分析进程的内存映射。检查是否有内存泄漏(内存使用量随时间持续增长不释放)。
    • 磁盘IO高:使用iotop找到IO高的进程,再用strace -p <PID>perf trace跟踪该进程的系统调用,看它在频繁读写哪些文件。
    • 网络慢:使用tcpdumpwireshark抓包分析,检查是否有大量重传、丢包或连接数异常。

优化思路:优化通常是权衡。例如,增加vm.swappiness值可以让系统更积极地使用Swap,避免OOM,但会降低性能。调整文件系统的挂载选项(如noatime)可以减少磁盘写操作,提升性能。数据库服务(如MySQL)的配置优化(缓冲区大小、连接数等)往往是提升整体应用性能的关键。

4.3 常见故障排查实录

这里记录几个我亲身经历或高频处理的典型问题及排查思路。

问题一:服务器无法通过SSH连接。

  • 排查步骤
    1. 网络连通性:先用pingtelnet <IP> 22检查端口是否可达。如果不可达,检查本地防火墙、云服务商安全组、以及服务器本身的防火墙(firewall-cmd --list-alliptables -L)。
    2. 服务状态:如果能通端口但连不上,登录云控制台或通过其他备用通道(如串口)进入服务器,检查SSH服务状态systemctl status sshd。查看日志journalctl -u sshd -ftail -f /var/log/secure,通常会有明确的错误信息,如“Permission denied”可能是密钥或密码错误,“Address already in use”可能是端口冲突。
    3. 磁盘空间:检查//var分区是否已满(df -h),磁盘满会导致很多服务行为异常,包括无法写入登录日志。
  • 避坑技巧:永远不要在最后一台SSH连接上修改SSH配置(如端口、禁止root),至少保证有另一个可用的连接(如通过云控制台的VNC)或先设置一个重启后生效的定时任务来恢复配置,防止把自己关在门外。

问题二:/var目录磁盘空间报警,占用100%。

  • 排查步骤
    1. 定位大文件/目录cd /var && du -sh * | sort -rh | head -10,找出占用最大的前10个目录。
    2. 常见元凶
      • 日志文件/var/log下的应用日志,特别是未配置日志轮转或轮转失败时。使用logrotate -f /etc/logrotate.d/<app>手动触发轮转测试。
      • Docker:如果使用了Docker,/var/lib/docker可能会因未清理的镜像、容器、卷而膨胀。使用docker system prune -a(谨慎!)清理。
      • APT/YUM缓存/var/cache/apt/var/cache/yum。使用apt cleanyum clean all清理。
      • 邮件队列/var/spool/postfix/var/spool/mail
    3. 清理策略:对于日志,可以手动删除旧的日志文件(如find /var/log -name “*.log” -mtime +30 -delete),但更重要的是修复日志轮转配置。对于缓存,可以安全清理。
  • 避坑技巧:不要直接使用rm -rf /var/log/*这样的危险命令,可能会误删正在被进程打开的重要日志文件,导致服务报错。对于正在写入的大日志文件,清空内容更安全的方式是truncate -s 0 /path/to/large.logecho “” > /path/to/large.log

问题三:进程无响应,系统负载极高。

  • 排查步骤
    1. 快速快照:立即执行top,按1看各CPU核心使用率,按P按CPU排序,按M按内存排序。记录下异常进程的PID。
    2. 分析进程:对可疑的PID,使用strace -p <PID>跟踪其系统调用,看它卡在哪个系统调用上(如频繁的磁盘读写、死锁)。对于Java进程,用jstack <PID> > jstack.log输出线程栈,分析是否有死锁或大量线程阻塞在同一个地方。
    3. 检查依赖资源:使用iostat -x 1看磁盘是否达到性能瓶颈(%util接近100%,await很高)。使用dstatiftop看网络流量。
    4. 决策:如果确认是某个非核心进程异常,可以考虑kill -15kill -9终止它。如果是核心服务(如数据库),则需要更谨慎,可能需要联系开发人员一起分析代码或查询语句。
  • 实操心得:高负载时,系统响应很慢,命令可能半天才返回。此时,提前在后台运行一个ssh会话并执行tophtop是很有用的。另外,systemd提供了systemctl kill命令,可以向服务发送特定的信号,有时比直接kill更可控。

Linux系统管理是一个实践性极强的领域,手册和命令列表只是工具,真正的能力在于面对复杂、未知的问题时,如何运用这些工具和系统性思维去定位和解决。我的建议是,为自己搭建一个实验环境(虚拟机或便宜的云服务器),主动去“破坏”它——填满磁盘、写死循环脚本耗尽CPU、错误配置网络——然后尝试修复。每一次从故障中恢复的过程,都是对这套管理系统理解加深的过程。记住,最可靠的技能不是背下了多少命令,而是在任何情况下都知道如何找到解决问题的路径。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/5 2:47:12

SchoolDB数据库设计与DDL实践指南

1. SchoolDB数据库概述SchoolDB是一个典型的学校管理系统数据库&#xff0c;主要用于存储和管理学生、教师、课程以及成绩等核心教育数据。作为教育信息化建设的基础组成部分&#xff0c;这类数据库的设计质量直接影响到后续应用开发的效率和系统运行的稳定性。在数据库设计领域…

作者头像 李华
网站建设 2026/8/5 2:39:13

CRT示波管拆解全攻略:从电子枪到荧光屏的深度解析

1. 项目概述&#xff1a;一次对经典显示元件的深度探访最近在整理工作室的旧零件箱&#xff0c;翻出了一只尘封已久的CRT示波管&#xff0c;型号是3SJ1J。这可不是普通的显像管&#xff0c;它是上世纪七八十年代国产示波器里的“眼睛”&#xff0c;是那个模拟电子技术黄金时代的…

作者头像 李华
网站建设 2026/8/5 2:39:07

从逻辑门到超前进位:深入解析计算机加法器的设计与优化

1. 从开关到加法&#xff1a;数字世界的基石运算如果你拆开过任何一台现代电子设备&#xff0c;无论是手机、电脑还是智能手表&#xff0c;其核心都是一块指甲盖大小的硅片——中央处理器&#xff08;CPU&#xff09;。这块硅片上&#xff0c;数以百亿计的微小晶体管以令人眼花…

作者头像 李华
网站建设 2026/8/5 2:31:48

Linux PAM认证故障修复与权限管理实践

1. 问题现象与紧急处理方案那天下午在修改Ubuntu 22.04 LTS的PAM认证配置时&#xff0c;一个vim保存操作让我瞬间失去了所有sudo权限——典型的"手比脑快"事故。系统用冰冷的"sudo: /etc/pam.d/sudo is owned by uid 1000, should be 0"错误提醒我&#xf…

作者头像 李华