Optimize RAIDZ expansion
[zfs.git] / cmd / zpool / zpool.d / lsblk
blob293effd48ac522f7907a21689b47f3c0c4104f0a
1 #!/bin/sh
3 # Print some common lsblk values
5 # Any (lowercased) name symlinked to the lsblk script will be passed to lsblk
6 # as one of its --output names. Here's a partial list of --output names
7 # from the lsblk binary:
9 # Available columns (for --output):
10 # NAME device name
11 # KNAME internal kernel device name
12 # MAJ:MIN major:minor device number
13 # FSTYPE filesystem type
14 # MOUNTPOINT where the device is mounted
15 # LABEL filesystem LABEL
16 # UUID filesystem UUID
17 # RA read-ahead of the device
18 # RO read-only device
19 # RM removable device
20 # MODEL device identifier
21 # SIZE size of the device
22 # STATE state of the device
23 # OWNER user name
24 # GROUP group name
25 # MODE device node permissions
26 # ALIGNMENT alignment offset
27 # MIN-IO minimum I/O size
28 # OPT-IO optimal I/O size
29 # PHY-SEC physical sector size
30 # LOG-SEC logical sector size
31 # ROTA rotational device
32 # SCHED I/O scheduler name
33 # RQ-SIZE request queue size
34 # TYPE device type
35 # DISC-ALN discard alignment offset
36 # DISC-GRAN discard granularity
37 # DISC-MAX discard max bytes
38 # DISC-ZERO discard zeroes data
40 # If the script is run as just 'lsblk' then print out disk size, vendor,
41 # and model number.
44 helpstr="
45 label: Show filesystem label.
46 model: Show disk model number.
47 size: Show the disk capacity.
48 vendor: Show the disk vendor.
49 lsblk: Show the disk size, vendor, and model number."
51 script="${0##*/}"
53 if [ "$1" = "-h" ] ; then
54 echo "$helpstr" | grep "$script:" | tr -s '\t' | cut -f 2-
55 exit
58 if [ "$script" = "lsblk" ] ; then
59 list="size vendor model"
60 else
61 list=$(echo "$script" | tr '[:upper:]' '[:lower:]')
64 # Sometimes, UPATH ends up /dev/(null).
65 # That should be corrected, but for now...
66 # shellcheck disable=SC2154
67 if [ ! -b "$VDEV_UPATH" ]; then
68 somepath="${VDEV_PATH}"
69 else
70 somepath="${VDEV_UPATH}"
73 # Older versions of lsblk don't support all these values (like SERIAL).
74 for i in $list ; do
76 # Special case: Looking up the size of a file-based vdev can't
77 # be done with lsblk.
78 if [ "$i" = "size" ] && [ -f "$somepath" ] ; then
79 size=$(du -h --apparent-size "$somepath" | cut -f 1)
80 echo "size=$size"
81 continue
85 val=""
86 if val=$(eval "lsblk -dl -n -o $i $somepath 2>/dev/null") ; then
87 # Remove leading/trailing whitespace from value
88 val=$(echo "$val" | sed -e 's/^[[:space:]]*//' \
89 -e 's/[[:space:]]*$//')
91 echo "$i=$val"
92 done