2015年02月23日

Macbook AirでUbuntuをEFIのみで起動する

Macbook Air 5.1(mid 2012)をLinuxだけで運用しようとしていろいろと苦労した。MacbookはファームウェアとしてBIOSではなくEFIを使っているため、そのままLinuxをクリーンインストールしてもMacがそれを認識することはない。rEFIt(rEFInd)を使って認識させるのが最も簡単だが、Mac OS Xをすでに削除していた場合Linux上でのインストールとなる。それではrEFIt(rEFInd)をうまくインストールができないこともあり、またDebianでは非常に起動まで時間がかかった。結局DebianがThunderbolt Ethernetを認識しなかったためUbuntuを使うことにする。

UbuntuをMacbook Airでシングルブートする場合、おおまかに3つの方法があるようだ。一つはrEFIt(rEFInd)を使う方法だが、すでにMac OS Xを削除しており、また起動に時間がかかるだろうことからこの方法は使わない。もう一つはUbuntuの公式サイトで配布されている+Macバリアントを使う方法。これはEFIではなくLegacy BIOSを使うことでUbuntuを起動する。最後にEFIだけでUbuntuを起動する方法だ。この方法が最も起動が速く、またEFI関連のユーティリティやブートローダーのカスタマイズも可能とするため、EFIだけでの起動を選択した。実行する前には必ず重要なファイルのバックアップをとる。

Macbook AirにUbuntuのインストールUSBを挿入して、optionキーからの起動メニューでEFI bootを選択する。Ubuntuのインストーラーが起動したら、そこからインストールする(インストールUSBは他のパソコンなどで作成しておく)。インストール中のパーティショニングの際、BIOS Legacy bootやbios-grubではなくEFIbootのパーティションがあることを確認すること。インストールが終了したら再起動されるが、もしMac OS Xをすでに削除していた場合、何も起動されない。一度強制終了し、その後またインストールUSBを入れてUbuntuのインストーラーを起動する。インストーラーの一番はじめのGNU GRUBメニューで、cキーを使ってGRUBコンソールを出す。

まずbootパーティションを見つけるために、lsコマンドを使ってディスクを調べる。おおよそ下記のような結果が表示される。
grub> ls
(memdisk) (hd0) (hd0,msdos) (hd1) (hd2) (hd2,gpt3) (hd2,gpt2) (hd2,gpt1)

さらにlsコマンドを使って、homeディレクトリを探す。(hd1,gpt2)か(hd2,gpt2)にある場合が多い。
grub> ls (hd1,gpt2)/home
/userName

さらに/boot/grubディレクトリを探す。
grub> ls (hd1,gpt2)/boot/grub
unicode.pf2 [...] grub.cfg

見つけたらそれをrootに設定する。
grub> set root=(hd1,gpt2)


次にgrubコンソールからUbuntuを起動する。
grub> ls -l (hd1,gpt2)
Partition hd2,gpt2: Filesystem type ext* 〈...snip...〉 UUID e86c20b9-83e1-447d-a3be-d1ddaad6c4c6 - Partition start at [...]

UUIDを使ってUbuntuを起動する。
grub> linux /boot/vmlinuz〈...tabキー...〉.efi.signed root=UUID=〈上記のUUID〉
grub> initrd /boot/initrd〈...tabキー...〉
grub> boot


Ubuntuが起動したら、EFIパーティションから起動できるように設定する。端末を開いて、まずは必要なレポジトリを追加する。
$ sudo add-apt-repository ppa:detly/mactel-utils
[...]
Utilities for Intel based Macs (eg. recent MacBooks, Mac Minis). Includes a
fan control (macfanctld) and the HFS "bless" utility.
More info: https://launchpad.net/~detly/+archive/ubuntu/mactel-utils
Press [ENTER] to continue or ctrl-c to cancel adding it

必要なアプリケーションをインストールする。
$ sudo apt-get update
$ sudo apt-get install mactel-boot hfsprogs gdisk grub-efi-amd64

mountコマンドでEFIパーティションがきちんとあるか確認する(/boot/efi)。
$ mount
[...]
/dev/sda1 on /boot/efi type vfat (rw)
[...]

/boot/efiの場所を確認したら(この場合は/dev/sda1)、それをアンマウントする。
$ sudo umount /dev/sda1

VFATでフォーマットされたEFIパーティションをHFS+パーティションに書き換える。
sudo gdisk /dev/sda
GPT fdisk (gdisk) version 0.8.8

Partition table scan:
MBR: hybrid
BSD: not present
APM: not present
GPT: present

Found valid GPT with hybrid MBR; using GPT.

Command (? for help):

pでEFIパーティション(EF00)が一番(dev/sda1)であることを確認する。
Command (? for help): p
Disk /dev/sda: 976773168 sectors, 465.8 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 717BD65E-A514-4FD9-A4A7-1BE01C2F31E0
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 976773134
Partitions will be aligned on 2048-sector boundaries
Total free space is 4077 sectors (2.0 MiB)

Number Start (sector) End (sector) Size Code Name
1 2048 194559 94.0 MiB EF00
2 194560 968574975 461.8 GiB 8300
3 968574976 976771071 3.9 GiB 8200

実際にVFATパーティションを削除してHFS+パーティションを作成する(First sectorとLast sectorはそのままEnterキーを押し、GUIDにはAF00を入力する)。dで削除、nで作成、wで実際に実行する。
Command (? for help): d
Partition number (1-3): 1

Command (? for help): n
Partition number (1-128, default 1): 1
First sector (34-976773134, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-194559, default = 194559) or {+-}size{KMGTP}:
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): AF00
Changed type of partition to 'Apple HFS/HFS+'

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): Y
OK; writing new GUID partition table (GPT) to /dev/sda.
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
The operation has completed successfully.

作成されたフォーマットされていないHFS+パーティションをフォーマットする。
$ sudo mkfs.hfsplus /dev/sda1 -v Ubuntu
Initialized /dev/sda1 as a 94 MB HFS Plus volume

UbuntuはUUIDでマウントするディスクを認識するため、/etc/fstabをアップデートする。
$ sudoedit /etc/fstab

/etc/fstabをnanoで開き、ctrl+kで/boot/efiに関連する下の二行を削除する。
# /boot/efi was on /dev/sda1 during installation
UUID=C59D-1B30 /boot/efi vfat defaults 0 1

必要なエントリを追加する。
$ sudo bash -c 'echo $(blkid -o export -s UUID /dev/sda1) /boot/efi auto defaults 0 0 >> /etc/fstab'

再び/boot/efiをマウントできるか試す。できなければfstabのエントリが間違っている。
$ sudo mount /boot/efi

新しくフォーマットされたHFS+パーティションのためにGRUBを再インストールする。
$ sudo mkdir -p "/boot/efi/EFI/$(lsb_release -ds)/"
$ sudo bash -c 'echo "This file is required for booting" > "/boot/efi/EFI/$(lsb_release -ds)/mach_kernel"'
$ sudo bash -c 'echo "This file is required for booting" > /boot/efi/mach_kernel'
$ sudo grub-install --target x86_64-efi --boot-directory=/boot --efi-directory=/boot/efi --bootloader-id="$(lsb_release -ds)"

最後にMacのブートローダーが認識するようにblessする。
$ sudo hfs-bless "/boot/efi/EFI/$(lsb_release -ds)/System/Library/CoreServices/boot.efi"

これでUbuntuが起動するようになる。

しかしまだ起動は遅いままなので(グレイスクリーンで一定時間停止する)、それを改善する。そのためにefibootmgrをいじる。
$ sudo efibootmgr
BootCurrent: 0000
Timeout: 5 seconds
BootOrder: 0080
Boot0000* ubuntu
Boot0001* Ubuntu 14.04.1 LTS
Boot0080* Mac OS X
BootFFFF*

タイムアウトまでの時間をなくす。
$ sudo efibootmgr -t 0

いらないエントリを削除する(Boot0001* Ubuntu 14.04.1 LTS以外は必要ない)。
$ sudo efibootmgr -b 0000 -B
$ sudo efibootmgr -b 0080 -B

Boot0001* Ubuntu 14.04.1 LTSをデフォルトのエントリに設定する。
$ sudo efibootmgr -o 0001


ついでにブートローダーでのUbuntuのディスクのアイコンを変更する。
$ sudo apt-get install mactel-boot-logo
$ sudo cp /usr/share/mactel-boot-logo/ubuntu.icns /boot/efi/.VolumeIcon.icns


これでMacbook AirでもUbuntuがEFIのみで起動できる。

参考にした記事
Ubuntu + Mac: Pure EFI Boot
http://heeris.id.au/2014/ubuntu-plus-mac-pure-efi-boot/#fixing-efi (7th Sep 2014)


posted by okilt at 21:36| Linux | 更新情報をチェックする
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。