Для этого вам нужны регулярные выражения Perl. С grep
, который поддерживает флаг -P
:
grep -oP '(?<=a)a' file | wc -l
Это положительный просмотр назад . Он соответствует одному a
, которому предшествует другой a
.
Если вы предпочитаете perl
(или ваш grep
не поддерживает флаг -P
):
perl -ne 'while(m/(?<=a)a/g){$a++}END{print "$a\n"}' file
Пример:
$ cat file
aa
aaa
aaaa
Первая строка должно быть 1 совпадение, второе - два, а третье - одно дерево; все вместе 6:
$ grep -oP '(?<=a)a' file | wc -l
6
Я поковырялся в /sys и приблизился к ответу.
# cd /sys/block/md0/md
# cat component_size
2147479552
Это согласуется с тем, что мы видели раньше. Но это:
# grep . dev-sd*/size
dev-sdc/size:2147482623
dev-sdd/size:2147482623
dev-sde/size:2147482623
dev-sdf/size:2930265560
dev-sdg/size:2147482623
dev-sdh/size:2147482623
dev-sdi/size:2147482623
dev-sdj/size:2147482623
dev-sdk/size:2147482623
dev-sdl/size:2147483648
dev-sdm/size:2147482623
dev-sdn/size:2147482623
dev-sdo/size:2147482623
dev-sdp/size:2147482623
dev-sdq/size:2147482623
dev-sdr/size:2147482623
dev-sds/size:2147482623
dev-sdt/size:2147482623
dev-sdu/size:2147482623
dev-sdv/size:2147482623
dev-sdw/size:2930265560
похоже, объясняет, почему RAID видит неправильный размер: Большинство дисков отображаются как 2 ТБ, а 2 диска, которые были заменены, отображаются как 3 ТБ. Все диски одной модели, так что давайте посмотрим, сможем ли мы изменить воспринимаемый размер:
# parallel echo 2930265560 \> ::: dev-sd*/size
# grep . dev-sd*/size
dev-sdc/size:2930265560
dev-sdd/size:2930265560
dev-sde/size:2930265560
dev-sdf/size:2930265560
dev-sdg/size:2930265560
dev-sdh/size:2930265560
dev-sdi/size:2930265560
dev-sdj/size:2930265560
dev-sdk/size:2930265560
dev-sdl/size:2930265560
dev-sdm/size:2930265560
dev-sdn/size:2930265560
dev-sdo/size:2930265560
dev-sdp/size:2930265560
dev-sdq/size:2930265560
dev-sdr/size:2930265560
dev-sds/size:2930265560
dev-sdt/size:2930265560
dev-sdu/size:2930265560
dev-sdv/size:2930265560
dev-sdw/size:2930265560
Вуаля. Component_size все еще мал, хотя:
# cat component_size
2147479552
Возможно, его можно изменить с помощью mdadm:
# mdadm --grow /dev/md0 --size=max
К сожалению, это блокирует mdadm
и последующий доступ к /dev/md0 блокируется. Как и доступ к component_size:
# cat component_size # This blocks
Хреново. Но хорошо то, что в syslog написано:
Apr 27 20:45:50 server kernel: [124731.725019] md0: detected capacity change from 39582343102464 to 54010589478912
Файловая система на /dev/md0 все еще работает.
После перезагрузки мне пришлось снова выполнить 'mdadm --grow /dev/md0 --size=max'. Затем дождаться завершения resync
. И снова доступ к /dev/md0 был заблокирован. Поэтому еще одна перезагрузка, затем xfs_growfs /dev/md0
, после чего изменение размера было завершено.
Я думаю, что во время создания размер устройства был зарегистрирован где-то в метаданных. Смена контроллера не изменит метаданные.
Удалите запасной диск из md, затем добавьте его в RAID-массив как новый диск. Вероятно, придется удалить метаданные (проверьте на странице руководства --zero-superblock или сотрите весь диск). Если это сработает для одного диска, повторите процедуру для всех оставшихся дисков. Затем выполните команду --grow.
Не извлекайте дополнительные диски до завершения синхронизации!!!