物理机常用命令
2026-07-28 · devops · 4 次阅读
乌班图UBUNTU
- 在 Ubuntu 20/22 上用系统自带命令并行采集主机型号、序列号、CPU/内存/磁盘/网卡/GPU 及关键驱动版本等设备信息,约 10 秒内完成,支持非 root(sudo)与重复执行。
timeout 10 bash <<'EOF'
D=$(mktemp -d); trap 'rm -rf "$D"' EXIT
sudo -v 2>/dev/null || true
( echo "=== OS / Kernel ==="
uname -a
grep -E '^(NAME|VERSION)=' /etc/os-release
) >"$D/1" &
( echo "=== System / Board / BIOS ==="
for f in sys_vendor product_name product_serial product_uuid \
board_vendor board_name board_serial chassis_serial \
bios_vendor bios_version bios_date; do
v=$( { cat /sys/class/dmi/id/$f || sudo cat /sys/class/dmi/id/$f; } 2>/dev/null | tr -d '\0' )
[ -n "$v" ] && [ "$v" != "None" ] && [ "$v" != "N/A" ] && \
printf '%-18s %s\n' "$f" "$v"
done
) >"$D/2" &
( echo "=== CPU ==="
lscpu | grep -E '^(Architecture|CPU\(s\)|Model name|Vendor ID|Thread|Core|Socket|Hypervisor)'
) >"$D/3" &
( echo "=== Memory modules (installed) ==="
sudo dmidecode -t memory 2>/dev/null | awk '
function flush( ok){
ok=(size!="" && size!~/^(No Module|Not Installed|None|0($| ))/)
ok=ok && (sn!~/^NO DIMM/) && (mfr!~/^NO DIMM/) && (pn!~/^NO DIMM/)
if(ok) printf "%s | %s | %s | %s | %s | %s\n", size,loc,speed,mfr,sn,pn
size=loc=speed=mfr=sn=pn=""
}
/^[[:space:]]*Memory Device/{flush(); next}
/^[[:space:]]*Size:/{sub(/^[^:]+:[[:space:]]*/,""); size=$0; next}
/^[[:space:]]*Locator:/{sub(/^[^:]+:[[:space:]]*/,""); loc=$0; next}
/^[[:space:]]*Speed:/{sub(/^[^:]+:[[:space:]]*/,""); speed=$0; next}
/^[[:space:]]*Manufacturer:/{sub(/^[^:]+:[[:space:]]*/,""); mfr=$0; next}
/^[[:space:]]*Serial Number:/{sub(/^[^:]+:[[:space:]]*/,""); sn=$0; next}
/^[[:space:]]*Part Number:/{sub(/^[^:]+:[[:space:]]*/,""); pn=$0; next}
END{flush()}
'
free -h | awk 'NR==2{printf "Mem total=%s used=%s available=%s\n",$2,$3,$7}'
) >"$D/4" &
( echo "=== Disks ==="
lsblk -d -e 7,11 -o NAME,TYPE,SIZE,MODEL,SERIAL,TRAN,REV 2>/dev/null
) >"$D/5" &
( echo "=== Key PCI devices / drivers ==="
lspci -nnk 2>/dev/null | awk '
/^[0-9a-f.:]+ /{
keep=($0 ~ /Ethernet|Network|RAID|Non-Volatile|VGA|3D controller|USB controller|SATA|SAS|Fibre|InfiniBand/)
buf=$0; drv=""; next
}
/Kernel driver in use:/{drv=$0}
/Kernel modules:/{
if(keep){print buf; if(drv!="")print drv; print}
buf=""; drv=""; keep=0
}
END{if(keep&&buf!=""){print buf; if(drv!="")print drv}}
'
) >"$D/6" &
( echo "=== Driver versions (key modules) ==="
for m in ixgbe megaraid_sas nvme nvidia ast ahci; do
modinfo "$m" >/dev/null 2>&1 || continue
ver=$(modinfo -F version "$m" 2>/dev/null | head -n1)
verm=$(modinfo -F vermagic "$m" 2>/dev/null | awk '{print $1}')
[ -z "$ver" ] && ver="(no version field)"
printf '%-14s version=%-20s vermagic=%s\n' "$m" "$ver" "${verm:--}"
done
if command -v nvidia-smi >/dev/null; then
nvidia-smi --query-gpu=index,name,uuid,driver_version,serial \
--format=csv,noheader 2>/dev/null | sed 's/^/GPU /'
fi
) >"$D/7" &
( echo "=== Physical NIC drivers ==="
for n in /sys/class/net/*; do
i=${n##*/}
case "$i" in lo|bond*|br-*|docker*|veth*|virbr*|tun*|tap*) continue ;; esac
[ -e "$n/device" ] || continue
ethtool -i "$i" 2>/dev/null | awk -v i="$i" '
BEGIN{printf "%-12s", i}
/^driver:/{printf " driver=%s", $2}
/^version:/{printf " version=%s", $2}
/^firmware-version:/{printf " fw=%s", substr($0,index($0,$2))}
END{print ""}
'
done
) >"$D/8" &
wait
for i in 1 2 3 4 5 6 7 8; do [ -s "$D/$i" ] && { cat "$D/$i"; echo; }; done
EOF
CentOS 7 / Rocky 9
- 在 CentOS 7 与 Rocky 9 上用系统自带命令并行采集主机型号、序列号、CPU/内存/磁盘/网卡/GPU 及在用驱动版本等设备信息,约 10 秒内完成,支持非 root(sudo)与重复执行。
timeout 10 bash <<'EOF'
D=$(mktemp -d); trap 'rm -rf "$D"' EXIT
sudo -v 2>/dev/null || true
PR='Ethernet|Network|RAID|Non-Volatile|VGA|3D controller|SAS|Fibre|InfiniBand|Serial Attached'
SKIP_IF='lo|bond*|br-*|docker*|veth*|virbr*|tun*|tap*|ovs*|kube*'
( echo "=== OS / Kernel ==="
uname -a
if [ -r /etc/os-release ]; then
grep -E '^(NAME|VERSION|VERSION_ID)=' /etc/os-release
elif [ -r /etc/redhat-release ]; then
cat /etc/redhat-release
fi
) >"$D/1" &
( echo "=== System / Board / BIOS ==="
for f in sys_vendor product_name product_serial product_uuid \
board_vendor board_name board_serial chassis_serial \
bios_vendor bios_version bios_date; do
v=$( { cat /sys/class/dmi/id/$f || sudo cat /sys/class/dmi/id/$f; } 2>/dev/null | tr -d '\0' )
case "$v" in ""|None|N/A) continue ;; esac
printf '%-18s %s\n' "$f" "$v"
done
) >"$D/2" &
( echo "=== CPU ==="
lscpu 2>/dev/null \
| grep -E '^(Architecture|CPU\(s\)|Model name|Vendor ID|Thread|Core|Socket|Hypervisor)'
) >"$D/3" &
( echo "=== Memory modules (installed) ==="
sudo dmidecode -t memory 2>/dev/null | awk '
function t(s){gsub(/^[[:space:]]+|[[:space:]]+$/,"",s); return s}
function c(s){s=t(s); return (s~/^(Unknown|Not Specified|None|NO DIMM)?$/)?"-":s}
function ns(s,n){s=t(s); if(s~/^[0-9]+[[:space:]]*MB$/){n=s+0;
return (n%1024==0)?sprintf("%d GB",n/1024):n" MB"} return s}
function mb(s,n){s=t(s); n=s+0; return s~/TB/?n*1048576:s~/GB/?n*1024:s~/MB/?n:0}
function flush(ok,k){
size=ns(size); loc=c(loc); speed=c(speed); mfr=c(mfr); sn=c(sn); pn=c(pn)
sub(/[[:space:]].*$/,"",pn)
ok=(size!="" && size!~/^(No Module|Not Installed|None|0($| )|-)/ && (sn!="-"||mfr!="-"))
if(!ok){size=loc=speed=mfr=sn=pn=""; return}
n++; lc[n]=loc; sr[n]=sn; tot+=mb(size)
k=size"\t"speed"\t"mfr"\t"pn; cnt[k]++; if(!(k in ord)) ord[k]=++og
size=loc=speed=mfr=sn=pn=""
}
/^[[:space:]]*Memory Device/{flush(); next}
/^[[:space:]]*Size:/{sub(/^[^:]+:[[:space:]]*/,""); size=$0; next}
/^[[:space:]]*Locator:/{sub(/^[^:]+:[[:space:]]*/,""); loc=$0; next}
/^[[:space:]]*Speed:/{sub(/^[^:]+:[[:space:]]*/,""); speed=$0; next}
/^[[:space:]]*Manufacturer:/{sub(/^[^:]+:[[:space:]]*/,""); mfr=$0; next}
/^[[:space:]]*Serial Number:/{sub(/^[^:]+:[[:space:]]*/,""); sn=$0; next}
/^[[:space:]]*Part Number:/{sub(/^[^:]+:[[:space:]]*/,""); pn=$0; next}
END{
flush(); if(n<1){print "(none)"; exit}
printf "Modules=%d Capacity≈%d GB\n", n, int((tot+1023)/1024)
for(k in cnt) iord[ord[k]]=k
for(i=1;i<=og;i++){split(iord[i],a,"\t");
printf "%dx %s | %s | %s | %s\n", cnt[iord[i]],a[1],a[2],a[3],a[4]}
print "Locator / Serial"
for(i=1;i<=n;i++) printf " %-22s %s\n", lc[i], sr[i]
}'
free -h 2>/dev/null | awk '/^Mem:/{
if(NF>=7) printf "OS Mem total=%s used=%s available=%s\n",$2,$3,$7
else printf "OS Mem total=%s used=%s free=%s\n",$2,$3,$4}'
) >"$D/4" &
( echo "=== Disks ==="
lsblk -d -e 2,7,11 -o NAME,TYPE,SIZE,MODEL,SERIAL,TRAN,REV 2>/dev/null \
|| lsblk -d -e 2,7,11 -o NAME,TYPE,SIZE,MODEL,SERIAL,TRAN 2>/dev/null \
|| lsblk -d -e 2,7,11 -o NAME,TYPE,SIZE,MODEL,SERIAL 2>/dev/null
) >"$D/5" &
( echo "=== Key PCI devices / drivers ==="
lspci -nnk 2>/dev/null | awk -v p="$PR" '
/^[0-9a-f.:]+ /{keep=($0~p); buf=$0; drv=""; next}
/Kernel driver in use:/{drv=$0}
/Kernel modules:/{if(keep){print buf; if(drv!="")print drv; print}
buf=""; drv=""; keep=0}
END{if(keep&&buf!=""){print buf; if(drv!="")print drv}}'
) >"$D/6" &
( echo "=== Driver versions (in use) ==="
{
lspci -nnk 2>/dev/null | awk -v p="$PR" '
/^[0-9a-f.:]+ /{keep=($0~p); next}
keep && /Kernel driver in use:/{sub(/.*: /,""); print; keep=0}'
for n in /sys/class/net/*; do
eval "case \"${n##*/}\" in $SKIP_IF) continue ;; esac"
[ -e "$n/device/driver" ] || continue
basename "$(readlink -f "$n/device/driver")" 2>/dev/null
done
for b in /sys/block/*; do
case "${b##*/}" in loop*|ram*|fd*|sr*|dm-*) continue ;; esac
[ -e "$b/device/driver" ] || continue
basename "$(readlink -f "$b/device/driver")" 2>/dev/null
done
} | sed 's/-/_/g' | grep -E '^[A-Za-z0-9_]+$' | sort -u \
| while read -r m; do
case "$m" in pcieport|xhci_hcd|ehci_hcd|ohci_hcd|uhci_hcd|ccp|k10temp) continue ;; esac
modinfo "$m" >/dev/null 2>&1 || continue
ver=$(modinfo -F version "$m" 2>/dev/null | head -n1 | tr -d '\r')
verm=$(modinfo -F vermagic "$m" 2>/dev/null | awk '{print $1}')
case "$ver" in ""|name:*|filename:*|version:*|description:*) ver="" ;; esac
if [ -z "$ver" ]; then
for n in /sys/class/net/*; do
[ -e "$n/device/driver" ] || continue
d=$(basename "$(readlink -f "$n/device/driver")" 2>/dev/null | tr '-' '_')
[ "$d" = "$m" ] || continue
ver=$(ethtool -i "${n##*/}" 2>/dev/null | awk -F': ' '/^version:/{print $2; exit}')
[ -n "$ver" ] && break
done
fi
[ -z "$ver" ] && [ -n "$verm" ] && [ "$verm" != "name:" ] && ver="$verm"
[ -n "$ver" ] && printf '%-12s %s\n' "$m" "$ver"
done
command -v nvidia-smi >/dev/null 2>&1 && \
nvidia-smi --query-gpu=index,name,uuid,driver_version,serial \
--format=csv,noheader 2>/dev/null | sed 's/^/GPU /'
) >"$D/7" &
( echo "=== Physical NIC drivers ==="
for n in /sys/class/net/*; do
[ -e "$n" ] || continue
i=${n##*/}
eval "case \"$i\" in $SKIP_IF) continue ;; esac"
[ -e "$n/device" ] || continue
ethtool -i "$i" 2>/dev/null | awk -v i="$i" '
BEGIN{printf "%-12s", i}
/^driver:/{printf " driver=%s", $2}
/^version:/{printf " version=%s", $2}
/^firmware-version:/{sub(/^firmware-version:[[:space:]]*/,"");
if($0!="") printf " fw=%s", $0}
END{print ""}'
done
) >"$D/8" &
wait
for i in 1 2 3 4 5 6 7 8; do [ -s "$D/$i" ] && { cat "$D/$i"; echo; }; done
EOF