btrfs replace
действительно нужно попробовать, но есть две ошибки, связанные с его вызовом :он будет показывать ошибки только при использовании -B
(, в противном случае он завершится со статусом 0, как будто все в порядке, но вы' вы увидите «никогда не запускалось», когда вы проверите статус ), а недопустимые параметры вызовут несвязанные ошибки.
Например, я думаю, что с моим диском все в порядке, но RAID1 каким-то образом рассинхронизировался (вероятно, из-за отключения электроэнергии, во время которого хост выжил, но диски не получают резервного питания и могли подключиться к сети в несколько разное время. ). Чтобы проверить, когда я отключаю питание диска B (во время монтирования ), я могу нормально читать данные. Когда я вместо этого выключаю диск A (, диск B включается, а файловая система уже смонтирована ), тогда я получаю ошибки и повреждаю данные. Итак, ясно, что диск A в порядке, а диск B поврежден. Но диск B работает, поэтому я хочу -использовать его и просто восстановить. Поэтому я хочу заменить /dev/diskB
на /dev/diskB
.
Когда я использовал btrfs replace start -B /dev/diskB /dev/diskB /mnt/btrfs
, он показал мне ERROR: ioctl(DEV_REPLACE_START) failed on "/mnt/btrfs": Invalid argument, <illegal result value>
. Значит, проблема с точкой монтирования, верно? Нет, когда я изменил первый /dev/diskB
на /dev/diskA
, это просто сработало. Ошибка была в устройствах, а не в точке монтирования.
Точно так же я вижу, что первый аргумент(2
)немного странный. Возможно, ошибка неверна, и он будет работать с устройством вместо 2
?
btrfs replace
имеет два режима работы :один, в котором вы используете неисправное устройство в качестве первого аргумента (после start -B
или любого другого ), и режим (, если первый вариант недоступен ), где вы используете рабочее устройство для копирования.В любом случае вторым аргументом является диск, который вы хотите использовать для перестроения.
Не имеет значения, смонтирована ли файловая система для чтения -только для чтения или для чтения -для записи. Вот почему я подозреваю, что он отвергает ваши аргументы и дает вам неправильную ошибку, а не правильную ошибку.
head
кажется лучшим инструментом для работы:
head -n "$N" input.txt > input.log
С помощью sed
вам нужно указать команду; исходя из вашего подхода, это будет команда p
и опция -n
, поэтому она не печатает пространство шаблона по умолчанию:
sed -n "1,${N}p" input.txt > input.log
но
sed "$N q" input.txt > input.log
было бы более эффективно, только читая первые N
строки и останавливая (, что также делает head
)вместо чтения всего файла (, что делает sed "1,${N}p"
)].
Эти подходы дают один и тот же результат только для N
больших или равных 1; если он меньше 1, поведение будет отличаться.
Другие возможности
sed -n ''"$N"',$ !p' file
sed '1,'"$N"' !d' file
awk 'FNR <= '"$N"'' file
perl -ne'1..'"$N"' and print' file
Для строк от M до N (при условии, что M <= N):
head -n N input.txt | tail -n $(( N - M + 1))
или
cat input.txt | head -n N | tail -n $(( N - M + 1))
Последняя форма может использоваться для любого потока.
Использование двойных кавычек означает «без кавычек», что упрощает задачу:
head -$N ex
sed "$N q" ex
sed -n "1,$N p" ex
awk "NR <= $N" ex
perl -ne "print if $. <= $N" ex
grep -m $N. ex