ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

UNIX系统管理实战:Solaris与AIX排错、命令对照及Socket故障处理

UNIX系统管理实战:Solaris与AIX排错、命令对照及Socket故障处理 简介这份PDF从Solaris、AIX与HP-UX三个主流分支切入系统梳理UNIX操作系统的演进脉络与差异化特性。内容涵盖SunOS到Solaris的版本变迁、HP-UX对System V与访问控制列表的支持、AIX在日志文件系统与逻辑卷管理上的开创设计并对三者虚拟化能力、文件系统及命令行生态做了横向对照。全册采用单个PDF文件封装共1个文件体积约300KB适合手机或平板离线阅读。目前已有563人参与学习尤其适合刚接触UNIX的读者快速建立宏观认知也可供运维工程师对比不同平台的管理思路。突出之处在于附录的IBM小型机常用命令参考如uname、errpt等实际排障指令能帮助读者在面试或真实环境中准确区分三大UNIX流派的核心差异。1. 翻这本UNIX PDF的人多半是奔着Solaris和AIX的现场问题去的手上放着一份名为《UNIX操作系统(Solaris,AIX,UNIX).pdf》的资料真正会反复去翻它的人大概率不是想做学问而是机房角落那台跑了十年AMIBIOS的小机出了状况。同样是UNIXSolaris里的SMF服务和AIX里的LVM卷管理跟Linux里那套systemd加LVM2长得像用起来完全是另一套脾气。这份PDF的价值不在于开篇的UNIX历史而在于它把三套系统的公共骨架和各自管线放在一起对比。下面要讲的就是我拿到这类资料后实际会去验证的部分Solaris的SMF与DTrace、AIX的LVM与ODM、AIX换盘与dump现场以及那批与Unix Socket有关的守护进程报错。2. Solaris与AIX源自System V却在服务与卷管理上走向两条路2.1 Solaris的SMF与ZFS把配置即文件的习惯打破很多从Linux转过来的人第一个不适应就是服务不知道在哪启停。Solaris 10以后系统服务由SMFService Management Facility接管服务的启停、依赖、自动重启都由它统一管理配置则以XML清单文件放在/etc/svc/manifest里而不是像SysV init那样散落在/etc/rc*.d下面一堆链接。日常操作时svcs看状态svcadm做启停逻辑非常直接# 查看所有服务的当前状态过滤SSH svcs -a | grep ssh # 停用再启用某个服务实例-t表示临时生效重启后恢复原配置 svcadm disable -t svc:/network/ssh:default svcadm enable svc:/network/ssh:default # 服务进入维护状态后先修复问题再clear svcadm clear svc:/network/ssh:defaultsvcs输出的第三列是状态常见的有online、offline、maintenance和uninitialized。如果看到maintenance说明服务启动脚本或者依赖条件出了问题先改配置再svcadm clear让SMF重新拉起它。disable -t的临时模式在调试时很有用至少不会因为误操作把服务彻底关掉这是我在拿不熟悉的系统练手时经常用的保险做法。ZFS是Solaris另一个标志性设计。传统UFS/EXT4把文件系统挂在设备上ZFS则把存储池与文件系统做成了两层先建zpool再在池里创建数据集。命令上zpool list和zfs list分别看存储池与文件系统状态创建快照用zfs snapshot回滚用zfs rollback。这套组合在Solaris 11里与SMF深度绑定系统根文件系统本身就是ZFS数据集。理解这层关系之后再看AIX和Linux的卷管理思路很多概念都能对上号。2.2 AIX的LVM与ODM设备配置不再是一堆文本AIX与Solaris最大的不同是它把设备配置当成一个数据库来管理这个数据库就是ODMObject Data Manager里面存放了设备对象、属性和系统状态。传统UNIX修改/etc/hosts、/etc/inittab就是改配置AIX则维护了一套/etc/objrepos下的二进制库需要用odmget、odmadd这类命令去看。日常运维里接触最频繁的是lsdev查设备与lsattr看属性# 列出所有硬盘设备-C表示当前已定义-H以表头格式输出 lsdev -Cc disk -H # 查看hdisk0的属性包含物理位置、容量和状态 lsattr -El hdisk0 | head -20卷管理是AIX的精髓。AIX将磁盘划分为物理卷PV多个PV组成卷组VG再在VG内切割逻辑卷LV。与Linux LVM2最大的差异在物理分区PP这个概念AIX在PV上统一按照PP大小切块创建LV时指定PP个数而不是直接写大小。下面的命令串展示了一个典型的VG与LV查询过程# 查看系统当前的物理卷 lspv # 查看rootvg这个卷组的概要信息和其中的PV列表 lsvg rootvg lsvg -p rootvg # 查看rootvg下的逻辑卷第二列是LV大小第四列是挂载点 lsvg -l rootvglspv输出里如果某块盘的PV状态是missing说明物理磁盘不可达这通常是AIX盘故障的第一信号比看日志来得快。AIX的extendvg、migratepv、mkvg在逻辑上与Linux的vgextend、pvmove、vgcreate对应但要注意AIX的LV默认支持在线镜像和条带化策略在mklv时用-c、-s参数指定这是Linux主流的LVM2默认不具备的能力。2.3 三个分支都保留了POSIX骨骼进程、文件与权限的共通模型Solaris和AIX不管在服务管理上走多远基础底座仍是POSIX那套东西fork/exec的进程模型/etc/passwd与/etc/security/user管理账号进程间用信号通信核心转储交给coreadm或系统默认规则。文件权限都一样是rwx三段加特殊位只是AIX还在ODM里加了一层访问控制稍微复杂一些。排错手法上三者也有对应关系。Linux上定位一个进程在干什么用straceAIX上对应命令是trussSolaris则自带truss和更强大的dtrace。例如跟踪一个命令打开的所有文件# AIX下跟踪ls打开文件的系统调用把结果存到临时文件 truss -f -o /tmp/ls.truss ls /etc # Solaris 11下用DTrace统计系统调用次数 dtrace -n syscall:::entry { [execname] count(); } -c ls /etctruss -f会跟随子进程代码最后两行命令的输出格式不同但本质都是观察应用与内核的交互。理解这一层后面不管是看dump还是排查socket问题都能直接套用同一套系统调用分析的思路。3. 没有小机也能复现Solaris与AIX本地验证与Windows下的make环境3.1 搭一套能敲SMF命令的Solaris兼容环境真实Solaris硬件不好找但好在Oracle给了评估镜像Solaris 11.4的ISO需要Oracle账号申请适合想严谨复现的人。更轻量的路线是用OpenIndiana它基于OpenSolaris的illumos内核保留了SMF、ZFS和DTrace命令与Solaris 11几乎一致跑在虚拟机里就能玩。装好后第一件事我一般会确认系统版本和网络状态# 查看系统版本与内核信息 uname -a # 查看所有接口的IP地址Solaris 11之后推荐ipadm ifconfig -a ipadm show-addr # 确认SMF服务正常能看到online状态 svcs -a | grep sshifconfig在Solaris 11里虽然还能用但网络配置已经被ipadm接管配置地址用的是ipadm create-addr比如为接口net0添加一个地址ipadm create-addr -T static -a 192.168.1.10/24 net0/v4。这种命令还在但底层换了的现象正是UNIX系统升级时最常见的坑PDF里如果只讲ifconfig不提ipadm那这份资料至少落后了一个大版本。3.2 用Linux LVM2复现AIX卷组操作再对照差异AIX不像Solaris有x86评估镜像公开可取常见的做法是用Linux的LVM2把概念跑通再回看AIX命令找差异。Linux的LVM2本身就是从AIX LVM移植演化来的PV、VG、LV三层结构几乎一致只是AIX多了PP分配单位和ODM记录Linux统一用PE。在虚拟机里加两块盘就能完整走一遍创建和扩容流程# 创建物理卷并组卷组名字起成datavg便于和AIX对照 pvcreate /dev/sdb /dev/sdc vgcreate datavg /dev/sdb /dev/sdc # 创建10G逻辑卷挂载后写入测试数据 lvcreate -L 10G -n testlv datavg mkfs.ext4 /dev/datavg/testlv mount /dev/datavg/testlv /mnt # 扩容先把新盘扩进卷组再扩大逻辑卷 vgextend datavg /dev/sdd lvextend -L 5G /dev/datavg/testlv对照AIX时pvcreate对应mkvg做的事vgextend对应AIX的extendvglvextend对应AIX的extendlv。区别在于AIX的mklv会问你是要镜像还是条带而Linux在创建时不默认做这些。用一台Linux虚拟机把LVM2玩熟再看AIX手册里的lsvg -l rootvg输出理解成本会低很多。3.3 Windows 11下执行UNIX make的三种可行选型Windows 11下怎么执行UNIX make本质是想在本机编译Linux/UNIX的源码。三条路线各有利弊WSL2最接近真实UNIX环境MSYS2/MinGW提供原生Windows工具链Cygwin则是一个完整POSIX兼容层。我一般首选WSL2因为它不是模拟而是真正的Linux内核在虚拟机里跑Makefile里的路径、符号链接、权限行为都与服务器一致# 安装Ubuntu发行版 wsl --install -d Ubuntu # 进入WSL后安装基础编译工具 sudo apt update sudo apt install -y build-essential # 进入源码目录后直接走标准流程 ./configure make make install选MSYS2时要注意make命令在MinGW环境下叫mingw32-make很多Makefile里硬编码了gcc和rm -rf等UNIX指令在Windows原生命令行下会直接失败。所以如果只是临时编译一个开源库WSL2最省心如果要产出Windows本地可执行文件那就用MSYS2并接受它和标准makefile之间的摩擦。理解这个区别比记住某一条命令更有用。4. AIX现场排错从dump分析到RAID10换硬盘的命令链4.1 用errpt和sysdumpdev读取崩溃前的现场AIX机器重启后第一件事我习惯同时看两份东西errpt错误报告和sysdumpdev里的dump记录。errpt记录硬件、软件和操作引起的错误-d H过滤硬件错误-d S过滤软件错误。如果系统发生过内核崩溃sysdumpdev -L会显示上一次dump的时间和大小那是系统死透前留下的最后现场。# 查看全部错误-a输出完整详细信息建议重定向到文件再翻 errpt -a /tmp/errpt_full.txt # 只查硬件错误 errpt -d H # 查看dump设备配置和上一次dump信息 sysdumpdev -l sysdumpdev -L AIX 7: sysdumpdev -Lerrpt每条记录都有CLASS、TYPE和资源名。硬件错误的CLASS通常是HTYPE有可能是PERM永久性或TEMP瞬时性。PERM意味着设备已经不可用TEMP则可能只是电压波动或瞬时总线错误。看到一堆TEMP时不需要立刻换硬件先对比时间段和频率。但如果某个hdisk同时出现PERM和lspv里status变成missing那基本可以判定物理盘要换了。4.2 dump信息的类型区分与后续分析路径AIX的dump分两类系统内存转储system dump和用户进程转储user dump。系统崩溃后内核把内存镜像写到dump设备这个设备通常是/dev/hd7或单独划分的/dev/sysdump。sysdumpdev -l能看到主dump设备和二级dump设备二级设备一般指向lg_dumplv即rootvg里预先保留的逻辑卷。拿到dump之后常规分析路径是先用snap收集系统信息包括错误日志、配置和dump文件# 收集系统快照-r表示同时获取dump和错误日志 snap -r -o /home/root/snap_out # 查看snap生成的目录结构确认errpt和dump文件都在 ls -l /home/root/snap_out真正深入分析dump内的内核栈要用IBM的kdb调试器或交给技术支持处理。一线运维能做到的是把dump时间、errpt里的错误序列、以及崩溃前运行的进程清单对应起来判断是硬件触发panic还是内核模块问题。这个时间线比对往往比分析dump本身更快得出结论。4.3 RAID10换硬盘先盘外映射再操作LVMAIX机器上换RAID10硬盘第一步不是动命令而是搞清楚盘在哪个维度上。如果RAID卡是硬卡操作系统看到的是虚拟盘如hdisk1、hdisk2物理盘槽位需要从RAID管理界面确认。如果是存储阵列通过光纤或SAS连过来的盘则要借助lspv、lsdev -Cc disk和多路径信息把操作系统盘符与存储LUN对应起来。# 列出缺少的物理卷missing状态说明盘失联 lspv | grep -i missing # 删除失效的设备定义-d表示删除-l指定设备名 rmdev -dl hdisk3 # 新盘插入并由cfgmgr识别后把新盘扩入卷组 cfgmgr extendvg rootvg hdisk5如果是rootvg新盘加入后建议做镜像再移除坏盘的镜像副本。AIX 7.1以上的环境里有replacepv可以做在线替换但老版本还得靠migratepv加rmdev的组合。整个流程里最容易漏的是换盘前没记录各hdisk对应的物理槽位导致拔错盘。我一般会在lsdev -Cc disk之外结合lsattr -El hdiskX -a location确认物理位置再进RAID界面核对序列号。5. UNIX Socket守护进程排错docker daemon与mysqld_safe是同一类问题5.1 cannot connect to the docker daemon at unix:///var/run/docker.sock怎么查很多人在Linux下第一次装完docker就撞上这条Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?。看字面是连接daemon失败但实际有三层可能daemon没起来、socket文件不存在、当前用户没权限。排查顺序我一般从进程开始而不是先看socket# 1.确认dockerd进程是否在 ps -ef | grep dockerd # 2.看systemd服务状态能看到最近启动失败的原因 systemctl status docker # 3.查看socket文件是否存在以及权限 ls -l /var/run/docker.sock如果进程在、socket也在报错通常就是权限问题。/var/run是/run的符号链接socket文件默认属主是root:docker当前用户不在docker组时直接拒绝连接。解决方式# 把当前用户加入docker组重新登录后生效 sudo usermod -aG docker $USER如果socket文件不存在但dockerd进程还在多半是daemon启动时把socket建在了别处或DOCKER_HOST环境变量指向了远端TCP端口。这时候echo $DOCKER_HOST看一眼如果是tcp://...那根本不是本地socket的问题而是客户端配置问题。这层同名报错不同病根的判断比背命令更重要。5.2 mysqld_safe的socket目录不存在创建、属主、持久化mysqld_safe Directory /var/run/mysqld for UNIX socket file dont exists.这条报错几乎总出现在重启之后。原因很明确/var/run是tmpfs重启即清空负责建目录的启动脚本没跑或没权限。临时解法是手动建目录并改属主mkdir -p /var/run/mysqld chown mysql:mysql /var/run/mysqld chmod 755 /var/run/mysqld # 启动MySQL服务 service mysqld start但这样改下次重启还会丢。正确的持久化办法是用systemd的tmpfiles机制让系统在启动时自动创建这个目录# 新建配置文件d表示目录后面是权限、属主和属组 echo d /var/run/mysqld 0755 mysql mysql - /etc/tmpfiles.d/mysqld.conf systemd-tmpfiles --create /etc/tmpfiles.d/mysqld.confsystemd-tmpfiles --create可以立即生效验证配置文件是否写对。也可以绕过这个目录在my.cnf里把socket指定到/tmp/mysql.sock/tmp不是tmpfs的场景会更省心但要注意php或应用侧的socket路径需要同步修改。5.3 三步通法进程端口、Socket文件、属主权限把docker和mysqld这两个问题放在一起会发现UNIX Socket排错是同一套路先确认守护进程活着再确认socket文件存在最后确认属主权限匹配。画成命令链就是这样# 第1步进程是否存在排除守护进程本身挂掉 ps -ef | grep -E dockerd|mysqld # 第2步socket文件是否存在路径和进程监听路径要一致 ls -l /var/run/docker.sock /var/run/mysqld/mysql.sock # 第3步当前用户能否写socket检查用户组和文件权限 id getent group docker看到cannot connect to unix socket这类报错第一反应不是找网络配置而是把这三步走一遍。绝大多数情况都落在第二步或第三步tmpfs目录没建、socket路径配置不一致、用户不在授权组里。这套方法在Solaris和AIX的Unix Socket程序上同样适用因为机制完全一样。6. 把PDF变成排查手册命令映射表、故障演练与一次系统调用跟踪6.1 三套命令映射表覆盖日常80%操作PDF翻完最容易忘的就是乱因为Solaris、AIX、Linux三套命令长得像又不一样。我会把高频操作整理成一张映射表贴在终端旁边实际用起来比翻书快功能Solaris 11AIX 7Linux查看IP地址ipadm show-addrifconfig -a/smitty mktcpipip addr查看服务状态svcs -alssrc -asystemctl查看硬盘zpool list/formatlsdev -Cc disklsblk查看卷组逻辑卷zfs listlsvg -l rootvgvgs lvs查看错误日志/var/adm/messageserrptjournalctl -xe跟踪系统调用dtracetrussstrace这张表不是全量对照而是筛选出两台机器同时出问题时最需要的那几条。实际上AIX和Solaris上的ps -ef、vmstat、netstat用法和Linux高度接近花时间记那些差异大的命令更有价值。6.2 在虚拟机里做一次不提前告知的故障演练把知识变成肌肉记忆的办法是演练。我会在OpenIndiana和Linux虚拟机上各做一次半小时故障处置提前把SSH服务禁用、把socket目录权限改掉、或者往文件系统里塞满一个临时文件然后只看系统日志定位。例如# 制造一个socket故障删除mysql目录并改属主再尝试启动服务 rm -rf /var/run/mysqld service mysqld start # 观察报错记录日志中的关键字 tail -20 /var/log/mysql/mysql.log演练的目的是练习排查顺序而不是记住答案。真正到生产环境时系统不会按教科书出牌但有了这套流程碰到errpt里跳硬件错误和lspv里出现missing时能条件反射地去核实盘符映射和raid状态而非停下来翻PDF找怎么办那一章。6.3 用truss追一次真实系统调用的路径最后一个实操习惯是把PDF里抽象的系统调用落到自己眼前。AIX上用truss跟踪一条ls命令的执行路径能看到它依次打开哪些库文件、读取哪个目录这样对UNIX一切皆文件的理解会变得非常具体# -f跟随子进程-o输出到文件然后跟踪ls -l /etc truss -f -o /tmp/ls_trace.txt ls -l /etc # 查看输出中open和access系统调用 grep -E open|access /tmp/ls_trace.txt | head -20在这个输出里能看到ls读取/etc/passwd、/etc/group和一堆locale相关文件也会看到某些以ENOENT结束的open调用那是程序在按顺序探测候选路径。很多诡异报错比如明明文件存在却打不开用这种方式追一遍系统调用立刻能看出是权限不够还是路径不对。这套手法在Solaris上用truss或dtrace执行逻辑完全一致只是命令名不同。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进