LINUX.ORG.RU

grub-install из скрипта 2

 , , ,


0

1

Снова здравствуйте. Новый виток ковыряний grub'а...
Начало тут grub-install из скрипта

Немного некропостинга. Потестил установку grub из скрипта запускаемго не руками а системно - crontab(вместо udev).

Тестовый скрипт:

#!/bin/bash

DISK="/dev/sdb"
log_file="~/test.log"
/usr/sbin/grub-install $DISK 2>>$log_file
Запущенный cron'ом grub-install ругается в лог:

Installing for i386-pc platform.
/usr/sbin/grub-install: ошибка: диск «md0» не найден.

Вручную отрабатывает нормально.
Подскажите, что я упустил? Что не так?
Да, присутствует RAID1(деградированый) на /dev/sdaX-X.

★★★★★

Последнее исправление: S_Paul (всего исправлений: 2)
Ответ на: комментарий от joy4eg

Сделал, всё по-прежнему.

Вручную:

/usr/sbin/grub-install: предупреждение: Невозможно найти физический том «(null)». Некоторые модули в базовом образе могут отсутствовать..
Установка завершена. Ошибок нет.

cron:

Installing for i386-pc platform.
/usr/sbin/grub-install: ошибка: диск «md0» не найден.

cron+verbose:

/usr/sbin/grub-install: информация: executing modprobe efivars 2>/dev/null.
/usr/sbin/grub-install: информация: Looking for /sys/firmware/efi ...
/usr/sbin/grub-install: информация: ... not found. Looking for /proc/device-tree ...
/usr/sbin/grub-install: информация: ... not found.
Installing for i386-pc platform.
/usr/sbin/grub-install: информация: не удалось открыть «/boot/grub/device.map»: Нет такого файла или каталога.
/usr/sbin/grub-install: информация: copying `/usr/lib/grub/i386-pc/pata.mod' -> `/boot/grub/i386-pc/pata.mod'.
...
/usr/sbin/grub-install: информация: drive = -1.
/usr/sbin/grub-install: ошибка: диск «md0» не найден.

Чувствую, что-то с шеллом... Товарищи, дайте ещё идей.(спойлер: уже выкладывал тут наработку одну, сейчас доделываю часть grub'ом)

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

Кавычек сначала небыло, да и не изменилось ничего. Зачем их убирать? Переменная от этого не меняет содержания.

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

Добавление модуля search_fs_uuid не помогло.
Что бы я не указывал в качестве места установки - /dev/sd[b,a,c] или '(hdX)' или тот самый /dev/md0, выхлоп ошибки один и тот-же:

/usr/sbin/grub-install: ошибка: диск «md0» не найден.

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

mdadm обязательно, даже перепроверял.
А может тут разработчики grub присутствуют...? Это наверняка не баг.
Я уже его сегодня через gdb мучал - ноль выхлопа.
Коллега-прогер со мной исходники поглядел, говорит - возможно вот это самое «md0» уже в переменной прилетает.(ну как-то так) А похоже что он вообще переданное ему имя устройства не получает корректно.

S_Paul ★★★★★
() автор топика
Последнее исправление: S_Paul (всего исправлений: 1)
Ответ на: комментарий от anonymous

Спасибо. Никогда ещё IRC не пользовался:)

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

А похоже что он вообще переданное ему имя устройства не получает корректно.

Ну дак strace, там показываются какие аргументы переданы.

А verbose выхлоп вы вырезали в самом интерестном месте, где grub начинает определять какое устройство что из себя представляет. И можете сравнить с verbose для случая запуска из консоли.

mky ★★★★★
()

А с другой стороны, если вручную прокатывает, то дело, скорее всего в скрипте или переменных окружения.

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

О, и ведь думал про strace...
В verbose мне показалось всё одинаковым. В понедельник сделаю и то и другое.

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

Переменные окружения добавлю в лог. А в скрипте что не так?

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

Добавил в скрипт $PATH, из крона заработало, из udev - нет.
Разница в verbose выводе:
cron

.....
/usr/sbin/grub-install: info: no partition map found for mduuid/e32ca389b324e560ebebd6533f5ad92c.
.....
/usr/sbin/grub-install: warning: Couldn't find physical volume `(null)'. Some modules may be missing from core image..
/usr/sbin/grub-install: info: no partition map found for hostdisk//dev/sda.
/usr/sbin/grub-install: info: /dev/sdb is not present.
/usr/sbin/grub-install: info: Looking for /dev/sdb.
/usr/sbin/grub-install: info: /dev/sdb is a parent of /dev/sdb.
/usr/sbin/grub-install: info: /dev/sdb is present.
/usr/sbin/grub-install: info: Looking for /dev/sdb.
/usr/sbin/grub-install: info: /dev/sdb is a parent of /dev/sdb.
/usr/sbin/grub-install: info: /dev/sdb is present.
/usr/sbin/grub-install: info: Looking for /dev/sdb.
/usr/sbin/grub-install: info: /dev/sdb is a parent of /dev/sdb.
/usr/sbin/grub-install: info: grub-mkimage --directory '/usr/lib/grub/i386-pc' --prefix '(mduuid/e32ca389b324e560ebebd6533f5ad92c)/boot/grub' --output '/boot/grub/i386-pc/core.img' --format 'i386-pc' --compression 'auto'  'ext2' 'part_msdos' 'diskfilter' 'mdraid1x' 'biosdisk'
.
/usr/sbin/grub-install: info: the total module size is 0x6ae0.
/usr/sbin/grub-install: info: reading /usr/lib/grub/i386-pc/kernel.img.
/usr/sbin/grub-install: info: locating the section .text at 0x0.
/usr/sbin/grub-install: info: locating the section .rodata at 0x54d4.
/usr/sbin/grub-install: info: locating the section .data at 0x6480.
/usr/sbin/grub-install: info: locating the section .bss at 0x6c08.
/usr/sbin/grub-install: info: reading /usr/lib/grub/i386-pc/fshelp.mod.
/usr/sbin/grub-install: info: reading /usr/lib/grub/i386-pc/ext2.mod.
/usr/sbin/grub-install: info: reading /usr/lib/grub/i386-pc/part_msdos.mod.
/usr/sbin/grub-install: info: reading /usr/lib/grub/i386-pc/diskfilter.mod.
/usr/sbin/grub-install: info: reading /usr/lib/grub/i386-pc/mdraid1x.mod.
/usr/sbin/grub-install: info: reading /usr/lib/grub/i386-pc/biosdisk.mod.
/usr/sbin/grub-install: info: kernel_img=0x25180c0, kernel_size=0x6c08.
/usr/sbin/grub-install: info: the core size is 0x683f.
/usr/sbin/grub-install: info: reading /usr/lib/grub/i386-pc/lzma_decompress.img.
/usr/sbin/grub-install: info: reading /usr/lib/grub/i386-pc/diskboot.img.
/usr/sbin/grub-install: info: writing 0x200 bytes.
/usr/sbin/grub-install: info: writing 0x737f bytes.
/usr/sbin/grub-install: info: copying `/usr/lib/grub/i386-pc/boot.img' -> `/boot/grub/i386-pc/boot.img'.
/usr/sbin/grub-install: info: grub-bios-setup  --verbose     --directory='/boot/grub/i386-pc' --device-map='/boot/grub/device.map' '/dev/sdb'.
/usr/sbin/grub-install: info: reading /boot/grub/i386-pc/boot.img.
/usr/sbin/grub-install: info: reading /boot/grub/i386-pc/core.img.
/usr/sbin/grub-install: info: root is `(null)', dest is `hostdisk//dev/sdb'.
/usr/sbin/grub-install: info: Opening dest.
/usr/sbin/grub-install: info: drive = 1.
/usr/sbin/grub-install: info: the size of hostdisk//dev/sdb is 250069680.
/usr/sbin/grub-install: info: /dev/md0 is not present.
/usr/sbin/grub-install: info: changing current directory to /dev.
/usr/sbin/grub-install: info: changing current directory to snd.
/usr/sbin/grub-install: info: changing current directory to vfio.
/usr/sbin/grub-install: info: changing current directory to mapper.
/usr/sbin/grub-install: info: changing current directory to net.
/usr/sbin/grub-install: info: changing current directory to hugepages.
/usr/sbin/grub-install: info: changing current directory to mqueue.
/usr/sbin/grub-install: info: changing current directory to shm.
/usr/sbin/grub-install: info: changing current directory to md.
/usr/sbin/grub-install: info: changing current directory to disk.
/usr/sbin/grub-install: info: changing current directory to by-uuid.
/usr/sbin/grub-install: info: changing current directory to by-id.
/usr/sbin/grub-install: info: changing current directory to block.
/usr/sbin/grub-install: info: /dev/sda1 is present.
/usr/sbin/grub-install: info: Looking for /dev/sda1.
/usr/sbin/grub-install: info: /dev/sda is a parent of /dev/sda1.
/usr/sbin/grub-install: info: /dev/sda1 starts from 2048.
/usr/sbin/grub-install: info: opening the device hostdisk//dev/sda.
/usr/sbin/grub-install: info: drive = 0.
/usr/sbin/grub-install: info: the size of hostdisk//dev/sda is 234441648.
/usr/sbin/grub-install: info: drive = 0.
/usr/sbin/grub-install: info: the size of hostdisk//dev/sda is 234441648.
/usr/sbin/grub-install: info: Scanning for DISKFILTER devices on disk hostdisk//dev/sda.
/usr/sbin/grub-install: info: Scanning for mdraid1x devices on disk hostdisk//dev/sda.
/usr/sbin/grub-install: info: Scanning for mdraid09_be devices on disk hostdisk//dev/sda.
/usr/sbin/grub-install: info: Scanning for mdraid09 devices on disk hostdisk//dev/sda.
/usr/sbin/grub-install: info: Scanning for dmraid_nv devices on disk hostdisk//dev/sda.
/usr/sbin/grub-install: info: Scanning for ldm devices on disk hostdisk//dev/sda.
/usr/sbin/grub-install: info: scanning hostdisk//dev/sda for LDM.
/usr/sbin/grub-install: info: no LDM signature found.
/usr/sbin/grub-install: info: Scanning for lvm devices on disk hostdisk//dev/sda.
/usr/sbin/grub-install: info: no LVM signature found.
/usr/sbin/grub-install: info: Scanning for DISKFILTER devices on disk hostdisk//dev/sda.
/usr/sbin/grub-install: info: Scanning for DISKFILTER devices on disk hostdisk//dev/sda.
/usr/sbin/grub-install: info: Scanning for DISKFILTER devices on disk hostdisk//dev/sda.
/usr/sbin/grub-install: info: Partition 0 starts from 2048.
/usr/sbin/grub-install: info: /dev/md0 is not present.
/usr/sbin/grub-install: info: guessed root_dev `mduuid/e32ca389b324e560ebebd6533f5ad92c' from dir `/boot/grub/i386-pc'.
/usr/sbin/grub-install: info: setting the root device to `mduuid/e32ca389b324e560ebebd6533f5ad92c'.
/usr/sbin/grub-install: info: saving <1,0,512>.
.....
/usr/sbin/grub-install: info: saving <118,0,512>.
Installation finished. No error reported.

udev

.....
/usr/sbin/grub-install: info: drive = -1.
/usr/sbin/grub-install: error: disk `md0' not found.
Остальное в verbose одинаковое(там длинная портянка).

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

Разница в выводе strace для cron и udev:
от cron

.....
read(4, "MD_LEVEL=raid1\nMD_DEVICES=2\nMD_M"..., 4096) = 167
.....
после определённого момента:
write(2, "Couldn't find physical volume `("..., 84Couldn't find physical volume `(null)'. Some modules may be missing from core image.) = 84
дорабатывает успешно

udev

.....
unlink("/boot/grub/i386-pc/boot.img")   = 0
unlink("/boot/grub/i386-pc/core.img")   = 0
.....
после того же момента:
write(2, "disk `md0' not found", 20disk `md0' not found)    = 20
write(2, ".\n", 2.
)                      = 2
стоп

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

Если не сложно, выложите strace куда-нибудь на pastebin, хочу сам посмотреть. И, strace, желательно, с ключём ″-v″, чтобы были видны переменные окружения и т.д.

mky ★★★★★
()
Ответ на: комментарий от mky
#!/bin/bash

PATH=/usr/sbin:/usr/bin:/sbin:/bin
export $PATH
DISK=$1
#DHOST=$2
log_file="/usr/local/scripts/grub.log"
strace -v /usr/sbin/grub-install --recheck $DISK >> $log_file 2>&1
echo "***********************">> $log_file
#проверяем, установился ли...
dd if=$DISK of=/usr/local/scripts/file bs=512 count=1

выполнение cron'ом
выполнение udev'ом

S_Paul ★★★★★
() автор топика
Последнее исправление: S_Paul (всего исправлений: 1)
Ответ на: комментарий от S_Paul

Извеняюсь за долгий ответ. Пока поглядел мельком, непонятна конструкция:

export $PATH
Опечатка при копи-пасте, или вы в скрипте действительно пытаетесь сделать ″export /usr/sbin:/usr/bin:/sbin:/bin″? Да и переменной PATH в случае запуска из-под udev в выводе strace нету.

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

Вот разница:

stat(«/dev/md0», {st_dev=makedev(0, 5), st_ino=22532, st_mode=S_IFBLK|0660, st_nlink=1, st_uid=0, st_gid=6, st_blksize=4096, st_blocks=0, st_rdev=makedev(9, 0), st_atime=2015/09/28-15:34:49, st_mtime=2015/09/22-18:00:22, st_ctime=2015/09/22-18:00:22}) = 0
stat(«/dev/md0», {st_dev=makedev(0, 5), st_ino=22532, st_mode=S_IFBLK|0660, st_nlink=1, st_uid=0, st_gid=6, st_blksize=4096, st_blocks=0, st_rdev=makedev(9, 0), st_atime=2015/09/28-15:34:49, st_mtime=2015/09/22-18:00:22, st_ctime=2015/09/22-18:00:22}) = 0
pipe([4, 5])                            = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f6abdb4aad0) = 24687
close(5)                                = 0
fcntl(4, F_GETFL)                       = 0 (flags O_RDONLY)
fstat(4, {st_dev=makedev(0, 8), st_ino=2695835, st_mode=S_IFIFO|0600, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=0, st_size=0, st_atime=2015/09/29-10:10:02, st_mtime=2015/09/29-10:10:02, st_ctime=2015/09/29-10:10:02}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f6abdb50000
lseek(4, 0, SEEK_CUR)                   = -1 ESPIPE (Illegal seek)
read(4, «MD_LEVEL=raid1\nMD_DEVICES=2\nMD_M»..., 4096) = 167
read(4, "", 4096)                       = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=24687, si_uid=0, si_status=0, si_utime=0, si_stime=0} ---
close(4)                                = 0
wait4(24687, NULL, 0, NULL)             = 24687
и
stat(«/dev/md0», {st_dev=makedev(0, 5), st_ino=22532, st_mode=S_IFBLK|0660, st_nlink=1, st_uid=0, st_gid=6, st_blksize=4096, st_blocks=0, st_rdev=makedev(9, 0), st_atime=2015/09/28-15:34:49, st_mtime=2015/09/22-18:00:22, st_ctime=2015/09/22-18:00:22}) = 0
pipe([4, 5])                            = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f58f83e7ad0) = 26466
close(5)                                = 0
fcntl(4, F_GETFL)                       = 0 (flags O_RDONLY)
fstat(4, {st_dev=makedev(0, 8), st_ino=3043144, st_mode=S_IFIFO|0600, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=0, st_size=0, st_atime=2015/09/29-10:13:35, st_mtime=2015/09/29-10:13:35, st_ctime=2015/09/29-10:13:35}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f58f83f4000
lseek(4, 0, SEEK_CUR)                   = -1 ESPIPE (Illegal seek)
read(4, "", 4096)                       = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=26466, si_uid=0, si_status=127, si_utime=0, si_stime=0} ---
close(4)                                = 0
wait4(26466, NULL, 0, NULL)             = 26466

Здесь происходит порождение потока (clone()), который в одном случае возвращет ″MD_LEVEL=raid1\nMD_DEVICES=2\nMD_M...″ и завершается с кодом 0, в другом случае ничего не возвращает и завершается с кодом 127. Видимо, потомок пытается выполнить какую-то команду и не находит её в случае с udev. Нужно определить $PATH, для интереса можно дать ″strace″ опцию ″-f″ и тогда будет видно, что именно пытается сделать потомок.

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

Без добавления экспорта соей $PATH при запуске от крона переменные были /usr/local..., наверное потому, что скрипт там лежит.

При запуске от udev она была на месте(эхой выводил).

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

лог выполнения «strace -f grub-install /dev/sdx» cron'ом
лог выполнения «strace -f grub-install /dev/sdx» udev'ом
(извиняюсь за webfile, pastebin заглючил)

вывел переменные окружения

#!/bin/bash

PATH=/usr/sbin:/usr/bin:/sbin:/bin

DISK=$1
DHOST=$2
LANG=ru_RU.UTF8
HOME=/root
USER=root
PWD=/root
SHELL=/bin/sh
log_file="/usr/local/scripts/grub.log"
/usr/sbin/grub-install --recheck $DISK >> $log_file 2>&1
echo >>$log_file
echo "\$PATH:">> $log_file
echo $PATH >> $log_file
echo >>$log_file
echo "\$set:">> $log_file
set >> $log_file
echo >>$log_file
echo "\$env:">> $log_file
env >> $log_file
переменные окружения с cron'ом
переменные окружения с udev'ом

S_Paul ★★★★★
() автор топика
Последнее исправление: S_Paul (всего исправлений: 1)
Ответ на: комментарий от S_Paul

Попробуй через 'env -i' скрипт запускать.

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

Если так понятнее, то нужно было:

export PATH
И можно, по вкусу, ″export″ остальных переменных. Но, именно ″export ИМЯ_ПЕРЕМЕННОЙ″, а не ″export ЗНАЧЕНИЕ_ПЕРЕМЕННОЙ″.

Нужно смотреть именно переменные среды при запуске приложения (″strace -v -f″), а не те, что есть в скрипте. Или в скрипте давать команду export >> $log_file (без параметров), тогда тоже будут только экспортируемые переменные. В данном трейсе из-под udev видно, что ″grub-install″ пытается запустить ″mdadm″, но не может его найти (ищет только в /bin и /usr/bin).

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

Это и подозревал - что-то с переменными окружения и связанная с этим неспособность найти нужное.
Про экспорт - спасибо, баш-привычка.
Перепроверю всё.(надеюсь сегодня)

S_Paul ★★★★★
() автор топика
Последнее исправление: S_Paul (всего исправлений: 1)
Ответ на: комментарий от mky

Спасибо тебе, добрый человек. «export PATH» хватило для того, чтобы всё заработало. Допишу недостающее и выложу тут ссылки на скрипты.

S_Paul ★★★★★
() автор топика
Последнее исправление: S_Paul (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.