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
|
#compdef mdadm
typeset -A opt_args
local -a args misc modes
_raids_build () {
_values -S \ "MD device type" \
'linear[linear]' \
{0,raid0,stripe}'[striping]' \
{1,raid1,mirror}'[mirroring]' \
{multipath,mp}'[multiple paths to one common physical storage device]' \
'faulty[injects faults]'
}
_raids () {
_values -S \ "MD device type" \
'linear[linear]' \
{0,raid0,stripe}'[striping]' \
{1,raid1,mirror}'[mirroring]' \
{4,raid4}'[RAID 4]' \
{5,raid5}'[RAID 5]' \
{6,raid6}'[RAID 6]' \
{10,raid10}'[RAID 1+0]' \
{multipath,mp}'[multiple paths to one common physical storage device]' \
'faulty[injects faults]'
}
_layouts () {
case ${(v)opt_args[(I)-(l|-level)]} in
5|raid5)
_values -S \ "RAID5 parity block layout" \
{left-asymmetric,la}'[left-asymmetric]' \
{left-symmetric,ls}'[left-symmetric]' \
{right-asymmetric,ra}'[right-asymmetric]' \
{right-symmetric,rs}'[right-symmetric]'
;;
10|raid10)
_values -s ' ' 'RAID10 layout with number of copies of each datablock' \
'n1[near copies]' \
'n2[near copies]' \
'n3[near copies]' \
'n4[near copies]' \
'n5[near copies]' \
'n6[near copies]' \
'n7[near copies]' \
'n8[near copies]' \
'n8[near copies]' \
'f1[far copies]' \
'f2[far copies]' \
'f3[far copies]' \
'f4[far copies]' \
'f5[far copies]' \
'f6[far copies]' \
'f7[far copies]' \
'f8[far copies]' \
'f9[far copies]'
;;
faulty)
_values -S \ "failure mode" \
{write-transient,wt}'[write-transient]' \
{read-transient,rt}'[read-transient]' \
{write-persistent,wp}'[write-persistent]' \
{read-persistent,rp}'[read-persistent]' \
write-all'[write-all]' \
{read-fixable,rf}'[read-fixable]' \
{clear,none}'[remove any pending or periodic failure modes]' \
flush'[clear any persistent faults]'
esac
}
if (( $+words[(r)-(A|-assemble)] )); then
args=(
'(--bitmap)'--bitmap='[bitmap file to use with the array]::bitmap file:_files'
'(--uuid -u)'{--uuid=,-u}'[UUID of array to assemble]:UUID'
'(--super-minor -m)'{--super-minor=,-m}'[minor number to look for in super-block]:minor number'
'(--name -N)'{--name=,-N}'[array name to look for in super-block]:array name'
'(--config -c)'{--config=,-c}'[config file]::config file:_files'
'(--scan -s)'{--scan,-s}'[scan config file for missing information]'
'(--run -R)'{--run,-R}'[try to start the array even if not enough devices for a full array are present]'
'(--force -f)'{--force,-f}'[assemble the array even if some superblocks appear out-of-date]'
'(--update -U)'{--update=,-U}'[update superblock]::update the superblock:(sparc2.2 summaries uuid resync byteorder super-minor)'
)
fi
if (( $+words[(r)-(B|-build)] )); then
args=(
'(--bitmap)'--bitmap='[file to store/find bitmap information in]::bitmap file:_files'
'(--chunk -c)'{--chunk=,-c}'[chunk size of kibibytes]:chunk size'
'(--rounding)'--rounding='[rounding factor for linear array (==chunk size)]:rounding factor'
'(--level -l)'{--level=,-l}'[RAID level]::RAID level:_raids_build'
'(--raid-devices -n)'{--raid-devices=,-n}'[number of active devices in array]:active devices number'
'(--bitmap-chunk)'--bitmap-chunk='[bitmap chunksize in Kilobytes]:bitmap chunk'
'(--delay -d)'{--delay=,-d}'[bitmap update delay in seconds]:bitmap update delay'
)
fi
if (( $+words[(r)-(C|-create)] )); then
args=(
'(--bitmap)'--bitmap='[create a bitmap for the array with the given filename]::bitmap file:_files'
'(--chunk -c)'{--chunk=,-c}'[chunk size of kibibytes]:chunk size'
'(--rounding)'--rounding='[rounding factor for linear array (==chunk size)]:rounding factor'
'(--level -l)'{--level=,-l}'[RAID level]::RAID level:_raids'
'(--parity -p --layout)'{--parity=,-p,--layout=}'[RAID5/6/10 parity algorithm, faulty mode]::layout:_layouts'
'(--raid-devices -n)'{--raid-devices=,-n}'[number of active devices in array]:active devices number'
'(--spare-devices -x)'{--spare-devices=,-x}'[number of spares (eXtras) devices in initial array]:spare devices number'
'(--size -z)'{--size=,-z}'[size (in K) of each drive in RAID1/4/5/6/10]:size of each drive'
'(--force -f)'{--force,-f}'[honour devices as listed on command line]'
'(--run -R)'{--run,-R}'[insist of running the array even if not all devices are present or some look odd]'
'(--readonly -o)'{--readonly,-o}'[start the array readonly]'
'(--name -N)'{--name=,-N}'[textual name for array - max 32 characters]:array name'
'(--bitmap-chunk)'--bitmap-chunk='[bitmap chunksize in Kilobytes]:bitmap chunk'
'(--delay -d)'{--delay,-d}'[bitmap update delay in seconds]:bitmap update delay'
)
fi
if (( $+words[(r)-([DEXQ]|-(detail|examine(|-bitmap)|query))] )); then
args=(
'(--zero-superblock)'--zero-superblock'[erase the MD superblock from a device]'
'(--run -R)'{--run,-R}'[start a partially built array]'
'(--stop -S)'{--stop,-S}'[deactivate array, releasing all resources]'
'(--readonly -o)'{--readonly,-o}'[mark array as readonly]'
'(--readwrite -w)'{--readwrite,-w}'[mark array as readwrite]'
'(--test -t)'{--test,-t}'[exit status 0 if ok, 1 if degrade, 2 if dead, 4 if missing]'
)
fi
if (( $+words[(r)-(F|-follow|-monitor)] )); then
args=(
'(--mail -m)'{--mail=,-m}'[address to mail alerts of failure to]:::_email_addresses'
'(--program -p --alert)'{--program=,-p,--alert=}'[program to run when an event is detected]::program:_files'
'(--delay -d)'{--delay=,-d}'[seconds of delay between polling state]:seconds'
'(--config -c)'{--config=,-c}'[specify a different config file]::config file:_files'
'(--scan -s)'{--scan,-s}'[find mail-address/program in config file]'
'(--daemonise -f)'{--daemonise,-f}'[fork and continue in child, parent exits]'
'(--pid-file -i)'{--pid-file=,-i}'[in daemon mode write pid to specified file instead of stdout]::PID file:_files'
'(--oneshot -1)'{--oneshot,-1}'[check for degraded arrays, then exit]'
'(--test -t)'{--test,-t}'[generate a TestMessage event against each array at startup]'
)
fi
if (( $+words[(r)-(G|-grow)] )); then
args=(
'(--size -z)'{--size=,-z}'[change the active size of devices in an array]:active size'
'(--raid-disks -n)'{--raid-disks=,-n}'[change the number of active devices in a RAID1 array]:number of active devices'
)
fi
_mds () {
local -a vals
if [ -r /etc/mdadm.conf ] ; then
local mdadm_conf=/etc/mdadm.conf
elif [ -r /etc/mdadm/mdadm.conf ] ; then
local mdadm_conf=/etc/mdadm/mdadm.conf
else
_message "could not find mdadm.conf"
return 1
fi
vals=( ${${${(M)${(f)"$(< $mdadm_conf)"}##ARRAY *}//ARRAY /}%%[[:blank:]]*} )
_describe -t mds "RAID devices" vals
_arguments \
"(-h --help)"{-h,--help}'[display a mode specific help message]'
}
modes=(-A --assemble -B --build -C --create -F --follow --monitor -G --grow -h --help -V --version)
misc=(-D --detail -E --examine -X --examine-bitmap -Q --query)
_arguments \
"($misc $modes)"{-A,--assemble}'[assemble a pre-existing array]:::_mds' \
"($misc $modes)"{-B,--build}'[build a legacy array without superblocks]:::_mds' \
"($misc $modes)"{-C,--create}'[create a new array]' \
"($misc $modes)"{-F,--follow,--monitor}'[select Monitor mode]' \
"($misc $modes)"{-G,--grow}'[change the size or shape of an active array]' \
"($modes -D --detail -E --examine -X --examine-bitmap)"{-D,--detail}'[print detail of one or more md devices]' \
"($modes -D --detail -E --examine -X --examine-bitmap -Q --query)"{-E,--examine}'[print content of md superblock on device(s)]' \
"($modes -Q --query)"{-Q,--query}'[examine a device]' \
"($modes -E --examine -X --examine-bitmap)"{-X,--examine-bitmap}'[report information about a bitmap file]' \
"(-)"{-h,--help}'[display general help message]' \
"(-)"{-V,--version}'[print version information for mdadm]' \
"$args[@]"
|