Это совсем маленькая заметка о том, что как нет ничего более постоянного чем временное, так и самая тривиальная(на первый взгляд) задача занимает больше всего времени.
В пятницу утром знакомый обратился с вопросом «Как пересобрать мир в single-mode на удалённом сервере без KVM?»
«Прописать в /etc/rc скрипт выполняющий /etc/netstart && service sshd start в части исполняемой в single-mode, а дальше всё как обычно», — ничтоже сумняшеся ответил я.
Но спустя часа два вопрос повторился и оказалось, что всё не так тривиально.
Уж не знаю было ли это просто моим заблуждением или всё-таки в ранних версиях FreeBSD /etc/rc частично выполнялся в single-mode(справедливости ради никогда не приходилось это проверять), но в 10-ке он действительно не работает.
Итак, задача:
# uname -opr
FreeBSD 10.1-STABLE amd64
Необходимо перейти из multi-mode в single-mode и получить доступ по ssh.
Поехали:
Раз в однопользовательском режиме никакие скрипты не выполняются исправим эту оплошность. Подредактируем исходники init.
Добавляем в /usr/src/sbin/init/pathnames.h путь к нашему скрипту
#define _PATH_MYSINGLE "/etc/rc.my_single"
В /usr/src/sbin/init/init.c в функцию single_user добавляем вызов
run_script(_PATH_MYSINGLE);
Его необходимо поместить где-нибудь до вызова open_console().
Сам вызываемый скрипт:
/etc/rc.my_single
#!/bin/sh
/bin/echo "NET START"
/bin/sh /etc/netstart
/bin/echo "SSH START"
/usr/sbin/service sshd start
Собираем, ставим, ребутаемся (может и есть способ перезапустить init без перезагрузки, но я не стал на удалённой машине испытывать судьбу):
cd /usr/src/sbin/init && make && make install && shutdown -r now
После загрузки в multi-mode для перехода в single "shutdown now" или "init 1" на любителя.
Ну и дальше всё как обычно.
p.s.: Может я всё усложняю и есть способ проще?
Автор: simpleadmin