Вы можете использовать env your-command
, чтобы избежать вмешательства оболочки.
Пример:
$ env kill -L
1 HUP 2 INT 3 QUIT 4 ILL 5 TRAP 6 ABRT 7 BUS
8 FPE 9 KILL 10 USR1 11 SEGV 12 USR2 13 PIPE 14 ALRM
15 TERM 16 STKFLT 17 CHLD 18 CONT 19 STOP 20 TSTP 21 TTIN
22 TTOU 23 URG 24 XCPU 25 XFSZ 26 VTALRM 27 PROF 28 WINCH
29 POLL 30 PWR 31 SYS
Другой способ - использовать путь к команде следующим образом:
$ which kill
/bin/kill
$ /bin/kill -L
1 HUP 2 INT 3 QUIT 4 ILL 5 TRAP 6 ABRT 7 BUS
8 FPE 9 KILL 10 USR1 11 SEGV 12 USR2 13 PIPE 14 ALRM
15 TERM 16 STKFLT 17 CHLD 18 CONT 19 STOP 20 TSTP 21 TTIN
22 TTOU 23 URG 24 XCPU 25 XFSZ 26 VTALRM 27 PROF 28 WINCH
29 POLL 30 PWR 31 SYS
Итак, Используя env
или указав путь / расположение command вы можете избежать вмешательства со стороны оболочки.
Сообщение об ошибке относится к размерам блочных устройств Linux, а не к размеру файловой системы, поэтому раздел, содержащий исходную файловую систему, необходимо уменьшить, чтобы он был меньше (или того же размера, что и )целевой.
Предполагая, что целевое устройство имеет размер 200G, измените размер исходного устройства на 199G:
btrfs filesystem resize <devid>:199g /mountpoint
Затем измените размер раздела на 199 ГБ. Я использовал gdisk
для удаления существующего исходного раздела, затем создал новый с тем же начальным сектором, но ввел размер конечного сектора как +199G
.
После partprobe /dev/hdd-device
для перезагрузки нового раздела replace
работал нормально.
Я столкнулся с этим при попытке заменить диск на один немного меньшего размера. Я получал эту ошибку даже после изменения размера файловой системы на исходном диске. Поскольку я использовал целые диски, у меня не было возможности изменить размер раздела. Хитрость заключалась в том, чтобы передать dev для исходного диска вместо пути к устройству. Похоже, это привело к тому, что btrfs filesystem replace
проверил фактический размер файловой системы на исходном устройстве, а не размер самого устройства.
Мое исходное состояние:
# btrfs fi show /mnt/storage
Label: 'Storage' uuid: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Total devices 5 FS bytes used 15.25TiB
devid 1 size 7.28TiB used 3.84TiB path /dev/sdb
devid 2 size 7.28TiB used 3.84TiB path /dev/sdc
devid 3 size 7.28TiB used 3.84TiB path /dev/sdd
devid 4 size 7.28TiB used 3.84TiB path /dev/sde
devid 5 size 7.28TiB used 3.84TiB path /dev/sdf
Я хотел заменить /dev/sdf на /dev/sdg.
Попытка #1:
# btrfs replace start /dev/sdf /dev/sdg /mnt/storage
ERROR: target device smaller than source device (required 8001561124864 bytes)
Изменение размера файловой системы в /dev/sdf (devid 5):
# blockdev --getsize64 /dev/sdg
8001546444800
# btrfs fi res 5:8001546444800 /mnt/storage
Resize '/mnt/storage' of '5:8001546444800'
Попытка #2:
# btrfs replace start /dev/sdf /dev/sdg /mnt/storage
ERROR: target device smaller than source device (required 8001561124864 bytes)
Без изменений. Он появляется при указании источника как блочного устройства, replace
смотрит только на размер блочного устройства при проверке, достаточно ли места на приемнике. Однако, просматривая исходный код, я обнаружил, что replace
обрабатывает исходный раздел по-разному и фактически получает правильный размер из файловой системы.
Это привело к попытке #3:
# btrfs replace start 5 /dev/sdg /mnt/storage
Эта формулировка в сочетании с предыдущим изменением размера позволила успешно запустить операцию замены.