Можно ли объединить раздел XFS с другим разделом XFS?

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

Сzsh:

{cat =(producer > >(consumer1 >&3) | consumer2)} 3>&1

Проблема

bashзаключается в том, что он не ожидает команд подстановки процесса, поэтому вам придется использовать неприятные обходные пути .

Здесь мы используем =(...)форму подстановки процесса для сохранения результатов comsumer2во временном файле и catих впоследствии. Мы не можем сделать это для более чем 2 потребителей. Для этого нам нужно создать временные файлы вручную.

Если не использовать =(...), нам придется выполнять очистку временных файлов вручную. Мы можем справиться с этим, создав и удалив их заранее, чтобы не беспокоиться о случаях, когда скрипт завершается. Еще сzsh:

tmp1=$(mktemp) && tmp2=$(mktemp) || exit
{
  rm -f -- $tmp1 $tmp2
  producer > >(consumer1) > >(consumer2 >&3) > >(consumer3 >&5)
  cat <&4 <&6
} 3> $tmp1 4< $tmp1 5> $tmp2 6< $tmp2

Редактировать (Сначала я пропустил тот факт, что требуется решение для dash)

Дляdash(или любой оболочки POSIX, которая не устанавливает флаг закрытия -на -exec на fds выше 2 и использует каналы, а не пары сокетов для |), а также в системах с поддержкой /dev/fd/x:

tmp1=$(mktemp) && tmp2=$(mktemp) || exit
{
  rm -f -- "$tmp1" "$tmp2"
  {
    {
      {
        producer | tee /dev/fd/4 /dev/fd/6 | consumer1 >&7
      } 4>&1 | consumer2 >&3
    } 6>&1 | consumer3 >&5
  } 7>&1
  cat - /dev/fd/6 <&4
} 3> "$tmp1" 4< "$tmp1" 5> "$tmp2" 6< "$tmp2"

Это будет работать с dash, bash, zsh, mksh, busybox sh, poshв Linux, но не с ksh93. Этот подход не может выйти за пределы 4 потребителей, поскольку мы ограничены fds от 0 до 9.

2
06.09.2020, 18:50
1 ответ

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

  • umount /mnt, выполнено
  • удалить sda3с помощью fdiskили parted, готово
  • расширить разделsda2
  • расширить файловую систему с помощью xfs_growfs /.

Третий шаг немного опасен. Если у вас есть резервная копия системы, продолжайте, в противном случае используйте gpartediso. В вашей действующей системе запустите fdisk /dev/sda. pдля просмотра списка разделов. Запишите начальный сектор sda2 и тип идентификатора. Затем d, чтобы удалить его! Далее создайте новый раздел, начиная точно с того же сектора, что и раньше, и заканчивая последним сектором диска. Вероятно, он будет установлен на тот же идентификатор и тип, я полагаю, 83 Linux, но проверьте и это. После того, как вы закончите p, снова проверьте, что начальный сектор нового sda2 и id совпадают со старым,wq. Опасная часть заключается в том, что если вы пропустите начало или идентификатор, данные раздела будут уничтожены (ну, не совсем так, но у вас будут проблемы ). Просто удаление раздела изменяет таблицу, данные не трогаются.
После этого xfs_growfs /расширит файловую систему; в противном случае может потребоваться команда partprobeили partx, чтобы ядро ​​могло получить информацию об изменениях. Или можно просто перезагрузиться.

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


Другим способом может быть загрузка gpartedсоздание загрузочного USB/CD, загрузка оттуда и выполнение работы в простой графической среде.

3
18.03.2021, 23:06

Теги

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