grub2-install не работает в первый раз, но работает второй раз

Это странно …

Я работаю над некоторым программным обеспечением. У этого есть функция, чтобы сделать USB-устройство загрузочным. Он делает это, выполняя длинную сложную последовательность действий, чтобы скопировать минимальную ОС Linux на устройство, а затем установить GRUB2 в качестве загрузчика. Проблема в том, что в конце этой процедуры устройство не загрузится. GRUB2 загружается, но падает в спасательную оболочку и визжит, что он не может найти [независимо от UUID загрузочного раздела в настоящее время]. UUID это скулящий, определенно правильный.

Фактическая команда, в которой работает мое программное обеспечение, такова:

grub2-install --boot-directory=/mnt/boot /dev/sdb 

Команда выходит с кодом 0 и говорит, что «stdout« завершена установка, никаких сообщений об ошибках ». И все же GRUB не загружается.

Вот мучительно странная часть: если я вручную набираю точную команду выше, то устройство становится загрузочным. Все работает отлично. Но когда программное обеспечение запускает эту команду автоматически, что-то идет не так … Какого черта ???

Кто-нибудь имеет туманную идею, почему такое поведение может возникнуть? Существуют ли переменные среды, от которых зависит сценарий установки? Какие модификации диска нарушили бы GRUB? Есть ли способ увидеть, что изменилось во второй раз, когда я запускаю скрипт?

Изменить: OpenSUSE 12.2, все работает как root . (Может ли любой другой пользователь даже разрешать играть в MBR на диске?)

Edit: env возвращает почти одинаковые результаты как из программного обеспечения, так и из терминала. (Несколько переменных, таких как PWD , SHLVL , WINDOWID были разными, но я не вижу, насколько это важно.)

Edit: Я попробовал, чтобы мое программное обеспечение просто запускало команду дважды. Это не имело никакого значения. Так что это действительно какая-то разница в окружающей среде …

А-ХА!

Приложение монтирует файловую систему несколько иначе, чем то, как я делаю это в командной строке.

В командной строке я делаю

 mount /dev/sdb12 /mnt 

Но приложение использует свистящую систему, которая анализирует таблицу разделов, а затем делает что-то вроде

 mount /dev/sdb /mnt -rw -o offset=32784,limit=8598543 

Очевидно, grub2-install имеет недокументированную опцию grub2-install . Если я запустил установку из приложения и из командной строки с помощью этого переключателя и diff вывод, я вижу, что из приложения он говорит о /dev/loop0 а не /dev/sdb . Также подозрительной является строка, которая читает

 < + modules=' biosdisk fat ' --- > + modules=' biosdisk fat part_gpt ' 

Учитывая, что диск разделен на GPT, я ожидал бы, что этот модуль будет необходим.

Похоже, что установка файловой системы в этом маннаре каким-то образом путает сценарий. Теперь, чтобы узнать, могу ли я исправить это или нет …