Ubuntu の grub で initramfs を使用して Arch Linux を起動するにはどうすればよいでしょうか?

Ubuntu の grub で initramfs を使用して Arch Linux を起動するにはどうすればよいでしょうか?

私には 2 つのハード ドライブがあり、それぞれに対応する 2 つの Grub があります。1 つは Arch Linux のもので、もう 1 つは Ubuntu のものです。Arch の grub を使用すると、どちらのディストリビューションでも起動できます。しかし、Ubuntu の grub を使用すると、Arch と Ubuntu の両方が表示されますが、Arch を起動することはできません。次のエラーが発生します。

Kernel offset
End kernel panic. Not syncing: VFS.
Unable to mount root fs on unknown-block.

両方のディストリビューションを比較しましたgrub.cfg。Ubuntu の grub では、次の行を含む Arch のエントリを確認できます。

initrd /boot/intel-ucode.img

Arch に倣って変更しましたgrub.cfg:

initrd /boot/intel-ucode.img /boot/initramfs-linux.img

これで、Ubuntu の grub から Arch を起動できるようになりました。Ubuntu はデフォルトでこの必須オプションを追加していないようです。Ubuntu に正しいエントリを自動的に作成させるにはどうすればよいですか?

編集

Arch の grub を で更新しています。Ubuntu では、と上記の raw コマンド (エイリアス化されています) のgrub-mkconfig -o /boot/grub/grub.cfg両方を試しました。update-grub

編集2

コメントされていない行/etc/default/grub

GRUB_DEFAULT="saved"
GRUB_SAVEDEFAULT="true"
GRUB_HIDDEN_TIMEOUT_QUIET="true"
GRUB_TIMEOUT="3"
GRUB_DISTRIBUTOR="`lsb_release -i -s 2> /dev/null || echo Debian`"
GRUB_CMDLINE_LINUX_DEFAULT=""
GRUB_CMDLINE_LINUX=""

答え1

実際、この問題を解決するには 2 つのファイルを変更する必要があります。私はこれを Lubuntu 16.04.1 と Manjaro Linux でテストしました。

Ubuntuの場合:

1) ファイルマウントされたLinuxブートプローブ40grub2 parse_grub_menu関数は、すべてのinitrdパラメータを処理できません。'... initrd のケース「$1」)':

a) 割り当てを削除する

initrd="$(echo "$2" ...)"

b) 削除した行の代わりに 2 行を追加します。

shift 1
initrd="$(echo "$@" | sed 's/(.*)//')"

2) ファイル/etc/grub.d/30_os-prober for ループ内で LINITRD の割り当てを修正します。

for LINUX in ${LINUXPROBED}; do
...
    LINITRD="`echo ${LINUX} | cut -d ':' -f 5 | tr '^' ' '`"

最初の修正では、Manjaro で利用可能なすべての initrd 情報が考慮されます。2 番目の修正では、一部の '^' 文字をスペースに変更して、生成された initrd 行をクリーンアップします。

答え2

私は Manjaro と Arch を実行していますが、皮肉なことに、Manjaro は Ubuntu と同様の間違いを犯します。そのため、30_os_prober の次のパッチがまだ誰かの役に立つかもしれません。

後:

LINITRD="`echo ${LINUX} | cut -d ':' -f 5 | tr '^' ' '`"

追加:

if [ "${OS}" = "Arch Linux" ] ; then
  LINITRD="/boot/intel-ucode.img ${LINITRD}"
fi

答え3

ファイルを編集して実行した後、動作しましたgrub.cfg:

sudo update-grub
sudo grub.mkconfig

関連情報