Gentoo Install Log 2014年1月
面白いことないかなーって探してましたがGentooにいろんな意味でハマったのでよかったです。
Gentoo入れよう2014年1月版
問題
時間の無い人向けに先にハマりポイント
- まず、LiveCDとか、USB stickとかはケチらずに用意しておいたほうがいい。手元に無いからといって、最初からLiveUSB作ったりすると余計に時間がかかる。どっちも100均で売ってる。
- systemd
- UEFI+GPT
- モダンな方法は、マザーボードのUEFIに各OSのブートローダを登録して管理してもらうやり方。MBRのブートローダ —-> 各OSのブートローダ というチェーンロードは、UEFI+GPTの今となっては古いらしい。
- 問題1. http://hrn25.sakura.ne.jp/win/w8-fedora/w8-fedora.html のように、GentooパーティションのPBRにGRUB2のインストールを行い、Windows8のGrub4dosからチェーンロードしようとした。しかしGRUBをロードしようとした瞬間にエラー0xc000007b (\grldr.mbrが見つからないか壊れている) が出る。この辺は http://orumin.blogspot.jp/2013/01/grubefi.html に詳しい。そもそもGPTはチェーンロードの概念が不要になっている。GPTで、"PBRにGRUB2のインストール”はそもそもできてない? (未確認)。
- 解決1. Windows8が先に作っているEFI System Partition(vfat)にgrubをインストールすればよい。この領域はWindows用というわけではなく、UEFI+GPT環境でグローバルに機能するものである。
- 問題2. UEFIへのブートローダ登録処理を行うOSは、UEFIモードで起動する必要があるが、GentooのLiveCDは従来のBIOSブートなのでできない。
- 解決2. トリッキーな方法であるが、インストール後再起動の前に、UEFIモード起動が出来るUSBメモリを作っておき、そちらから一度ブートし、UEFIへのブートローダ登録コマンドを叩く。そのUSBメモリ作成においてもGRUB2ではEFIブート後でないといけない。仕方ないのでUSBメモリにはEFI stub kernelを投入する。// フロッピー + MBRの時代に戻ったかのようで懐かしい
追記
解決2' 別の方法をoruminさんからコメント欄で教えて頂きました。
UEFI+GPTの問題2の解決方法について、もうひとつあるので紹介を。
grub2-installを実行時に-fオプションを付け、ひとまずブートローダが登録されないことは無視します。
そして、/boot/efi/EFI//grubx64.efiを
/boot/efi/EFI/BOOT/bootx64.efi (32bitならboot.efi)へリネーム&コピー。
このbootx64.efiは、UEFIに登録されたブートローダがないとフォールバックモードで自動に読み込むものです。
(場合によっては、起動デバイスでHDDを指定するとこのフォールバックのローダーを読みます)そしてフォールバックのローダーでUEFIモードで起動できるはずなので、そこからefibootmgrをつかうなりgrub2-installをもう一度やりなおすなりをすれば解決します。
以下に、私の行った具体的なコマンドを記録する。
パーティション構成
(*)印は既存のパーティション
[GPT]
sda1 (*) Windows回復
sda2 (*) EFI System Partition(Windowsが自動的に作成)
sda3 (*) Windows予約済み
sda4 (*) Windows 8
sda5 linux-swap
sda6 /
sda7 lvmで管理 { /home, /usr, /var, /opt }
(/bootの役割はEFI System Partitionが担っていると考え、あえて作成しない)
UEFI設定
なぜかEFI System Partitionに登録されているプログラム以外、例えばCDROMとかUSBとかをUEFIで認識しなくなっていた。UEFIの設定(マザーボードはMSI A75MA-G55)でRestore Defaultsしたら直った。原因不明。
Install
boot: gentoo dolvm
ifconfigするとインターフェイス名がeth0ではなくenp2s0になっているが問題ない。
# ifconfig enp2s0 x.x.x.x netmask 255.255.255.0 # route add default gw x.x.x.x # /etc/init.d/dhcpcd stop # echo "nameserver x.x.x.x” >> /etc/resolve.conf # parted /dev/sda (parted) mkpart (以降、対話的にパーティション作成)
sda5 linux-swap
sda6 ext4
sda7 ファイルシステム指定無し。lvmフラグを立てる((parted) set 7 lvm on)
# mkswap /dev/sda5 # swapon /dev/sda5 # mkfs.ext4 /dev/sda6 # pvcreate /dev/sda7 # vgchange -a y # vgcreate vg /dev/sda7 # lvcreate -L100G -nusr vg # lvcreate -L100G -nvar vg # lvcreate -L100G -nopt vg # lvcreate -L100G -nhome vg # mkfs.ext4 /dev/vg/usr # mkfs.ext4 /dev/vg/var # mkfs.ext4 /dev/vg/opt # mkfs.ext4 /dev/vg/home # mount /dev/sda6 /mnt/gentoo # mkdir /mnt/gentoo/usr # mkdir /mnt/gentoo/opt # mkdir /mnt/gentoo/var # mkdir /mnt/gentoo/home # mount /dev/vg/usr /mnt/gentoo/usr # mount /dev/vg/opt /mnt/gentoo/opt # mount /dev/vg/var /mnt/gentoo/var # mount /dev/vg/home /mnt/gentoo/home # cd /mnt/gentoo # links http://www.gentoo.org/main/en/mirrors.xml (stage3-amd64-20140115.tar.bz2をダウンロード) # tar xvjpf stage3-*.tar.bz2
# nano /mnt/gentoo/etc/portage/make.conf ------------------------------------------------------ CFLAGS=“-march=native -02 -pipe -fromit-frame-pointer” MAKEOPTS=“-j2” ------------------------------------------------------
# mirrorselect -i -o >> /mnt/gentoo/etc/portage/make.conf # mirrorselect -i -r -o >> /mnt/gentoo/etc/portage/make.conf # cp -L /etc/resolv.conf /mnt/gentoo/etc/ # mount -t proc proc /mnt/gentoo/proc # mount —-rbind /sys /mnt/gentoo/sys # mount —-rbind /dev /mnt/gentoo/dev # chroot /mnt/gentoo /bin/bash # source /etc/profile # export PS1=“(chroot) $PS1” # emerge-webrsync # echo “Asia/Tokyo” > /etc/timezone # emerge --config sys-libs/timezone-data # echo “ja_JP.UTF-8 UTF-8” >> /etc/locale.gen # locale-gen # eselect locale set 1 #Cにした # env-update && source /etc/profile # emerge gentoo-sources # cd /usr/src/linux # make menuconfig
- https://www.gentoo.org/doc/en/handbook/handbook-amd64.xml?part=1&chap=7
- https://wiki.gentoo.org/wiki/Systemd
- https://wiki.gentoo.org/wiki/LVM
- cp437を組み込まないと後にEFI System PartitionのFAT32をマウントできないので組み込んでおく。
- CONFIG_NLS_CODEPAGE_437=y
- CONFIG_NLS_ISO8859_1=y
# make -j5 && make modules_install
https://wiki.gentoo.org/wiki/Initramfs/HOWTO
# emerge genkernel-next # genkernel —-udev --lvm --no-ramdisk-modules initramfs # mv /boot/initramfs-* /boot/initrd-3.10.25-gentoo.img # cp arch/x86_64/boot/bzImage /boot/kernel-3.10.25-gentoo (grub2-mkconfigに見つけてもらえるようなファイル名にする。)
- fstabの編集について
-
- # blkid /dev/sda5 >> /etc/fstabなどとして、マウントしたいデバイスのUUIDを集め、fstabにはUUIDで指定するのが安全。読み込んだ順にsdxは変わってしまう。また、この状態でgenkernel initramfsしたとき、/dev/vg/usr -> ../dm-0(存在しない)になっていたので。
# nano /etc/fstab -------------------------------------- UUID=*** none swap sw 0 0 UUID=*** / ext4 noatime 0 1 UUID=*** /usr ext4 noatime 0 2 UUID=*** /var ext4 noatime 0 2 UUID=*** /opt ext4 noatime 0 2 UUID=*** /home ext4 noatime 0 2 /dev/cdrom /mnt/cdrom auto noauto 0 0 -------------------------------------
# nano /etc/conf.d/net ---------------------------------------------------- config_enp2s0="x.x.x.x netmask 255.255.255.0" routes_enp2s0="default via x.x.x.x" ----------------------------------------------------
# cd /etc/init.d # ln -s net.lo net.enp2s0 # rc-update add net.enp2s0 default # passwd
# nano /etc/conf.d/keymaps -------------- keymap="jp106" ~-------------
# nano /etc/conf.d/hwclock ------------- clock="local" -------------
# emerge syslog-ng # rc-update add syslog-ng default # emerge mlocate
今回の本番環境ではGRUBをEFIブートファイルにするつもりだが、ここでgrub2-installを行なっても、EFIインストールはできない。LiveCD自体がEFIブートしていないと、EFIモードにならないらしい。よって、USBメモリに別のEFIブートファイルを入れておき、そこからLinuxを起動し直す。これには、EFI stub kernelというカーネルコンフィグが役に立つ。これはLinuxカーネル自体をEFIブートファイルにできる仕組みだ。
http://wiki.gentoo.org/wiki/EFI_stub_kernel
# make menuconfig EFI=y ->EFI_STUB=y CMDLINE="root=/dev/sda6 dolvm rootfstype=ext4 initrd=/efi/boot/initramfs.img" # make -j5
デバイスファイル(/dev/sd*)はtail -f /var/log/messagesでUSBメモリを抜き差ししてみて特定する
http://wiki.gentoo.org/wiki/UEFI_Gentoo_Quick_Install_Guide
https://wiki.archlinux.org/index.php/GRUB#UEFI_systems_2
LiveCD# parted /dev/sdc (parted) mklabel gpt (parted) mkpart esi fat32 0% 500m (parted) set 1 boot on (parted) q LiveCD# mkfs.vfat -F 32 /dev/sdc1 # mkdir /mnt/tmp # mount /dev/sdc1 /mnt/tmp # mkdir -p /mnt/tmp/efi/boot # cp arch/x86_64/boot/bzImage /mnt/tmp/efi/boot/bootx64.efi # umount /mnt/tmp # exit LiveCD# umount -l /mnt/gentoo/dev/{/shm,/pts,} LiveCD# umount -l /mnt/gentoo/pts LiveCD# umount /mnt/gentoo{/usr,/opt,/var,/home} LiveCD# vgcahnge -a n LiveCD# umount /mnt/gentoo LiveCD# reboot
UEFIブート選択でUEFI: USB Stickを選ぶと立ち上がる
(再びchroot) # vgchange -a y # GRUB_PLATFORMS="efi-64" emerge sys-boot/grub # mkdir /boot/efi # mount /dev/sda2 /boot/efi # grub2-install --target=x86_64-efi --efi-direcotry=/boot/efi --bootloader-id=Gentoo # grub2-mkconfig -o /boot/grub/grub.cfg Found initrd imageと出ない場合はファイル名を変える: http://forums.gentoo.org/viewtopic-p-7125364.html # rc-update add lvm boot # nano /etc/lvm/lvm.conf ------------------------------------ filter = ["a|dev/sd[ab]|", "r/.*/" ] ------------------------------------
もう一度rebootしてGentooがブート選択に現れているのを確かめる。
systemdの導入をする
# emerge -C sys-fs/udev # USE=“-systemd” emerge sys-apps/dbus # eselect profile list # eselect profile set 5 #desktop/gnome/systemd # emerge sys-apps/systemd # emerge --update --deep --newuse --with-bdeps=y @world # emerge --depclean # /etc/init.d/dbus start # /usr/lib/systemd/systemd-localed & # /usr/lib/systemd/systemd-timedated & # /usr/lib/systemd/systemd-hostnamed & # hostnamectl set-hostname <HOSTNAME> # emerge Networkmanger # localectl set-keymap jp106 # localectl set-x11-keymap jp106 # genkernel —-udev --lvm initramfs # nano /etc/default/grub パラメータに real_init=/usr/lib/systemd/systemd dolvmを追加 # grub2-mkconfig -o /boot/grub/grub.cfg # reboot