LINUX.ORG.RU

Скрипт для ремонтных работ.


0

0

Собственно нужен init скрипт для хозяйственно-ремонтных работ в системе. Скрипт находится в initramfs. Пока следующее(по аналогии с гентушным руководством):

# Mount the /proc and /sys filesystems.
mount -t proc none /proc
mount -t sysfs none /sys

#create uuid and label
mini_udev

# Mount the root filesystem.
uuidlabel_root || rescue_shell

# Boot the real thing.
mount -n -o remount,rw /mnt/root
exec switch_root /mnt/root /bin/bash
Вот собственно и всё. Чего хотелось бы: поддержка русских шрифтов, автоматическое монтирование содержимого fstab, чтобы не было ругани про отсутствие xterm, всякий другой полезный стаф который по вашему усмотрения был-бы полезен.

И ещё поясните насчёт - «exec switch_root /mnt/root /bin/bash». Не совсем понимаю как это работает и зачем тут exec.

★★

switch_root — это pivot_root + chroot в одном флаконе. exec — это exec :-) замещает текущий процесс новым (/bin/bash)

sdio ★★★★★
()
Ответ на: комментарий от sdio

switch_root — это pivot_root + chroot в одном флаконе. exec — это exec :-) замещает текущий процесс новым (/bin/bash)

По-идее должно работать такое:

switch_root /mnt/root /bin/bash
exec /bin/bash
Не не работает. Или просто - «switch_root /mnt/root /bin/bash» Зачем писать - «exec switch_root»?

Booster ★★
() автор топика
Ответ на: комментарий от name_no

>я немного не понимаю, почему нельзя mount -a написать в этот скрипт?

Потому что в initrd нет файла /etc/fstab?

nnz ★★★★
()
Ответ на: комментарий от nnz

>Потому что в initrd нет файла /etc/fstab?

А также потому, что скоро все равно pivot_root делать.

nnz ★★★★
()
Ответ на: комментарий от Booster

Я ответил.

это pivot_root + chroot в одном флаконе.

exec ... замещает текущий процесс новым

какое слово не понятно?

sdio ★★★★★
()
Ответ на: комментарий от name_no

>я немного не понимаю, почему нельзя mount -a написать в этот скрипт?
Строка - «exec switch_root /mnt/root /bin/bash» всё делает сразу. Переключает корневой раздел и запускает bash. Как их разделить я не нашёл. Все мои попытки приводили к панике ядра.

Booster ★★
() автор топика
Ответ на: комментарий от sdio

Непонято то, что это не совсем стыкуется с маном. Там написано что switch_root принимает два аргумента. Если же я вызываю её без exec, то оно не работает, тупо вываливается справка по switch_root.

Booster ★★
() автор топика
Ответ на: комментарий от nnz

>Во-первых, нафига тебе их разделять?
Ну так чтобы воткнуть mount -a

Насчёт:
exec switch_root /mnt/root /bin/bash
Может кто-нибудь написать, в какой последовательности и с какими аргументами это выполняется. Для меня это диковиная связка.

Booster ★★
() автор топика
Ответ на: комментарий от nnz

>Во-вторых, почитай man pivot_root, там это рассмотрено.
Спасибо, но пока не выходит, паникует зараза.

Booster ★★
() автор топика
Ответ на: комментарий от Booster

>Ну так чтобы воткнуть mount -a

Если switch_root позволяет передавать аргументы вызываемой команде, можно сделать так:
exec switch_root /mnt/root /bin/bash -c '/bin/mount -a; exec /bin/bash'

nnz ★★★★
()
Ответ на: комментарий от Booster

> Может кто-нибудь написать, в какой последовательности и с какими аргументами это выполняется.

exec switch_root /mnt/root /bin/bash

gorilych ★★
()

зачем тут exec

switch_root работает только с pid=1. Зачем ему это надо? Чтобы инит запустить.

Если не будет exec, то запуститься дочерний процесс с pid>1. switch_root это проверяет отказывается работать в случае чего.

gorilych ★★
()
Ответ на: комментарий от gorilych

Понятно, значит exec запускает switch_root, который уже свою очередь запускает /bin/bash. То есть текущий init замещается switch_root-ом, который в свою очередь замещается /bin/bash?

Booster ★★
() автор топика
Ответ на: комментарий от Booster

кстати, я так понял, тебе после этого нужно автоматом какие то действия выполнить.

запихай их в .bashrc:

pid=$$
if [ $pid == 1 ]; then
  action1
  action2
  action3
fi
gorilych ★★
()
Ответ на: комментарий от gorilych

>запихай их в .bashrc:
Тоже вариант, но хотелось-бы разобраться как это сделать в том же скрипте.

Booster ★★
() автор топика

http://linuxforum.ru/viewtopic.php?id=5988
init скрипт для runit, чуть переделать под свой дистрибутив, впилить в sysVinit и всё.

только зачем, если можно всё разрисовать в на первом уровне sysV? (aka безопасный режим)

system-root ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.