原 Linux环境下,shell脚本一键获取操作系统主机配置信息
脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 | cat > /tmp/get_os_info.sh <<"EOF" #!/bin/bash export LANG=en_US.UTF-8 # 如果 cat /proc/1/cgroup | grep docker | wc -l 大于0 或 systemd-detect-virt 返回 docker,则为 docker容器, # 如果 virt-what 返回 kvm或vmware或hyperv或xen、xen-hvm、lxc 或 systemd-detect-virt 返回 vmware、kvm 则为虚拟机 # 如果 cat /sys/class/dmi/id/product_name 返回 Bochs 、OpenStack Nova则为虚拟机 若返回Alibaba Cloud ECS,则代表阿里云主机 # 如果 systemd-detect-virt 返回 none 则表示物理机 # 判断当前主机类型 if [ "$(cat /proc/1/cgroup | grep -c docker)" -gt 0 ] || systemd-detect-virt | grep -q docker; then host_type="Docker容器" elif [[ -f /sys/class/dmi/id/product_name && $(cat /sys/class/dmi/id/product_name) == "Alibaba Cloud ECS" ]]; then host_type="阿里云主机" elif [[ $(virt-what) =~ (kvm|vmware|hyperv|xen|xen-hvm|lxc) ]] || [[ $(systemd-detect-virt) =~ (vmware|kvm) ]]; then host_type="虚拟机" elif [[ $(cat /sys/class/dmi/id/product_name) =~ (Bochs|OpenStack Nova) ]]; then host_type="虚拟机" else host_type="物理机" fi echo "- **当前主机类型**: $host_type" # 获取并显示系统制造商、产品名称和版本 echo " - 当前主机系统硬件信息:" dmidecode -t 1 | awk -F: '/Manufacturer/{printf " - 制造商: %s\n", $2} /Product Name/{printf " - 产品名称: %s\n", $2}' # 获取操作系统信息 os_info=$(cat /etc/os-release | grep 'PRETTY_NAME' | cut -d '"' -f 2) # 如果操作系统是 CentOS Linux 7 (Core),查询 /etc/redhat-release if [[ "$os_info" == "CentOS Linux 7 (Core)" ]]; then os_info=$(cat /etc/redhat-release) fi echo "- **操作系统信息**: $os_info" # 显示当前内核版本 kernel_version=$(uname -r) echo "- **内核版本**: $kernel_version" echo "- **硬件配置**:" # 获取CPU信息 cpu_model=$(lscpu | grep "Model name" | awk -F: '{print $2}' | xargs) cpu_cores=$(lscpu | grep "^CPU(s):" | awk '{print $2}') # 获取每核的线程数 threads_per_core=$(lscpu | grep -i "Thread(s) per core" | awk '{print $4}') # 如果每核线程数大于1,则说明开启了超线程 if [[ $threads_per_core -gt 1 ]]; then HyperThreading="超线程已开启 (每核线程数: $threads_per_core)" else HyperThreading="超线程未开启 (每核线程数: $threads_per_core)" fi echo " - **CPU**: $cpu_model ,**共 $cpu_cores 核** ,$HyperThreading " # 获取内存信息 memory=$(free -h | awk '/^Mem:/{print $2}') echo " - **内存**: $memory" # 磁盘类型 # 虚拟化平台(如 VMware、KVM、Hyper-V 等)可能会将虚拟硬盘映射为虚拟的 HDD 类型,即使宿主机的物理硬盘是 SSD。 # # 使用dd测试,若写操作超过500MB/s,则肯定是SSD盘,有的盘差点在300MB/s,完成时间在15秒以下 # mkidr -p /data/ # dd if=/dev/zero of=/data/testssd bs=1M count=5000 oflag=direct # dd if=/data/testssd of=/dev/null bs=1M count=5000 iflag=direct # rm -rf /data/testssd # # 如果 TRAN 列显示为 sata,则硬盘是 SATA 接口。 # 如果 TRAN 列显示为 pcie 或 nvme,则硬盘是 NVMe 接口。 # 如果 TRAN 列显示为 fc,则表示该硬盘使用的是 Fibre Channel 接口。 # 若 ROTA 列为1,则代表旋转设备,可能为HDD盘,但仍然需要进一步测试IO进行确定 # 获取指定磁盘信息 echo " - **磁盘信息**: $disk_info" lsblk -d -o NAME,ROTA,TRAN,SIZE,TYPE,MOUNTPOINT,UUID,SCHED | grep -E '^(sd|vd)' | awk '{print " -", $1,$2,$3,$4, $5,$6,$7, ($2 == 1 ? "疑似HDD机械硬盘,还需测试IO或咨询主机管理员" : "SSD固态硬盘")}' # lsblk -d -o NAME,ROTA,TRAN,SIZE,TYPE,MOUNTPOINT,UUID | grep -E '^(sd|vd)' | awk -v host_type="$host_type" '{ # if (host_type == "物理机") { # print " -", $1, $2, $3, $4, $5,$6,$7, ($2 == 0 ? "SSD固态硬盘" : "疑似HDD机械硬盘,还需测试IO或咨询主机管理员") # } else { # print " -", $1, $2, $3, $4, $5,$6,$7, ($2 == 0 ? "SSD固态硬盘" : "疑似HDD机械硬盘,还需测试IO或咨询主机管理员") # } # }' # echo ' ```' if command -v lshw &> /dev/null; then lshw -short | grep disk | grep -v "cdrom" | awk '{$1=""; print " "$0}' fi echo ' ' lsscsi | grep -v "cd/dvd" | grep "disk" | awk '{$1=""; print " "$0}' echo ' ' lsblk_cmd="lsblk -o NAME,ROTA,TRAN,SIZE,TYPE,MOUNTPOINT,FSTYPE,FSUSE%,STATE,SCHED,VENDOR,SERIAL,UUID,WWN" if $lsblk_cmd &>/dev/null; then $lsblk_cmd else # 如果运行失败,则回退到简化的命令 lsblk -o NAME,ROTA,TRAN,SIZE,TYPE,MOUNTPOINT,UUID,FSTYPE fi echo ' ```' # 显示文件系统类型 echo "- **文件系统**:" # df -Th 2>/dev/null | grep -v "loop" | grep -v "tmpfs" | awk '{print " -", $1, "->", $2}' echo ' ```' df -Th 2>/dev/null | grep -v "loop" | grep -v "tmpfs" | grep -v "iso" | grep -v "/var/lib/docker/overlay2" | grep -v "/boot" | awk '{print " "$0}' echo ' ```' # 1. 对闪存(SSD)等存储介质,优先使用noop或none调度算法 # 2. 对IO压力比较重且非SSD存储设备,且功能比较单一的场景,例如数据库服务器,使用deadline或mq-deadline调度算法 # for dev in $(lsblk -dno NAME | grep -E '^(sd|vd)'); do echo "$dev: $(cat /sys/block/$dev/queue/scheduler)"; done # echo noop | sudo tee /sys/block/sda/queue/scheduler # for dev in $(lsblk -dno NAME | grep -E '^(sd|vd)'); do echo "echo noop | sudo tee /sys/block/$dev/queue/scheduler"; done # 获取I/O调度器信息 # echo "- **I/O 调度器**:" # for dev in $(lsblk -dno NAME | grep -E '^(sd|vd)'); do # # 提取中括号中的当前调度器 # scheduler=$(cat /sys/block/$dev/queue/scheduler 2>/dev/null | grep -o '\[[^]]*\]' | tr -d '[]') # echo " - $dev: $scheduler" # done # 查看时区 timezone=$(timedatectl | grep "Time zone:" | awk '{print $3,$4,$5}') echo "- **当前主机时区信息**:$(echo $timezone)" # 查看IP地址 ip_add=`hostname -I` hostname1=`hostname` sysuptime=`uptime -s` echo "- **当前主机IP地址**:$ip_add" echo "- **当前主机的主机名**:$hostname1" echo "- **系统启动时间**:$sysuptime" # 查看网卡信息 echo "- **主机网卡信息**:" echo '```' # 表头 printf "%-20s %-10s %-10s %-18s %-18s %-18s %-10s %-10s %-10s %-10s %-8s %-10s\n" "Interface" "Type" "Type2" "MAC_Address" "IP_Address" "Gateway" "State" "RX" "TX" "Port_Type" "MTU" "General_State" echo "------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------" for interface in $(ls /sys/class/net/) do if [ ! -d "/sys/class/net/$interface" ]; then continue fi # 基础信息 mac=$(cat /sys/class/net/$interface/address 2>/dev/null || echo "N/A") ip=$(ip -4 addr show $interface | grep -oP '(?<=inet\s)\d+(\.\d+){3}' || echo "N/A") state=$(ip link show $interface | grep -oP '(?<=state\s)\w+' || echo "UNKNOWN") rx_bytes=$(cat /sys/class/net/$interface/statistics/rx_bytes 2>/dev/null || echo "0") tx_bytes=$(cat /sys/class/net/$interface/statistics/tx_bytes 2>/dev/null || echo "0") # 转换 RX 和 TX if (( rx_bytes >= 1024**4 )); then rx=$(awk "BEGIN {printf \"%.2f TB\", $rx_bytes / (1024^4)}") elif (( rx_bytes >= 1024**3 )); then rx=$(awk "BEGIN {printf \"%.2f GB\", $rx_bytes / (1024^3)}") else rx=$(awk "BEGIN {printf \"%.2f MB\", $rx_bytes / (1024^2)}") fi if (( tx_bytes >= 1024**4 )); then tx=$(awk "BEGIN {printf \"%.2f TB\", $tx_bytes / (1024^4)}") elif (( tx_bytes >= 1024**3 )); then tx=$(awk "BEGIN {printf \"%.2f GB\", $tx_bytes / (1024^3)}") else tx=$(awk "BEGIN {printf \"%.2f MB\", $tx_bytes / (1024^2)}") fi type="Virtual" [ -e "/sys/class/net/$interface/device" ] && type="Physical" mtu=$(cat /sys/class/net/$interface/mtu 2>/dev/null || echo "N/A") # 获取 GENERAL.TYPE 信息 general_type=$(nmcli device show $interface 2>/dev/null | grep -i "GENERAL.TYPE" | awk '{print $2}' || echo "N/A") # 获取 GENERAL.STATE 信息 general_state=$(nmcli device show $interface 2>/dev/null | grep -i "GENERAL.STATE" | awk '{print $2,$3,$4,$5,$6}' || echo "N/A") # 获取网关地址 gateway=$(nmcli device show $interface 2>/dev/null | grep -i "IP4.GATEWAY" | awk '{print $2}' || echo "N/A") # 判断光口或电口 port_type="Unknown" if command -v ethtool >/dev/null; then port=$(ethtool $interface 2>/dev/null | grep "Port" | awk '{print $2}') case "$port" in FIBRE) port_type="Optical" ;; TP) port_type="Electrical" ;; esac fi # 打印结果 printf "%-20s %-10s %-10s %-18s %-18s %-18s %-10s %-10s %-10s %-10s %-8s %-10s\n" "$interface" "$type" "$general_type" "$mac" "$ip" "$gateway" "$state" "$rx" "$tx" "$port_type" "$mtu" "$general_state" done ########################### 网卡绑定内容 # 检查 /proc/net/bonding/bond* 是否存在 if ls /proc/net/bonding/bond* &> /dev/null; then echo -e "\n" echo -e "#########网卡绑定内容#########\n" # 输出表头 echo -e "Bond Name Slave Interface MII Status Speed Duplex Link Failure Count Permanent HW addr Slave queue ID" echo -e "-------------------------------------------------------------------------------------------------------------------------------------" # 遍历所有 /proc/net/bonding/bond* 文件 for bond_file in /proc/net/bonding/bond*; do # 获取 bond 文件名(例如:bond0, bond1 等) bond_name=$(basename "$bond_file") # 解析并输出数据 awk -v bond_name="$bond_name" ' BEGIN { iface=""; mii=""; speed=""; duplex=""; link_failure_count=""; hw_addr=""; queue_id=""; } # 捕获字段 /Slave Interface/ { iface=$3; } /MII Status/ { mii=$3; } /Speed/ { speed=$2; } /Duplex/ { duplex=$2; } /Link Failure Count/ { link_failure_count=$4; } /Slave queue ID/ { queue_id=$4; } /Permanent HW addr/ { hw_addr=$NF; } # 打印所有捕获的字段并检查 /Slave queue ID/ { printf "%-15s %-23s %-10s %-10s %-10s %-18s %-25s %-12s\n", bond_name, iface, mii, speed, duplex, link_failure_count, hw_addr, queue_id; } ' "$bond_file" done # 输出表头 echo -e "\n" printf "|------------------------------|-------------------------------------|\n" printf "| %-30s | %-35s |\n" "属性" " 值" printf "|------------------------------|-------------------------------------|\n" # 遍历所有 /proc/net/bonding/bond* 文件 for bond_file in /proc/net/bonding/bond*; do printf "| %-30s | %-35s |\n" "文件" "$bond_file" # 初始化表格变量 bonding_mode="" primary_slave="" active_slave="" mii_status="" mii_polling="" up_delay="" down_delay="" peer_delay="" # 读取文件内容并提取信息 while IFS= read -r line; do case "$line" in *"Bonding Mode"*) bonding_mode="${line#*:}" ;; *"Primary Slave"*) primary_slave="${line#*:}" ;; *"Currently Active Slave"*) active_slave="${line#*:}" ;; *"MII Status"*) mii_status="${line#*:}" ;; *"MII Polling Interval"* ) mii_polling="${line#*:}" ;; *"Up Delay"* ) up_delay="${line#*:}" ;; *"Down Delay"* ) down_delay="${line#*:}" ;; *"Peer Notification Delay"*) peer_delay="${line#*:}" ;; esac done < "$bond_file" # 输出表格数据 printf "| %-28s | %-35s |\n" "Bonding Mode" "$bonding_mode" printf "| %-28s | %-35s |\n" "Primary Slave" "$primary_slave" printf "| %-28s | %-35s |\n" "Currently Active Slave" "$active_slave" printf "| %-28s | %-35s |\n" "MII Status" "$mii_status" printf "| %-28s | %-35s |\n" "MII Polling Interval (ms)" "$mii_polling" printf "| %-28s | %-35s |\n" "Up Delay (ms)" "$up_delay" printf "| %-28s | %-35s |\n" "Down Delay (ms)" "$down_delay" printf "| %-28s | %-35s |\n" "Peer Notification Delay (ms)" "$peer_delay" printf "|------------------------------|-------------------------------------|\n" done fi echo '```' EOF chmod +x /tmp/get_os_info.sh sleep 1 sh /tmp/get_os_info.sh \cp /tmp/get_os_info.sh /usr/bin/ |
结果
可直接粘贴到markdown的文档中进行解析即可:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | [root@alldb ~]# sh /tmp/get_os_info.sh - **当前主机类型**: 虚拟机 - 当前主机系统硬件信息: - 制造商: Bochs - 产品名称: Bochs - **操作系统信息**: CentOS Linux release 7.9.2009 (Core) - **内核版本**: 3.10.0-1160.95.1.el7.x86_64 - **硬件配置**: - **CPU**: Intel(R) Xeon(R) Gold 6342 CPU @ 2.80GHz ,**共 32 核** - **内存**: 62G - **磁盘**: - vda : HDD机械硬盘 - vdb : HDD机械硬盘 \``` /dev/vda disk 4294GB Virtual I/O device /dev/vdb disk 2147MB Virtual I/O device \``` - **文件系统**: \``` Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/centos-root xfs 3.9T 2.3T 1.7T 58% / root@192.164.7.163:/bk fuse.sshfs 2.0T 796G 1.2T 40% /163_bk \``` - **I/O 调度器**: - vda: mq-deadline - vdb: mq-deadline - **当前主机时区信息**:Asia/Shanghai (CST, +0800) - **当前主机IP地址**:192.16.17.162 192.168.188.162 - **当前主机的主机名**:alldb - **系统启动时间**:2024-08-07 15:46:55 - **主机网卡信息**: \``` Interface Type Type2 MAC_Address IP_Address Gateway State RX TX Port_Type MTU General_State ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- docker0 Virtual bridge 02:42:e3:8b:6a:13 182.82.0.1 -- UP 1.30 TB 2.07 TB Unknown 1500 10 (unmanaged) docker_gwbridge Virtual bridge 02:42:28:66:a3:c6 182.83.83.1 -- UP 615.27 MB 430.14 MB Unknown 1500 100 (connected) edge66 Virtual tun 36:71:6c:20:d5:24 182.166.66.163 -- UNKNOWN 160.63 MB 223.68 MB Unknown 1280 100 (connected) eth0 Physical ethernet fe:fc:fe:31:3f:43 163.15.7.163 163.15.7.254 UP 3.56 TB 2.45 TB Unknown 1500 10 (unmanaged) lo Virtual loopback 00:00:00:00:00:00 127.0.0.1 -- UNKNOWN 632.51 GB 632.51 GB Unknown 65536 10 (unmanaged) StarVPN Virtual tun 72:3a:25:c5:a0:16 182.166.166.4 -- UNKNOWN 125.24 MB 3.13 MB Unknown 1280 100 (connected) veth12cbd31 Virtual ethernet f6:8d:61:a6:82:cf N/A UP 614.34 GB 35.68 GB Unknown 1500 10 (unmanaged) veth227cc44 Virtual ethernet 86:28:23:ca:4e:64 N/A UP 103.37 MB 81.44 MB Unknown 1500 10 (unmanaged) veth27057ae Virtual ethernet ce:b4:f5:74:62:4f N/A UP 0.21 MB 32.31 MB Unknown 1500 10 (unmanaged) vethf0f646f Virtual ethernet 26:6c:51:fc:41:1d N/A UP 14.17 GB 152.13 GB Unknown 1500 10 (unmanaged) vethf781b88 Virtual ethernet 8a:22:7d:b1:30:c2 N/A UP 0.00 MB 16.26 MB Unknown 1500 10 (unmanaged) vethfcbac21 Virtual ethernet 52:1e:d6:72:66:17 N/A UP 635.62 MB 415.43 MB Unknown 1500 10 (unmanaged) ztqu3pmtrm Virtual tun 1e:c5:16:76:0a:b7 182.166.66.163 -- UNKNOWN 3.86 MB 1.55 MB Unknown 2600 100 (connected) \``` |


