ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Unix/Linux/AIX命令差异实战指南:跨平台运维避坑手册

Unix/Linux/AIX命令差异实战指南:跨平台运维避坑手册 前两天处理一台AIX小机的存储告警习惯性地在终端里敲了lsblk和df -h结果第一条命令直接报command not found第二条输出虽然能用但单位看着也别扭。旁边一块儿跟了几年的同事说这环境其实没那么难关键是别再拿Linux的肌肉记忆往AIX上套。这句话我特别有感触。Unix、Linux、AIX三者的关系说简单点AIX是IBM的UNIX操作系统Linux是继承了UNIX设计思路的“类UNIX”系统。正因为同源很多命令的“长相”几乎一样但底层的实现、参数、输出格式、设备管理方式差异大得离谱。网上一搜Unix/Linux/AIX常用命令出来的大多是Linux命令直接拿到AIX上跑经常翻车。这篇东西不是man手册的翻译版是我这些年在这三个平台上来回切换时真正用过、真正踩过坑之后整理出来的实战命令清单。它会告诉你哪些命令能跨平台通用哪些必须换思路以及几个高频报错比如docker daemon连不上、mysqld_safe报socket目录不存在的完整排查链路。适合运维、DBA、以及刚接手AIX小机的朋友收藏没事翻一翻能少走很多弯路。1. 先分清三套命令的血缘同一个名字三个脾气1.1 Unix大家族与Linux“逆向兼容”的真相Linux当初就是照着UNIX的接口标准重写的一个自由操作系统所以它的命令、文件系统布局、权限模型肉眼可见地继承了大量UNIX习惯。AIX则是根正苗红的UNIX很多系统调用和运维思路跟BSD、Solaris同源。这里最关键的一点是Linux虽然长得像UNIX但它用的很多命令比如ip、systemctl、journalctl都是Linux自己发展出来的而AIX这边命令还是老UNIX那一套很多接口几十年没大改。这就出现一个很经典的场景在Linux上写着爽的sed -i、grep -P、ls -lh这些命令到了AIX上要么直接报参数错误要么行为不符合预期。因为AIX默认的awk还是旧的POSIX awk、sed也不支持GNU sed的-i参数。别看这些工具名字一样实际是两个不同的软件实现。1.2 同一类需求三个平台各自的主命脉我在三个平台上最常用的查询命令做一个表格可以对得很清楚查询目的AIXLinux系统版本oslevel -scat /etc/os-release或uname -aCPU信息lsdev -Cc processor、lparstat -ilscpu内存大小lsattr -El sys0 -a realmem、svmon -Gfree -h磁盘设备lsdev -Cc disk、lspvlsblk、fdisk -l文件系统df -gdf -h换页空间lsps -aswapon -s网卡与IPlsdev -Cc if、ifconfig -aip a、nmcli路由表netstat -rn也有lsrouteip route进程树ps -ef、topasps -ef、top、htop软件包lslpp -l、installp -lrpm -qa、dpkg -l服务管理lssrc -a、startsrc -s sshdsystemctl status sshd定时任务crontab -lcrontab -l记住这个对照表至少能保证你在AIX上不会一上来就lscpu、lsblk找半天。刚接手一台AIX机器我的习惯是先敲一遍oslevel -s、prtconf、lsdev -Cc disk、lsvg -o把这台机器的大致轮廓摸出来再谈下一步操作。1.3 AIX特有的“万能入口”smit/smitty一定要会用AIX上有个特别老但特别管用的东西叫smit或smitty它是IBM自己做的系统管理图形化菜单也可以直接在命令行敲smit mktcpip、smit chfs、smit mkuser来快速进到对应的配置界面。很多老师傅在AIX上配置IP、加文件系统、创建用户都不会去死记长参数而是直接进smit选菜单就能完成配置最后由系统自动生成并执行对应的命令。这其实省了很多事也减少了命令参数写错的风险。Linux上没有这个工具新学AIX的人如果记不住几个命令可以先靠smit保命然后在它生成的日志里找到实际执行的命令日志位置在smit的日志文件里久而久之自然就会了。2. 高频基础命令的兼容边界哪些能大胆用哪些一用就翻车2.1 文件与打包tar通用但解压乱码要处理ls、cd、cp、mv、rm、touch这些命令在AIX和Linux上都很通用日常操作基本没有区别。最容易出问题的是那些GNU扩展参数。比如ls -lh在Linux上很常见但AIX的ls很多版本并不支持-h参数。想不计算器手算大小的话可以用du -sm或du -g这也是我后来才适应的习惯。至于解压文件乱码这个挺常见的。用zip在Windows上压缩、传到Linux/AIX上解压文件名经常是一堆乱码原因在于压缩包里的文件名用了GBK编码。Linux上的解决办法是unzip -O CP936 file.zipAIX上的unzip一般没有-O选项更稳妥的办法是先用7z或zipinfo查看内部文件名编码或者解压后用convmv转换文件名编码。遇到文件内容乱码用iconv -f GBK -t UTF-8 oldfile newfile做一次编码转换基本能解决绝大多数看日志乱码的问题。2.2 文本处理三件套grep/sed/awk的版本坑grep在Linux和AIX上基本够用但差异集中在Linux的GNU grep支持-PPerl正则AIX的grep不支持复杂匹配要用egrep或者转义写法。AIX的grep在匹配某些中文或特殊字符时表现没GNU grep灵活多个条件多用grep -E a|b而不是grep -P a|b。sed在AIX上的坑最典型sed -i在AIX不可用。想原地修改文件最稳妥的写法是sed s/old/new/g file tmp mv tmp file这种写法虽然多了一步但能同时兼容AIX和Linux。如果你是在AIX上写自动化脚本我强烈建议别用sed -i统一走生成临时文件再覆盖的路线脚本换平台时不用改。awk也有类似的差异。AIX自带的awk是旧版本对-v、-F支持还行但某些GNU awk的扩展函数、gawk里的gensub、asort等AIX上都没有。生产脚本如果要跨平台尽量用基本的$1、$2、if、for语法少用GNU扩展。2.3 用户权限mkuser vs useradd别拿Linux思维硬套用户管理这块是重灾区。Linux上创建用户是useradd、usermod、userdelAIX上则是mkuser、chuser、rmuser。例如AIX创建一个用户mkuser id2100 groupstaff home/home/user1 user1 passwd user1想改用户属性chuser maxage0 user1 # 密码永不过期 lsuser -a ALL # 查看所有用户的属性Linux上的对应操作useradd -u 2100 -g staff -m user1 usermod -L user1 passwd user1还有一个细节AIX的/etc/passwd和Linux结构类似但AIX真正的密码哈希和用户策略在/etc/security/passwd、/etc/security/user里所以直接改/etc/passwd并不完全管用。而Linux的密码哈希在/etc/shadow。这会导致一个问题如果你把AIX的 /etc/passwd 文件拷到Linux上直接用大概率是不行的。运维同学在迁移账号时需要清楚这一点打包用户数据要带上安全策略文件。2.4 查找命令find还行which、locate有差异find在两边都用得挺多基本的-name、-type、-mtime、-exec参数两边都支持。但是有个习惯差异Linux上很多人用find / -name xxx 2/dev/null来忽略权限报错AIX上也支持这个写法。which在AIX上也能用但AIX的shell通常还支持whence命令来查看命令路径。locate在AIX上默认是没有的需要自己装而且locate的数据库更新方式是跑updatedbAIX上的名字可能不太一样实际的叫法是/usr/lib/locate/updatedb这里就不展开反正记住”AIX不要依赖locate直接用find“就行。3. 网络排查命令从ifconfig到socket错误最实战的对比3.1 查IP的姿势差异AIX看网卡靠lsdevlsattr“Unix查看IP地址命令”这个问题几乎隔三差五就有人问问的十有八九是AIX。因为在Linux上直接ip addr就完事了AIX上却没有ip命令只有老牌的ifconfig -a。在AIX上看IP我惯用的顺序是lsdev -Cc if # 先看系统有哪些网卡 ifconfig -a # 再看各网卡的IP配置 lsattr -El en0 -a netaddr # 如果ifconfig输出不完整用这个查指定网卡IP在Linux上ip addr show hostname -I两者经常有一个认知差异AIX的网卡名是en0、en1以太网而Linux常见的是eth0、ens33、enp0s3。AIX上配置IP除了smit mktcpip之外还可以直接改/etc/hosts配合ifconfig en0 192.168.1.10 netmask 255.255.255.0 up但要注意的是重启后需要固化配置否则会丢。AIX固化网卡配置通常要写进ODM库比如通过smit mktcpip或mkdev这也是很多Linux运维会忽略的点。3.2 docker daemon报错的完整排查链路热搜词里那条特别长cannot connect to the docker daemon at unix:///var/run/docker.sock. is the docker daemon running?。这是个典型的Linux环境问题但涉及的知识点很Unixunix socket文件。报这个错的本质是docker命令行客户端要通过/var/run/docker.sock这个本地socket文件与dockerd守护进程通信但连不上。排查链路我一般是按这个顺序走先看守护进程有没有起来systemctl status docker ps -ef | grep dockerd如果服务没启动先启动sudo systemctl start docker再看状态。看socket文件是否存在ls -l /var/run/docker.sock有些时候docker装好了但socket文件没生成多半是dockerd本身启动失败了此时去看dockerd的日志比如journalctl -u docker。检查当前用户权限docker的socket默认是root用户和docker组成员才能访问。如果你当前用户不在docker组就会报权限不足有时候报错显示connection refused但实际是权限问题。id groups sudo usermod -aG docker $USER注意加完组后需要重新登录或者newgrp docker不然docker ps还是报同样的错。检查DOCKER_HOST环境变量如果之前手动设置过DOCKER_HOST比如指向了远程主机或者非默认socket位置docker命令就会去连那个地址而不是本机默认socket。echo $DOCKER_HOST unset DOCKER_HOSTsocket文件残留的坑还有一种情况是dockerd根本没跑但/var/run/docker.sock这个文件还在你连的时候会显示connection refused而不是not found。这时候别犹豫直接确认dockerd进程和服务状态。这个排查链路我整理成了一张小表方便贴在笔记里报错特征大概率原因下一步动作connect: no such file or directorydocker.sock不存在检查dockerd是否启动connect: permission denied用户不在docker组或socket权限不够usermod -aG docker后重新登录connect: connection refusedsocket文件存在但dockerd没监听启动dockerd并查docker日志连到奇怪的主机设置了DOCKER_HOSTunset DOCKER_HOST3.3 mysqld_safe报socket目录不存在的处理另一个高频报错是mysqld_safe Directory /var/run/mysqld for unix socket file dont exists。这个其实就是MySQL在启动时要创建/使用Unix socket文件但/var/run/mysqld目录不存在或者权限不对。解决思路也简单要么把目录建好要么让mysql改用别的socket路径mkdir -p /var/run/mysqld chown mysql:mysql /var/run/mysqld然后启动mysqld_safe。如果你不想让mysql往/var/run写socket也可以修改/etc/my.cnf里的socket/tmp/mysql.sock统一改client和server两处的socket路径即可。这里其实反应出一个Unix习惯很多程序都喜欢通过socket文件做本地进程间通信目录没了服务就起不来这跟Windows那种网络端口通信的方式很不一样。3.4 端口、进程、防火墙netstat、ss、lsofLinux现在推荐用ss替代netstat但AIX上只有netstat所以两边都能用的还是netstatnetstat -an | grep LISTEN # 查看监听端口 netstat -rn # 查看路由表查看某个端口被哪个进程占用Linux用lsof -i:8080或ss -tlnpAIX上如果没有lsof可以结合netstat -an和rmsockAIX有rmsock命令可以把端口对应的socket关联到进程。rmsock用法比较少见我当年也是查了很久才知道netstat -an | grep 8080 # 找到对应TCB地址 rmsock 地址 tcpcb # 查看占用8080的进程不过一般生产环境会装lsof直接用lsof -i就行。防火墙这边Linux有iptables、firewalldAIX上默认没有iptables通常用genfilt或ipsec之类的策略比Linux复杂一般用户不需要直接上手。4. AIX存储与LVM命令RAID10换盘、卷组扩容、文件系统管理4.1 AIX的存储体系PV、VG、LV、PP、LP要说AIX和Linux最大的不同就是存储管理。Linux上常见的LVM其实很多设计思路跟AIX的LVM很像但命令完全不同而且AIX是真正把LVM作为系统标配用了几十年的。理解AIX存储的关键几个概念PVPhysical Volume物理卷就是一块盘比如hdisk0、hdisk1。VGVolume Group卷组由多个PV组成比如rootvg、datavg。PPPhysical Partition物理分区把PV切成的固定大小单元。LVLogical Volume逻辑卷由PP组成。LPLogical Partition逻辑分区LV由LP组成。镜像环境下LP与PP的关系是1:N非镜像则是1:1。对应的常用查看命令lsdev -Cc disk # 查看系统识别到的硬盘 lspv # 查看每个PV属于哪个VG、状态、可用PP数 lsvg -o # 查看当前激活的VG lsvg rootvg # 查看rootvg的总体信息 lsvg -p rootvg # 查看rootvg包含哪些PV及其状态 lsvg -l rootvg # 查看rootvg下每个LV的文件系统挂载点、LP数、状态 lslv -l lvname # 查看某个LV分布在哪些PV上这些命令在排查坏盘、做扩容时几乎是必用的。4.2 AIX RAID10/镜像场景下更换坏盘的完整流程很多人一提到AIX的RAID10就想到物理阵列卡但AIX更常见的是用LVM做镜像比如rootvg有两块盘LV做了双份镜像这就是典型的“RAID1”效果多组盘再组合可以类比RAID10。热搜词“aix raid10 更换硬盘”实际遇到最多的场景就是“rootvg里有一块盘坏了怎么在不停机的情况下换掉”。假设 rootvg 由 hdisk0 和 hdisk1 组成镜像现在lspv显示 hdisk1 的VGID变成Missing缺失或者lsdev -Cc disk里 hdisk1 的状态从Available变成了Defined基本可以断定这盘掉线了。我用下面的流程处理过好多次稳妥可靠确认当前镜像状态lsvg -p rootvg lsvg -l rootvg正常镜像下每个LV的LPs和PPs数量是翻倍的比如LPs是512PPs是1024。如果PPs明显少于LPs的两倍说明某个LV失去了镜像副本。在系统里删除坏盘的设备定义rmdev -dl hdisk1-d表示删除设备定义-l指定逻辑设备名。如果系统报设备忙你需要先把跟这块盘相关的LV从它上面移走或先exportvg但rootvg一般不能直接export所以如果盘还在线但坏了要慎重处理。物理更换前还要确认这块盘对应的物理位置AIX可以用lscfg -vp hdisk1查看序列号和位置信息避免拔错盘。物理换盘然后重新扫描更换硬盘后执行cfgmgr让系统重新识别硬件再用lsdev -Cc disk查看新盘是哪个设备名可能是hdisk1也可能是hdisk2。把坏PV从卷组里踢掉如果旧盘在VG里还显示missing执行reducevg -d rootvg hdisk1这里-d表示同时把该PV上相关的LV定义删掉。注意因为是镜像LV在hdisk0上还有副本所以可以用-d安全删除如果不是镜像你得先把LV的数据迁走或备份不能贸然动。把新盘加入rootvgextendvg rootvg hdisk1如果新盘之前属于别的卷组会报“PV belongs to another VG”这时先执行chpv -C hdisk1清掉盘上的VG信息再extendvg。重建镜像mirrorvg -c 2 rootvg这一步会把rootvg里每个LV重新做成两份自动补到新加入的盘上。如果只想同步某个LV也可以syncvg -v rootvg或手动mklvcopy。做完后执行lsvg -l rootvg和lspv注意看Stale陈旧的PP数量如果Stale不为0说明镜像还在同步中等它同步完。检查并更新启动列表这是最容易被忽略的一步。换盘后必须确认系统启动顺序里包含了可用的启动设备bootlist -m normal -o正常应该看到 hdisk0 hdisk1或盲显示其它启动盘。如果里面没有新的hdisk就需要设置bootlist -m normal hdisk0 hdisk1不然后续重启可能直接引导失败。这一步我吃过亏当时换盘后一切看着正常结果一次计划内重启直接起不来就是因为bootlist里还残留着旧的坏盘设备。4.3 文件系统扩容AIX的chfs、Linux的lvextendAIX上判断文件系统是否满了用df -g以GB显示。要扩容最简单的是chfs -a size10G /oradata这条命令会自动扩展LV并调整文件系统大小前提是VG里有足够的空闲PP。如果VG空间不足先用extendvg加新盘再扩chfs。在Linux上流程略不一样通常要分两步lvextend -L 10G /dev/mapper/vgdata-lvoradata resize2fs /dev/mapper/vgdata-lvoradata很多Linux新手只扩了LV忘了扩文件系统结果df -h一点没变反过来AIX的chfs一步到位思维方式不太一样。有一点要注意AIX创建文件系统常用crfs -v jfs2 -g datavg -a size20G -m /data。jfs2是AIX的日志文件系统类似Linux的ext4/xfs。AIX的LV默认可以用lslv查看挂载点这些信息不像Linux的/etc/fstab那么直观AIX也有/etc/filesystems格式和fstab不同。4.4 其他AIX存储常用命令速记lsps -a查看换页空间swap类似Linux的swapon -s。lsvg datavg查看卷组剩余PP扩容前必看。lspv -l hdisk1查看某块盘上有哪些LV。lsfs查看所有文件系统定义。lsmksysb相关的mksysb做rootvg的系统备份类似Linux的dd备份系统盘但更专业。换盘前的保命操作。5. AIX故障诊断命令errpt、snap、dump分析别等宕机了才学5.1 errpt硬件和软件错误报告AIX的errpt是看系统错误日志的核心命令。Linux对应的是dmesg、/var/log/messages但AIX把错误统一管理起来用errpt就能查。常用姿势errpt # 列最近错误摘要 errpt -a # 显示详细错误信息 errpt -d H # 只看硬件错误 errpt -d S # 只看软件错误 errpt -d O # 只看操作错误 errpt -a -s 052806000017 # 从某个时间点开始查询格式MMDDhhmmYY生产环境中看到errpt里有H类型错误比如DISK的ERREXIST、SCSI的报错基本就是硬件出了问题该看微码更新或者准备换盘了。如果拿不准把errpt -a完整输出保存下来配合lscfg -vp记录的设备序列号一起发给硬件厂商定位会快很多。5.2 dump配置与分析sysdumpdev、snapAIX系统死机后会生成系统dumpLinux有kdumpAIX则把这部分独立为“系统转储”。平时要确认dump设备配置是否正常sysdumpdev -L # 查看当前dump设备 sysdumpdev -l # 查看上次dump的信息如果sysdumpdev -l显示之前有dump发生那这台机器大概率经历过一次kernel panic或硬件级崩溃需要重点排查。真遇到宕机需要采集信息最常用的命令是snapsnap -ac它会收集系统配置、错误日志、卷组信息、dump文件等打包放到/tmp/ibmsupt目录下。这个包可以直接提供给支持人员做进一步分析。更深度的dump分析会用crash或kdb工具属于系统工程师的进阶技能日常运维至少要会用snap采集现场信息而不是等专家来了才临时找。5.3 性能监控三兄弟topas、vmstat、iostatAIX上的性能监测工具最经典的是topas它就像一个加强版的top打开后按d看磁盘、按n看网络、按p看进程信息密度很高。topas # AIX性能监控 vmstat 2 5 # 每2秒采样5次看CPU和内存、队列 iostat -d 2 5 # 看硬盘IOLinux上更常用top/mpstat/iostat/pidstat。思路都一样只是AIX里topas把所有信息聚合到一起比Linux散落的多个命令更集中。另外AIX查内存还常用svmon -G能看真实内存和分页空间使用比free -m更细。这里提醒一个常见的坑AIX的vmstat输出里pi、popage in/out如果持续不为0说明物理内存可能吃紧系统在频繁换页不要只盯着id空闲率看。6. 上了生产才知道的细节容器、Git与日常维护习惯6.1 容器和Git命令照用但注意socket和权限本质现在很多服务器跑着docker、git、k8s相关组件这些命令在Linux上照用但底层的Unix原理并没过时。docker的socket连接问题、git的ssh连接问题归根结底还是文件权限和进程通信的问题。git常用命令git clone、git pull、git log在Linux和AIX上行为差异不大只要你装好了git。hdfs常用命令比如hdfs dfs -ls、hdfs dfs -put则要看Java环境和HDFS客户端跟AIX还是Linux关系不大。6.2 systemd和inittab两个时代的开机自启管理Linux现在基本是systemctl enable/disable统一管理服务与开机自启。AIX没有systemd用的是老一套/etc/inittab加mkitab/chitab/rmitab维护。比如在AIX上要把某个脚本加入开机启动mkitab myscript:2:once:/path/to/script.sh查看开机项cat /etc/inittabLinux上的开机自启systemctl enable myservice systemctl list-unit-files | grep enabled理解了这个差异你就会明白为什么很多AIX老运维很少谈“服务管理”而是直接说“改inittab”。顺手补充一下AIX的服务状态查询用lssrc -a也很常见特别是看ssh、ftp、sendmail这些子系统有没有起来。6.3 DNS配置的一个常见坑resolv.conf被改不生效热搜词里有个“linux中配置dns出现的问题”我估计好多人遇到过手动改了/etc/resolv.conf但是重启后或过一段时间又变回去了。原因是很多Linux发行版用了systemd-resolved或NetworkManager管理DNS。改/etc/resolv.conf通常是临时生效的。要永久的做法是使用NetworkManager用nmcli con mod 系统连接名 ipv4.dns 8.8.8.8 114.114.114.114修改再nmcli con up。使用systemd-resolved编辑/etc/systemd/resolved.conf设置DNS然后重启systemd-resolved。或者干脆关掉这些DNS管理服务再手动维护/etc/resolv.conf适合离线环境或纯静态配置的服务器。AIX上没有systemd-resolved这一套DNS配置通常在/etc/resolv.conf改完就会一直生效反而简单直接。这也是为什么熟悉AIX的人到了Linux上容易被systemd的“智能修改”搞懵。6.4 环境探测命令签收新服务器时的第一件事最后分享一个个人习惯每当我接手一台新的Unix/Linux机器不会急着去敲业务命令而是先花两分钟做一次环境探测把系统底细摸清楚# Linux cat /etc/os-release lscpu free -h lsblk ip addr systemctl list-units --typeservice --staterunning | head -20 # AIX oslevel -s lparstat -i svmon -G lsdev -Cc disk lsvg -o ifconfig -a lssrc -a这套操作下来系统版本、CPU内存、磁盘结构、网络配置、运行中的服务都心里有数了。之后再去看具体业务基本不会出现“找个网卡都找半天”的窘境。关于Unix/Linux/AIX命令这个话题我写了这么多年最大的体会是命令永远背不完但底层机制是相通的——进程、权限、文件描述符、socket、套接字、管道理解了这些无论换到什么平台都不会慌。真遇到不懂的先man命令查手册再上对应平台的社区搜多试几次就能摸清规律。希望这份总结能帮你少踩几个坑。
返回列表