LINUX.ORG.RU

GRUB перезагрузка

 , ,


1

1

Доброго дня Есть задача по оранизации кастомного пункта запуска в grub. Суть в том, что требуется изменить данные в одном файле(это работает) и следом перезагрузить систему. Сделал меню граб, довавил init=/bin/myscript.sh его содержимое

#!/bin/bash
sed -i 's/0/1/' /tmp/tst
reboot
при загрузке комманда sed отрабатывает, значение файла меняется, а вот reboot пишет что не найдена. Что было предпринято 1. в скрипте писал
reboot/shutdown -r now
пишет что комманда reboot не найдена

2. в скрипт добавлял init 6(так комманда не найдена) а если /usr/sbin/init ошибка Failed to talk to init daemon

3.довавил init=/bin/bash /bin/myscript.sh



Последнее исправление: dazzzdranagon (всего исправлений: 1)

reboot по умолчанию даёт сигнал системе инициализации, вместо которой ты запустил свой скрипт, добавь ключик -f

#!/bin/bash
sed -i 's/0/1/' /tmp/tst
reboot -f
sparks ★★★★
()

У тебя же PATH пустая.

/usr/bin/reboot -f    # man find

Если есть поддержка ядром sysrq, то можно так

sync
umount ...
echo b > /proc/sysrq-trigger

Если в ядре нет поддержки sysrq, то либо ищи и запускай reboot, который должен быть в системе, либо как-то дёргай сисколл reboot().

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

Для x86_64 :)

#!/bin/bash

echo -ne '\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00>\x00'\
'\x01\x00\x00\x00x\x00@\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00\x08'\
'\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\x008\x00\x01\x00@\x00\x05\x00'\
'\x04\x00\x01\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
'\x00@\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x93\x00\x00\x00\x00\x00'\
'\x00\x00\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\xbf\xad'\
'\xde\xe1\xfe\xbei\x19\x12(\xbagE#\x01f\xb8\xa9\x00\x0f\x05f\xb8<\x00\x0f\x05\x00'\
> rebt && chmod +x rebt && ./rebt

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

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

dazzzdranagon
() автор топика
Ответ на: комментарий от dazzzdranagon
echo -ne '\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
'\x02\x00\x03\x00\x01\x00\x00\x00T\x80\x04\x084\x00\x00\x00\x8c\x01'\
'\x00\x00\x00\x00\x00\x004\x00 \x00\x01\x00(\x00\x05\x00\x04\x00\x01'\
'\x00\x00\x00\x00\x00\x00\x00\x00\x80\x04\x08\x00\x80\x04\x08o\x00\x00'\
'\x00o\x00\x00\x00\x05\x00\x00\x00\x00\x10\x00\x00\xbb\xad\xde\xe1\xfe'\
'\xb9i\x19\x12(\xbagE#\x01f\xb8X\x00\xcd\x80f\xb8\x01\x00\xcd\x80'\
> rebt && chmod +x rebt && ./rebt

Этот вариант работает на обоих платформах.

anonymous
()
Ответ на: комментарий от anonymous
echo -ne '\x7fELF\x01\x01\x01\x00\xbb\xad\xde\xe1\xfe\xeb\x11\x00\x02\x00'\
'\x03\x001\xc0\xeb0\x08\x80\x04\x08,\x00\x00\x00\xb9i\x19\x12(\xeb\x11\x004'\
'\x00 \x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x80\x04\x08\xbagE#\x01\xeb'\
'\xd5\x00\x01\xeb\xd5\x00\x05\x00\x00\x00\xb0X\xcd\x80\xb0\x01\xcd\x80' > r
chmod +x r && ./r

80 байт. Кто меньше? :)

http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html

anonymous
()
Ответ на: комментарий от dazzzdranagon

требуется изменить данные в одном файле(это работает) и следом перезагрузить систему

Ты хочешь сделать это из граба через баш-скрипт? Параметр init - это параметр ядра линукса и скрипт твой выполняется уже после граба, ядром ОС. Насколько я знаю, из граба нельзя редактировать файлы. Если ты хочешь просто сделать пункт меню для перезагрузки, то добавь в свой grub.cfg

menuentry "Reboot" {
    reboot
}
Ну или можешь по-хипстерски, через update-grub — тут я не подскажу.

Если же хочешь отредактировать файл, то загружай систему, а там уже и баш тебе и сед и ребут.

Ничего себе новости, да?

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

в том то и проблема, что система не идет в перезагрузку из граба, а с редактированием проблем нет. Т.е. не отрабатывает именно перезагрузка.

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

Покажи как ты редактируешь файлы из граба?

Если в грабе нажать «c», то откроется командная строка. Попробуй ввести команду reboot там.

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

как в теме указано Сделал меню grub Тест linux16 параметры загрузки обычного режима init=/bin/myscript.sh

в скрипте указал что нужно править файл, после reboot. Файл правится #!/bin/bash sed -i 's/0/1/' /tmp/tst reboot

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

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

из под граба решение не работает, если из системы запустить скрипт, то все ок (про ELF для вызова сисколла reboot())

система не идет в перезагрузку из граба, а с редактированием проблем нет. Т.е. не отрабатывает именно перезагрузка

После того, как ты загрузил ядро, граба больше не существует и никакие команды граба после загрузки ядра работать, естественно, не будут. Граб загружает ОС, которая полностью берёт на себя управление системой. И перезгарузить ПК теперь можно только средствами системы.

не идет в перезагрузку из граба

#!/bin/bash sed -i 's/0/1/' /tmp/tst reboot

Ты так из граба перезагружаешь?

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

Доброго дня Задача стоит в том, что бы в грабе был пункт меню который правит файл и перезагружает систему. Из граба я запускаю скрипт в котором 2 комманды(правка и перезагрузка), вот именно перезагрузка и не работает.

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

А может это я чего-то не понимаю?

anonymous
()
Ответ на: комментарий от tyamur

Вот пункт меню или нужен полный?

menuentry 'TEST' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-simple-4f69622d-eca9-4581-a88c-71ef680ccee2' {
                load_video
                set gfxpayload=keep
                insmod gzio
                insmod part_msdos
                insmod ext2
                search --no-floppy --label --set=root /boot
                linux16 /vmlinuz-3.10.0-123.el7.i686 root=/dev/mapper/centos_test-root ro vconsole.keymap=us rd.lvm.lv=centos_test/root crashkernel=0@0  vconsole.font=latarcyrheb-sun16 rd.lvm.lv=centos_test/swap rhgb quiet init=/bin/test.sh 
                initrd16 /initramfs-3.10.0-123.el7.i686.img
       }

dazzzdranagon
() автор топика

Может кто знает как из граба подмонтировать файловую систему, внести изменения и ребутнуть машину? может так заработает?

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

у меня есть подозрение, что когда граб видит комманду reboot, то он игнорирует любые другие параметры(в том числе и sed) и сразу же ребутит ПК

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

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

Вопрос - вы специально хотите недозагрузить систему или ничего страшного, если она загрузится полностью? Дозапустите систему и редактируйте-ребутьте. Если дозарезу нужен отдельный пункт в grub, можете например передавать в нем ядру любой параметр, который далее использовать в качестве флажка в скрипте, запускаемом по cron @reboot. Хотя это все по любому через задницу и наверняка вашу задачу надо решать не через grub.

vaddd ★☆
()

Какой дистрибутив?

Если современный с systemd, то в нём reboot и shutdown - это симлинки на systemctl. И даже если попробовать дёрнуть systemctl, вряд ли сработает, так как systemd не запущен, dbus не запущен и т.д - некому давать команду.

Вот так стоит попробовать:

echo 1 > /proc/sys/kernel/sysrq 
echo b > /proc/sysrq-trigger

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

дистрибутив centos 7 32 бита, сейчас потестим, спасибо

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

задача стоит в следующем 1. выбрать пункт меню grub 2. Он должен записать в файл 1 и перезагрузить ПК 3. После уже можно грузить в обычном режиме, он прочтет этот конфиг, увидит 1 и будет работать в другом режиме

dazzzdranagon
() автор топика
Ответ на: комментарий от shell-script

Какой дистрибутив? Если современный с systemd

Что за вбросы от модератора?)

ashot ★★★★
()

Итоговое решение тупо и примитивно, но оно работает. 1. Взял пункт загрузки обычного режима 2. Дописал в строке загрузки слово testo 3. В кроне сделал проверку наличия этого слова в параметрах загрузки ядра и если оно есть- выполнять замену и reboot. Костыль? возможно, но это работает. Всем спаисбо

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

Раз у тебя systemd, сделай кастомный edit_reboot.target, добавь в него service со своим скриптом. В параметры ядра в grub'е добавляешь systemd.unit=edit_reboot.target. man systemd.target и man systemd.service в помощь.

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