single-mode во FreeBSD с поддержкой сети

    Это совсем маленькая заметка о том, что как нет ничего более постоянного чем временное, так и самая тривиальная(на первый взгляд) задача занимает больше всего времени.
    В пятницу утром знакомый обратился с вопросом «Как пересобрать мир в 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.: Может я всё усложняю и есть способ проще?

    Похожие публикации

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 25

      +2
      В пятницу утром знакомый обратился с вопросом «Как пересобрать мир в single-mode на удалённом сервере без KVM?»
      Я бы задал сначала встречный вопрос: зачем делать это в single-моде?

      Сам я лично уже давно забил на переход в sinlge-user при пересборке (точнее, установке) ядра+мира, ибо всё и так работает.
        0
        Я бы задал более важный вопрос: какого, простите, черта на удаленном сервере делают пересборку мира? Сборочный сервер хотя-бы в виде чрута отменили?
          0
          Получив новый сервер в ДЦ, где есть только предустановленные образы и смонтировать свой нельзя первым делом качаю исходники и пересобираю ядро и мир, ибо кто их знает чего они там наконфигурили, так что не вижу в этом ничего необычного.
            0
            Если ДЦ не предоставляет KVM, то можно загрузившись в предустановленный Линукс, записать в начало диска образ MfsBSD, возможно, чуть модифицированный для поддержки сети. И дальше через liveCD засетапить FreeBSD по своему вкусу.
          0
          Я бы задал сначала встречный вопрос: зачем делать это в single-моде?

          Ну рекомендации хэндбука вероятнее всего связаны с тем, что проблемно заменить висящие в памяти файлы. Но тот же init по
          install -s -o root -g wheel -m 555  -b -B.bak -fschg -S init /sbin/init
          
          меняется без проблем, т.е. скорее всего установка в мультимоде пройдёт корректно.
          Но если есть возможность сделать это в сингле, то я ей пользуюсь
            +1
            Я уже и не вспомню сейчас, откуда эта рекомендация изначально там взялась. Возможно, это имеет смысл для того, чтобы изменения в сервисах (rc) вступили в силу без перезагрузки (при выходе из сингла по ^D). Но так как обычно вместе с миром пересобирают заодно и ядро, ребут в любом случае понадобится. Так что имхо в 99% случаев можно смело говорить make installworld в обычном (многопользовательском) режиме.
              0
              Так что имхо в 99% случаев можно смело говорить make installworld в обычном (многопользовательском) режиме.

              Полностью поддерживаю и если не академический интерес, то врядли я бы стал задумываться об этом одном проценте. Но сам факт отсутствия изначально некоего "/etc/rc.singleuser" из коробки несколько удручает.
                +1
                Нет, эта рекомендация для securelevel инсталляций (иначе просто не даст перезаписать файлы с schg)
            –1
            Для пересборки мира и ядра не обязательно загружаться в single-mode, правда понадобятся две перезагрузки.
              0
              Простите, а зачем две перезагрузки? На старой системе (multi-user mode): make -jX buildworld buildkernel ; su ; make installkernel ; (возможно, понадобится mergemaster -p, но обычно нет) ; make installworld ; mergemaster -Fi ; reboot. И мы в новой системе (в single-user нигде не переходим, ребутимся один раз в самом конце).
                0
                Я не использую margemaster, у меня свой скрипт. Вторая перезагрузка нужна для подстраховки, что с новым ядром все хорошо.
                  +2
                  Я не использую mergemaster, у меня свой скрипт.
                  Страшный человек! :-)
                  Вторая перезагрузка нужна для подстраховки, что с новым ядром все хорошо.
                  А можете привести пример ситуации/проблемы, которую бы не отловила первая перезагрузка?
                    0
                    Вы меня просите вспомнить, с какими приключениями было связано одновременное обновление мира и ядра?
                    За 10 лет использования своей методики помню о нескольких случаях.

                    1) После make installworld; mergemaster не всегда корректно отрабатывает /etc/rc.shutdown — в паре случаев система зависает и требуется нажимать кнопку reset на сервере.
                    Поэтому аналог margemaster я запускаю после первого ребута, предварительно почитав логи.

                    2) Были проблемы с новым zfsloader. После обновления приходилось грузится в рискрежим и возвращать старую копию.

                    3) Был конфликт при переходе маркировки дисков с ad в ada. device ahci конфликтовал с RAID контролером device siis. В итоге пришлось выгружать модуль ahci. Потом, через какое-то время, конфликт исчез.

                    4) В мае-июне 2014 после обновления мира-ядра перестал грузится системный пул ZFS. После длительного шаманства пришлось пересоздать пул и перенести файлы со старого пула.

                      0
                      Вы меня просите вспомнить, с какими приключениями было связано одновременное обновление мира и ядра?
                      Нет, я спрашивал, для чего нужна вторая перезагрузка, т.к. вы выше говорили, «что не обязательно загружаться в single-mode, правда понадобятся две перезагрузки.»
                      За 10 лет использования своей методики помню о нескольких случаях. [...]
                      Я понимаю, да, случается, к сожалению, что система с новыми ядром и/или миром не встает. Но это ведь отлавливается сразу же (после первой перезагрузки), нет?

                      Понятное дело, что если что-то пошло не так, дополнительного шаманства и перезагрузок может понадобиться даже больше одной, однако речь изначально шла про штатную (обычную) ситуацию.
                        0
                        В общем случае, с одной перезагрузкой легко получить не до конца выключенный сервер.
                        Так как у меня нет возможности перегрузить по питанию, то снижаю риски, и обновляюсь в два этапа.
              –5
              <не холивара ради>
              Никогда не понимал ради чего люди идут на использование source-based ОСей на продакшен системе.
              Особенно имеющих такие специфические проблемы. Да и вообще, наличие компилятора на сервере это +еще немного шансов врагу собрать эксплоит.

              Когда уже Фря перейдёт на бинарные пакеты…
              </не холивара ради>
                +1
                man freebsd-update
                man pkg

                От компилятора в системе не избавит, он входит в базовую поставку, но в целом бинарные обновления как базовой системы, так и дополнительного софта — пожалуйста. Всё зависит от вкусов. <irony>И от количества раз, которое freebsd-update убил систему при обновлении со сменой версии ОС.</irony>
                  0
                  Про базовую систему то всё понятно, я имел в виду именно дерево портов.

                  И от количества раз, которое freebsd-update убил систему при обновлении со сменой версии ОС

                  Вот почему так? У меня есть дебианы обновляемые еще с 5 версии, а то и раньше (сейчас 7) — всё обновлялось достаточно гладко.
                  Другие дистрибутивы линуксов аналогично.
                    0
                    я имел в виду именно дерево портов

                    pkg умеет в том числе и устанавливать/удалять бинарные сборки пакетов: www.freebsd.org/doc/ru/books/handbook/pkgng-intro.html

                    Ну, например после перехода на 14.10, если не ошибаюсь, при использовании проприенатрых драйверов nvidia мой тачпад стал время от времени фризить иксы, для восстановления работоспособности приходится переключаться в консоль и потом возвращаться назад в иксы. Так что странные эффекты при обновлении и у линуксов случаются, хоть тут речь и не о десктопной системе.
                      0
                      На лине у меня synclient зависал последнее время превращая тачпад в монстра.
                        0
                        pkgng это интересно, спасибо, буду знать. Но, как видно, его еще мало юзают, все заняты пересборкой мира :)

                        Да, я тут именно про серверные системы, с десктнопами всё бывает иначе.
                          0
                          Еще как юзают; многие от портов уже практически совсем отказались, даже те, кому нужны кастомные пакеты (для этого есть poudriere). Благо, pkg уже давно не «ng». ;-)

                          Все поддерживаемые системы, включая восьмёрку, на него перевели. И оно действительно работает и вполне пригодно для продакшна. Обо всех проблемах и пожеланиях сообщайте, пожалуйста, в трекер на гитхабе.
                        0
                        rm -rf /usr/ports

                        Проблема решается в одну комманду. И при установке их можно не ставить.

                        Вообще их не ставят в базу, внутри системы для работы запускают jails и туда вешают необходимые сервисы, в jail нет ни компиляторов ни большинства либ, а что есть залимитировано по максимуму, в джеилах стоит высокий securelevel.

                        Соответственно poudriere для сборки пакетов. Остальное как хотите. Свобода (можно вообще все через nullfs зарутить).
                        0
                        Мне уже выше эту ссылку давали

                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                    Самое читаемое