Откат корневого снимка в BTRFS

Я не думаю, что это возможно в screen. Вы можете использовать fifo, чтобы получить вывод команды на экране , но я сомневаюсь, что «оболочка Minecraft» это поддержит.

Однако это «выполнимо» с помощью tmux.

Состояние процесса/трассировка стека

Трассировка стека

Чтобы заставить его работать правильно, вам нужно определить, в какой момент программа, которой вы передаете команды, зависла в соответствующей операции ввода-вывода. Способ сделать это - запустить трассировку стека и найти это. См. также :. Как определить, запущена ли команда или ожидает ввода данных пользователем? .

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

Редактировать Во время тестирования я столкнулся с интерпретаторомread(10, (zshselect(1, [0], NULL, NULL, NULL (python3cli ). Может быть несколько других возможностей, поэтому я не ограничивал RegExв приведенном ниже скрипте только этим. Сейчас он просто ищет открытую скобку. Может быть, кто-то знает более точный способ сделать это?

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

Подсчет строк

Если сервер работает как Child Processв Node, вы можете взаимодействовать с stdinи stdoutпроцесса в Node. Вы можете просто искать новые строки (\n), и если вы знаете, сколько строк должно быть на выходе,вы можете подсчитать их и «узнать», что он закончил работу и снова ожидает ввода. Вы можете совместить это с тайм-аутом.


Доказательство концепции со статусом процесса/трассировкой

Я переместил скрипт и некоторую документацию в репозиторий github . Я не проверял это с mc, но это работало с python3и zsh(. Насколько я мог это проверить, см. раздел «Тесты» ). Это все еще не идеально, так как все еще требует некоторого ожидания и может дать или не получить ложные срабатывания.

Как использовать

Вы можете запустить сервер/tmuxсессию так:

tmux new-session -d -s server_name "java -jar minecraft_server.jar"

Отправка команды на сервер будет выглядеть так:

./trun.sh -s server_name -c "the command"

Должен возвращаться вывод сервера. Возможно, вам придется отрегулировать параметры -Hи -T.


Синхронность

Имейте в виду, что если вы запустите это на веб-сервере, вы можете столкнуться с проблемами, особенно если есть несколько пользователей. Возможно, вам придется реализовать блокировку , чтобы предотвратить одновременный доступ нескольких пользователей к оболочке. Я уверен, что у самого tmuxне было бы проблем с этим, но вы не можете действительно предсказать вывод, если другая команда могла быть запущена, пока вы пытаетесь прочитать указанный вывод.

Безопасность

Если вы собираетесь запускать это на сервере с доступом к www, рассмотрите возможность его защиты (, например, с помощью защищенного паролем прокси-сервера через apacheилиnginx).

0
30.11.2020, 07:56
1 ответ

У вас есть файловая система BTRFS с двумя подтомами:

  1. fedora-Он установлен как по умолчанию подтом, и это то, что вы видите, когда монтируете файловую систему без указания подтома. Бывший.mount -t btrfs /dev/sda3 /mnt
  2. root/snapshots/test-Это созданный вами снимокfedora

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

Переименование подтома

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

Примечание.:В вашем случае это не сработает, потому что ваша ОС настроена на монтирование подтома по умолчанию в качестве корневой файловой системы, и этот процесс не изменит подтом по умолчанию.

mount -t btrfs -o subvolid=5 /dev/sda3 /mnt
cd /mnt
mv fedora fedora-old
mv fedora-old/root/snapshots/test fedora

Изменение подтома по умолчанию

При изменении подтома по умолчанию после перезагрузки ваша система будет загружаться с нового подтома по умолчанию. Идентификатор подтома 264, показанный ниже, взят из вашего примераbtrfs subvolume list /

btrfs subvolume set-default 264 /

Изменение корневого подтома в загрузчике

То, как это делается, зависит от вашего загрузчика, но часто загрузчик (ex. GRUB )содержит строку конфигурации, которая указывает, какую файловую систему монтировать в качестве корневой файловой системы. Эту конфигурацию можно изменить для загрузки другого подтома. К сожалению, у меня нет примера, чтобы показать. Но знайте, что это невозможно сделать в /etc/fstab, потому что этот файл читается позже.

Заключение

В вашей конкретной ситуации, я думаю, вы получите наилучшие результаты, изменив подтом по умолчанию.

3
18.03.2021, 22:46

Теги

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