Как сохранить форматирование вывода подстановки команды fish shell, хранящегося в var?

ZFS действительно не поддерживает то, что вы хотите сделать. Можно заставить его делать то, что вы хотите, но при этом вы все время боретесь с предполагаемым использованием.

Следует помнить, что ZFS — это корпоративная файловая система и решение для управления томами. В корпоративной среде, независимо от того, как это сделать, дополнительная сложность того, что вы описываете, затмит стоимость приобретения дисков того же размера.

Самое чистое решение с учетом того, что у вас есть , вероятно, действительно состоит в том, чтобы разделить большой диск на две части, а затем настроить пул с двумя виртуальными устройствами, каждый с одним из меньших дисков и половиной большего.. Затем ZFS распределит данные между двумя виртуальными устройствами, предоставив вам два -широких чередующихся набора из двух -зеркал пути :в стандартных терминах RAID, один RAID 0 из двух RAID 1 из двух устройств в каждом, где одно устройств на каждом RAID 1 действительно являются частями одного устройства. Что-то вроде этого (, где физические устройства отмечены*):

                            _ small1*
                           /
          _ raid0left ----<                    _ largeleft
         /                 \                  /
pool ---<                   >---- large* ----<
         \                 /                  \
          ` raid0right ---<                    ` largeright
                           \
                            ` small2*

Видишь, как хрупко это выглядит? Во-первых, если вы потеряете этот большой диск по любой причине, вы потеряете всю избыточность, что значительно ограничит способность ZFS восстанавливаться после ошибок.

Это заставит больший диск искать как сумасшедший, чтобы удовлетворить запросы ввода-вывода, поскольку ZFS будет рассматривать его как два отдельных устройства, когда на самом деле это всего лишь одно, и, скорее всего, отключит многие оптимизации ZFS, потому что ZFS больше не может предполагать, что он контролирует весь большой диск. Если это вращательный двигатель, то сам по себе поиск создаст для него огромные нагрузки.

Это также в значительной степени заблокирует вас в этой настройке, поскольку, по крайней мере, в последний раз, когда я смотрел, виртуальные устройства можно только добавлять в пул, а не удалять. Вы можете заменять устройства внутри vdev, но вы ничего не можете сделать с самим vdev, не уничтожив и не воссоздав весь пул.Также помните, что каждый отдельный vdev в пуле должен быть не ниже DEGRADED, чтобы пул работал. Поэтому даже в лучшем случае вы получаете надежность не выше простой зеркальной конфигурации, так как даже при отсутствии каких-либо других сбоев выход из строя одного физического устройства ухудшает обе стороны страйпинга. В этом случае лучше надеяться, что два небольших диска выдержат суровые условия ресильвера.

Если вы попытаетесь сделать это в любом случае, если диск большего размера не является SSD, мне кажется, что одна только активность поиска будет абсолютно разрушительной для производительности пула, определенно с точки зрения IOPS и, вероятно, с точки зрения пропускной способности.

На моем месте я бы просто взял второй диск того же размера, что и больший, и установил простое -двустороннее зеркало.

2
20.05.2021, 12:24
2 ответа

По умолчанию fish разделяет подстановки команд((command))на новую строку. Чтобы переопределить это поведение, вы можете использовать специальные подкоманды строки , такие как string split(, которые позволяют вам определить, что разбивать на ), string split0(, которые разбиваются на байты NUL )и string collect(. который вообще не разделяется[0] ).

Итак, ответ:

set tst (cat file | string collect)
echo $tst

[0] :Обратите внимание, что байты NUL не могут быть переданы командам, потому что unix передает аргументы как строки с завершением NUL -, поэтому команда не может знать, что аргумент продолжается, поэтому string collectфактически просто захватывает команда выводит до первого NUL, давая вам не более одной записи, в то время как string split0может привести к нескольким аргументам.

4
28.07.2021, 11:30

fish сохраняет результат подстановки команд в виде списка строк (, за исключением случаев, когда используется string collect). Так что вы можете сделать

> set tst (cat file)
> printf '%s\n' $tst
line1
line2
1
28.07.2021, 11:30

Теги

Похожие вопросы