【讨论】bash之磁盘信息篇
本篇简单介绍如何使用shell/bash取得磁盘的部分信息
毕竟这里是shell版
这些脚本的目的是让大家熟悉shell/bash的语法
及一些简单的工具的用法
相信很多人都会使用fdisk -l这个命令查来查看查看磁盘设备
注意我最都都打印了一个换行符
复制内容到剪贴板
代码:
# awk
[0 No.2089 huan@huan ~]$ sudo fdisk -l | awk '/^\/dev/ {printf "%s ",$1} END{print ""}'
/dev/hdc1 /dev/hdc2 /dev/hdc5 /dev/hdc6 /dev/hdc7 /dev/hdc8 /dev/hdc9 /dev/hdc10 /dev/hdc11 /dev/sda1
# grep
[0 No.2090 huan@huan ~]$ sudo fdisk -l | egrep -o '^\/dev\/\w+' | tr '\n' ' '; echo
/dev/hdc1 /dev/hdc2 /dev/hdc5 /dev/hdc6 /dev/hdc7 /dev/hdc8 /dev/hdc9 /dev/hdc10 /dev/hdc11 /dev/sda1
[0 No.2091 huan@huan ~]$
fdisk的工具似乎太高级而且简单了
似乎用不着我来介绍
那就介绍一个kernel 2.6下如何从 /sys 取得这些信息
原理:
大家看一下以下示例就能明白磁盘信息可以如何取得
复制内容到剪贴板
代码:
[0 No.2011 huan@huan ~]$ ls -d /sys/block/[sh]d[a-z]
/sys/block/hda/ /sys/block/hdc/ /sys/block/sda/
[0 No.2012 huan@huan ~]$ ls /sys/block/sda/
dev device@ holders/ queue/ range removable sda1/ size slaves/ stat uevent
[0 No.2013 huan@huan ~]$ ls /sys/block/sda/sda1/
dev holders/ size start stat uevent
[0 No.2014 huan@huan ~]$
代码
复制内容到剪贴板
代码:
[0 No.2015 huan@huan ~]$ cat disk.sh
#! /bin/bash
# 返回 /sys/block/ 下的磁盘设备名
subdevices() {
sysblock=$1
r=""
for dev in "${sysblock}" "${sysblock}"/*; do
if [ -e "${dev}/dev" ]; then
r="${r} ${dev}"
fi
done
echo ${r}
}
# 将 /sys/block 设备名转成 /dev
# /sys/block/sda 转成 /dev/sda
sys2dev() {
sysdev=${1#/sys}
echo "/dev/$(udevinfo -q name -p ${sysdev} 2>/dev/null|| echo ${sysdev##*/})"
}
for sysblock in /sys/block/[sh]d[a-z]; do
for dev in $(subdevices "${sysblock}"); do
devname=$(sys2dev "${dev}")
echo -n "$devname "
done
done
echo
[0 No.2016 huan@huan ~]$ bash disk.sh
/dev/hda /dev/hdc /dev/hdc1 /dev/hdc10 /dev/hdc11 /dev/hdc2 /dev/hdc5 /dev/hdc6 /dev/hdc7 /dev/hdc8 /dev/hdc9 /dev/sda /dev/sda1
[0 No.2017 huan@huan ~]$
或者也可以从/proc/partitions取得这些信息
复制内容到剪贴板
代码:
[0 No.2052 root@huan ~]# cat /proc/partitions
major minor #blocks name
22 0 78150744 hdc
22 1 5116671 hdc1
22 2 1 hdc2
22 5 5116671 hdc5
22 6 96358 hdc6
22 7 49215096 hdc7
22 8 9767488 hdc8
22 9 192748 hdc9
22 10 979933 hdc10
22 11 7662973 hdc11
8 0 125951 sda
8 1 120456 sda1
# 天啊,awk的正则到底要怎么写。。。
[0 No.2053 root@huan ~]# perl -ne ' print "$1 " if /^[\s\d]+(\w+)$/; END{ print "\n"} ' < /proc/partitions
hdc hdc1 hdc2 hdc5 hdc6 hdc7 hdc8 hdc9 hdc10 hdc11 sda sda1
[0 No.2054 root@huan ~]#
注意一下
fdisk和以上代码取得的磁盘不同的是
后者包括了如 /dev/sda 这样的设备
fdisk 可能只会取得 /dev/sda1
ubuntu发行版中有一些很有用的工具可
简单示例
复制内容到剪贴板
代码:
# 是否是光驱设备
[0 No.2035 root@huan ~]# /lib/udev/cdrom_id /dev/cdrom
ID_CDROM=1
ID_CDROM_DVD=1
ID_CDROM_MRW=1
ID_CDROM_MRW_W=1
# 取得 文件系统类型
[0 No.2036 root@huan ~]# /lib/udev/vol_id -t /dev/sda1
vfat
[0 No.2037 root@huan ~]#