Как запустить вторую оболочку в однопользовательском режиме?

14

Это может звучать как противоречие в терминах, но недавно мне нужно было использовать однопользовательский режим (он же режим обслуживания) в течение некоторого времени (дней!) При попытке восстановить поврежденный массив RAID.

При этом я обнаружил, что хочу использовать вторую оболочку для таких вещей, как проверка / редактирование настроек в различных конфигурационных файлах или просмотр системных журналов, в то время как основная (и единственная) консоль связана, выполняя некоторый процесс восстановления.

Какой будет рекомендуемая команда для запуска второй оболочки на другом tty?

Очевидно, что одним из методов может быть использование screenв tty1, но это не совсем просто переключать сеансы с Alt-F1, Alt-F2 и т. Д.

StarNamer
источник
4
screenтак же просто, как это. Ctrl AP не намного хитрее, чем Alt F1 ...
mveroone
Стоит отметить, что такие приложения, как screenи tmuxдля управления окнами TUI, не всегда работают. Иногда вам нужно реальное ttyXустройство, а не pts.
Парфянский выстрел

Ответы:

14

Там же команда специально разработан для этой ситуации: openvt. Просто запустите openvtсвою оболочку на tty1, и вы найдете оболочку, запущенную на первом tty, на которой еще ничего не было (вероятно, tty2). Есть несколько опций, которые могут оказаться полезными; см. справочную страницу openvt.

Поскольку это не вход в систему, управляемый getty, при выходе из новой оболочки вы не увидите подсказки входа в систему. Tty просто отключится, поскольку на нем не будет запущено ни одного процесса, но вы все равно сможете переключаться назад и вперед (Alt-F1 Alt-F2) и смотреть, что было на экране при выходе из оболочки. Команда deallocvtуничтожает ttys, которые находятся в этом подобном зомби состоянии, возвращаясь к исходному состоянию «Alt-F2 ничего не делает».

Первоначально эти команды назывались openи disalloc, но в конце концов кто-то решил изменить их, потому что они были слишком общими, и дислокация была оценена как «не слово».

В старые времена драйвер клавиатуры и init были обычным образом настроены так, что Alt + Up работал open, так что он действовал как горячая клавиша для запуска оболочки на новой консоли. Вы все еще можете найти остаток этой старой конфигурации, закомментированный, в вашем /etc/inittab. (Если вы не используете какой-то необычный новый init, у которого нет inittab.)

Там есть аналогичный вопрос здесь

Сообщество
источник
3
Хорошо, я не знал об этом openvt. +1.
Jscott
Это на самом деле кажется намного проще, чем getty. Я так и не понял, что он уже установлен
StarNamer
Просто подумал, что сообщу, что я провел больше недели с системой в однопользовательском режиме, ремонтируя RAID-массив, и openvtоказался очень полезным. Спасибо за привлечение новой команды к моему уведомлению.
StarNamer
12

Вы можете породить еще одного, gettyсколько захотите. Загрузитесь в однопользовательском режиме, затем запустите gettyна tty2:

root@host:~# /sbin/getty 38400 tty2 &

Вы можете прямо сейчас Alt+ F2на новый терминал. Повторите для дополнительных ttys по мере необходимости. Возможно, вы могли бы сделать что-то более чистое и просто настроить, /etc/inittabчтобы автоматически обрабатывать это в однопользовательском режиме.

jscott
источник
Это похоже на то, что я ищу. Я попробую в следующий раз.
StarNamer
Попробовал это. Это работает, но, поскольку сеанс входа в систему не порождается init, он не возрождается, если он умирает.
StarNamer
Действительно, мы просто отбрасываем его на задний план в приведенном выше примере. Если вам требуется полное предложение реального vt, вы будете взломать /etc/inittabи /etc/rc1.d/S??singleпо крайней мере.
Jscott
2

Вы, вероятно, можете обойтись без дополнительного экземпляра оболочки, используя JOB CONTROLв своей текущей оболочке. Это задокументировано на странице руководства bash(1).

Вы можете просто приостановить задачу, используя последовательность Ctrl+ Zпо умолчанию, хотя она может быть настроена в вашем терминале по-другому, проверьте вывод stty -a:

$ stty -a | grep susp
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;

Вы можете проверить свою работу, выдав jobs:

# jobs
[1]   Stopped                 journalctl -f
[2]-  Stopped                 vim /etc/hosts
[3]+  Stopped                 tail -f /var/log/firewalld

Выведите одного из них на передний план:

$ fg %3

Или возобновить это в фоновом режиме:

$ bg %2

Этот метод не имеет многих преимуществ screenили tmux, но может быть одинаково полезен в некоторых ситуациях.

Дауд
источник
Дело в том, что я не хочу приостанавливать или мешать процессу, запущенному на начальной консоли. Например, во время работы ddrescueя не хочу прерывать и возобновлять его, даже если он настроен для этого ..
StarNamer
Пара проблем с этим. С одной стороны, он не может использовать bash в качестве оболочки (может быть csh, например tcsh, или zsh), поэтому упоминание его man-страницы в этом случае будет неточным. С другой стороны, это не отвечает на вопрос, как задано.
Парфянский выстрел
1

Подумайте об использовании терминальных мультиплексоров, таких как tmux или screen.

Узнайте больше о tmux здесь: https://github.com/tmux/tmux/wiki

Марчин Камински
источник
Вопрос уже упоминает об этом: «Очевидно, что одним из способов может быть использование экрана в tty1 *, но это не совсем просто переключать сеансы с Alt-F1, Alt-F2 и т. Д.».
Кристиан Чиупиту,
Как говорит Кристиан, я уже рассматривал screenи чувствовал, что другие мультиплексоры были еще более излишними. Все, что мне нужно, это простая вторая консоль.
StarNamer
Ах, извините, я упустил из виду screenваш вопрос. Было поздно.
Марцин Камински
Как использовать комбинацию из двух ключей, чтобы они были «излишними» рядом с порождающими новые TTY и привязывались к ним отдельно и тому подобное?
mveroone
IMO, это странное определение «перебор», но, эй, что бы ни работало для кого-то, я в порядке;)
Marcin Kaminski