この記事は Mac OSX の Advend カレンダーにあわせて書きました
macOS Advent Calendar 2016 - Qiita
OSX がどんどん劣化している。。。
OSXが macOS なんていう文化の香りがしない名称に変えられ、MacbookProにOLED touch barという、キーボードユーザーを馬鹿にしている商品が発売されようとしていて、MacBookの先行きに暗雲が立ち込めてきました。
Yosemiteでは、AppStore以外のアプリがKeychainsを使えなくなりました。 そのためChrome.app などがKeychainsを捨てるという結果を招きました。 Sierra では、ついに非署名pkg のインストーラーを起動できなくなってしまいました。 古い更新されてないドライバどうするんだよ。。。 どんどん不自由になる現実。そろそろ見切ってもいいんじゃないか。
ubuntu が起動するUSBメモリを作って移行に備える。
OSXが自縄自縛になる来るべきX-DAY。その前に、逃げる準備だけはしておこう。
Debian/GNU Linuxでもよかったのですが、ドライバなどスパッと解決しそうなUbuntuにしました。
方針
今回は次の方針で、インストールと起動をしようと思います。
- 内蔵SSDは手を付けない。
- USB ドライブを用意する
- USB ドライブを
EFIパーティション
にする
USBドライブのSSDにgdisk で efi 領域を作り、EFIブートするディスクを作り、EFIの起動マネージャーからUbuntuを起動する。mac は外部USBドライブから起動するので、EFIの領域からブート。
そして、普段はUSBドライブをVirtualBoxから起動して仮想マシンのUbuntuとして使うのである。
これで、仮想マシンで起動しつつ、メインとして起動できるBootCamp的な動作するUSBメモリが作れる。
GPTとBIOSが両方起動するUSBドライブを作る。
USBのドライブにOSを入れてUSBから起動したい。
本体のSSD/HDD領域には一切手を加えずに、USBドライブで完結するOS環境を一式を作ることにします。
これが出来るのがGPTです。GUIDのパーティションテーブルを格納して、そこから起動すると実現できます。
macbook はEFIブート
Macbook は GPTを使ったEFIブートを利用しています。BIOSのbootable フラグを使ったMBRの起動とは別の仕組みが動いています。
BIOSブートの仕組み
まずはじめに、BIOSを軽く見直しておきます。
BIOSブートと呼ばれるのは 、MBRの方式のパーティションテーブルを使うものです。
パーティションには、プライマリ・拡張パーティションがあります。。
プライマリパーティションは4つ 4つのうち一つを拡張パーティションにすることで、4つ以上のパーティションを実現できる。
このプライマリ・パーティションにブートフラグ(bootable flag)を設定し、ブート可能であることを明示しています。
ブートフラグをつけたパーティションに、ブートローダをインストールし、ブートローダーが各パーティションからOSを起動します。
BIOS → MBR → ブート可能パーティション → ブートローダー → OS起動。
EFI ブートの仕組み
ディスクをGPTにする。
ディスクににEFI領域を用意する。
EFI領域にブートイメージとブートディスク設定を用意する
EFI 起動すると、EFI領域から該当データを読み込んで、ブートマネージャが起動する
EFI領域はパーティションになります。EFIパーティションを用意するのがすべての開始点になります。
EFI パーティションにつて
EFIは、vfat ( fat32 ) のパーティションです。
EFI起動は fat32 のパーティションをマウントして、その中の /EFI ディレクトリから、ブートローダーを探して、起動します。
EFI → EFIパーティション → ブートローダー → OS起動。
ブートローダーは、インストールされている全てのパーティションの全てのOSを知らなくても良くなっている便利。
MacBook は EFI
Macでは起動ディスク選ぶ画面、あれがMacのブートローダ。
USBを差し込んだときは、USBのEFIが優先されるらしい。
EFI ブートするまでの手順
- インストールのOSのCDを準備
- USB メモリを準備する
- USB メモリをGPTにする
- GPTディスクのパーティション分割する
- USB メモリにEFIパーティションを作る
- 仮想マシン( Virtual Box ) の準備
- USB メモリにOSをインストール
- USB メモリをEFI起動する
- Mac をEFIブートする。
準備する
準備するもの
- USB メモリ(4GB程度でもいいので、とにかくWrite速いやつ、私は16GBー500円にした
- インストールするためのISOイメージ
- Virtual Box (インストールに使う)
USB メモリについて
最低4GB程度あれば足りる。
Ultra Fit USB3.0対応 最大150MB/s 海外リテール というのがあるので、これにする
USB3.0 で Write が150MB/s なら通常使用でも、HDDと遜色ない。親指サイズなのでお手軽。
親指の爪サイズで、挿しっぱなしにしてもじゃまにならないUSBメモリがあるので、これにする
インストールISOイメージ
今回はUbuntuにした。
理由は、Intel のドライバとWifiがさくっと使える。プロプライエタリなドライバがかんたんに導入できるから。 ある程度動かして感覚がつかめたらDebianに移行すると思う。
VirtualBox
Virtual Box でOSをインストールする。
MacでUSB起動してEFIブートしてもインストールいいんだけど、面倒な点があります。
インストール起動するために、インストール元とインストール先と、2つのUSBドライブが必要になり。2つも使うので、無駄が多い。時間も金銭的コストも無駄が多かった。
あとインストール中に、ディスク書込でMacBookを占拠されるのも辛い。他の作業ができずに暇・・・
今回はEFIの起動を先に実験したい観点からも、Virtualboxを使います。
さらに、Ubuntuのインストールメディアは、USBではなくmacOSが入った本体SSDにブート情報を書き込んでしまい、とても面倒なことになるので、私としてはVirtualBoxを強くおすすめしたい。
インストール作業
まず、始めにインストールしたいUSBドライブを mac に差し込んで、GPTディスク化とEFIパーティション作成から行っています。
今回は、USBドライブがMac以外でも使えるようBIOS パーティションも作成しておきたい。
そのため、ハイブリッド構成なレイアウトを作っていきます。
gdisk コマンド・mkfsコマンド
パーティションを作成するのは主にコマンドで行います。
brew install gptfdisk brew install e2fsprogs brew install dosfstools
mkfs.fat
とmkfs.ext4
と gdisk
コマンドを導入しておきます。
USB メモリをGPTにする
GPT化はDisk Utility.app でも出来ますが、今回は EFI と BIOS パーティションを共存させたいので、gdisk を使います。
ターゲットのディスクを調べます。
まず、USBディスクを見つける。
takuya@usr$ diskutil list /dev/disk0 (internal, physical): #: TYPE NAME SIZE IDENTIFIER 0: GUID_partition_scheme *251.0 GB disk0 1: EFI EFI 209.7 MB disk0s1 2: Apple_CoreStorage Macintosh HD 250.1 GB disk0s2 3: Apple_Boot Recovery HD 650.0 MB disk0s3 /dev/disk1 (internal, virtual): #: TYPE NAME SIZE IDENTIFIER 0: Apple_HFS Macintosh HD +249.8 GB disk1 Logical Volume on disk0s2 8FD55945-F96F-4B06-9E80-DAC4550E8306 Unencrypted /dev/disk2 (external, physical): #: TYPE NAME SIZE IDENTIFIER 0: NO NAME *15.4 GB disk2
disk0, disk1 はmacOSがほぼ独占して、事実上予約領域にしているので、ディスク2あたりから。
GPT パーティションにする
gdisk の対話コマンドに入る。
sudo gdisk /dev/disk2
すべてのパーティションを消す
Command (? for help): d Partition number (1-5): 1 Command (? for help): p Partition table holds up to 128 entries First usable sector is 34, last usable sector is 30031216 Partitions will be aligned on 2-sector boundaries Total free space is 30031183 sectors (14.3 GiB) Number Start (sector) End (sector) Size Code Name
gdisk の対話コマンドでパーティションサイズを単位 1にする(hybrid にするため)
Command (? for help): x ## エキスパートモード Expert command (? for help): l Enter the sector alignment value (1-65536, default = 2048): 1 ## ここで 「1」 Expert command (? for help):m # エキスパートモード抜ける
Command (? for help): n # ← 新規作成 Partition number (1-128, default 1): First sector (34-30031216, default = 34) or {+-}size{KMGTP}: Last sector (34-30031216, default = 30031216) or {+-}size{KMGTP}: 2047 ## ← 2047 をいれる Current type is 'Apple HFS/HFS+' Hex code or GUID (L to show codes, Enter = af00): EF02 ## ここはTYPEで EF02 をいれる。 Changed type of partition to 'BIOS boot partition' Command (? for help): p Disk /dev/disk2: 30031250 sectors, 14.3 GiB Logical sector size: 512 bytes Disk identifier (GUID): EC49D51C-255A-46F4-9575-980A69E5ADF8 Partition table holds up to 128 entries First usable sector is 34, last usable sector is 30031216 Partitions will be aligned on 1-sector boundaries Total free space is 30029169 sectors (14.3 GiB) Number Start (sector) End (sector) Size Code Name 1 34 2047 1007.0 KiB EF02 BIOS boot partition
ここまでで BOIS boot partition を作ることが出来た。
最後に、単位をデフォルトの2048に戻す。
Command (? for help): x Expert command (? for help): l Enter the sector alignment value (1-65536, default = 2048): # エンターするだけでデフォルトに戻る。 Expert command (? for help): m ## 通常モードに戻る
ここまでで、BIOSブート作って終わり。あとは通常通りの gdisk を使うだけ。
次に、EFIブート領域を作る
では、EFIブート領域を作る。
Command (? for help): n Partition number (2-128, default 2): First sector (2048-30031216, default = 2048) or {+-}size{KMGTP}: Last sector (2048-30031216, default = 30031216) or {+-}size{KMGTP}: +200MB Current type is 'Apple HFS/HFS+' Hex code or GUID (L to show codes, Enter = AF00): EF00 Changed type of partition to 'EFI System'
サイズは、200MBくらいで、とりあえず。
タイプは EF00 を指定すると EFI システムパーティションになる。
出来上がりはこんな感じ。
Command (? for help): p Disk /dev/disk2: 30031250 sectors, 14.3 GiB Logical sector size: 512 bytes Disk identifier (GUID): EC49D51C-255A-46F4-9575-980A69E5ADF8 Partition table holds up to 128 entries First usable sector is 34, last usable sector is 30031216 Partitions will be aligned on 2048-sector boundaries Total free space is 29619569 sectors (14.1 GiB) Number Start (sector) End (sector) Size Code Name 1 34 2047 1007.0 KiB EF02 BIOS boot partition 2 2048 411647 200.0 MiB EF00 EFI System
あとは通常通りLinuxのパーティションを作成する
- partition1 BIOS boot
- partition2 EFI System
- partition3 Linux /boot
- partition4 Linux Swap
- partition4 Linux /
/boot
を分割するのは個人的な趣味なのです。
Command (? for help): p Disk /dev/disk2: 30031250 sectors, 14.3 GiB Logical sector size: 512 bytes Disk identifier (GUID): EC49D51C-255A-46F4-9575-980A69E5ADF8 Partition table holds up to 128 entries First usable sector is 34, last usable sector is 30031216 Partitions will be aligned on 2-sector boundaries Total free space is 1393 sectors (696.5 KiB) Number Start (sector) End (sector) Size Code Name 1 34 2047 1007.0 KiB EF02 BIOS boot partition 2 2048 411647 200.0 MiB EF00 EFI System 3 411648 1460223 512.0 MiB 8300 4 1460224 2508799 512.0 MiB 8200 Linux swap 5 2508800 30029823 13.1 GiB 8300 Linux filesystem
EFI パーティションのフォーマット作成
EFIパーティションは、FAT32 なので FATでフォーマットする。
sudo mkfs.fat /dev/disk2s2
タイプをEF02で指定してFAT32でフォーマットすると準備完了
あとは、/
にインストール
次は、通常通りLinuxをインストールするのです。
linux から 作ってた場合。
Linux からEFIディスクを作るときは、grub-efiを作って { /dev, /proc, /sys }
を --bind で マウントして、chroot して update-grub する。
/
のパーティションに dd でディスクを持ってきて、mount -bind
してもいい
apt-get install grub-efi sudo ddrescue disk.img /dev/sdc3 sudo mount /dev/sdc3 /mnt for name in /dev /proc /sys ; do sudo mount --bind $name /mnt/$name ; done sudo chroot /mnt #grub-install /dev/sdX #grub-install --recheck /dev/sdX #update-grub exit
macOS X の場合。
mac の場合、chroot が少々厄介なので、Virtual Box を使うのが楽だと思います。
VirtualBoxが直接USBディスクを丸ごと使えるように設定します。
物理メディア(USB)を直接Virtualboxで使う
方法は、別エントリに以前書きました。
物理ディスクやUSBメモリをVirtualBoxの仮想マシンとして起動する - それマグで!
通常通りインストール
VirtualBoxで、最初に準備したISOをつかって、USBディスクへ、直接インストール。
インストール中にEFIを選択
UbuntuのインストールオプションにEFIがあるのでそれを選ぶ。
CentOSや古いDebianなど、EFI選択ない場合でも、大丈夫。 パーティションの設定画面で、マニュアルを選んで、自分で設定する。
だいたいこれでEFIインストールされるはず。
debian の場合は公式Wikiに情報がある→ https://wiki.debian.org/GrubEFIReinstall
インストールが終わったら起動確認。
Virtualbox の起動設定をEFIにする。
EFI起動にして無事に起動スレば準備完了。
BIOS ブートの確認
BIOSでブートできるか確認する。
VirtualboxでEFIチェック外して起動するか確認する。 (ここは細かいところ忘れたので後で調べる。
virtualbox を使う利点
Mac でUSBディスクにLinuxを作った場合、シャットダウンの書き込みタイミングがずれるなど ext4 ファイルシステムのエラーチェックなどで EFI ブートが壊れることがる。
また、ディスクの起動設定を変えるなどUSBディスクのEFIブートの中身を書き換えようとしても辛いことが多い。
そこでVirtualBoxを使ってUbuntuライブディスクを起動して、USBメモリを書き換えられるようにしておくと、緊急時の安全対策として便利。
Mac1台で完結した。これがとても便利だった。
なのでので、このVirtualBoxを活用してEFIパーティションを作る方法をおすすめしたい。
日本語キーボード問題
MacBookにただUbuntuを入れると、日本語キーボードの「かな」「英数」がなぜか hangul hanja になってしまってた。すごく気持ち悪かった。
VirtualBox経由でインストールして Virtualbox Additions を入れると日本語キーボードの「かな・英数」を認識してくれてた
理由はちょっとわからないけどキーボードも問題なく動くようになったので快適だった。
EFI パーティションの構造とマウント先
ここまでで作成したEFIパーティションについて見ておこうと思います。
EFIパーティションのマウント
EFIパーティションはFAT32なので簡単にマウントできる。
sudo mkdir mnt sudo mount -t msdos /dev/disk2s2 mnt # EFIパーティションをマウントする
EFI パーティションの構造
中身を見るとこんな感じ。
/ ├── EFI │ ├── boot │ │ └── bootx64.efi │ └── ubuntu │ ├── MokManager.efi │ ├── fw │ ├── fwupx64.efi │ ├── grub.cfg │ ├── grubx64.efi │ └── shimx64.efi └── grub
Macbookで使うEFIのファイルはこのなかでは、以下のファイルになる。
/EFI/boot/bootx64.efi
ここで EFI/boot と EFI/ubuntu の以下のファイルは同一になっていた。
abd0cc30bc149c31b503bb3b63d1e39c EFI/boot/bootx64.efi abd0cc30bc149c31b503bb3b63d1e39c EFI/ubuntu/grubx64.efi
EFIの細かいことは調べてないのだけれど、Macでは 複数のefi が使えないらしく、 EFI/boot/bootx64.efi
に起動したいEFIファイルを置くらしい。
この辺はまだ良くわかってない。EFIを使っていくうちにわかると思う。
Linux でのマウント先
/boot/efi/
なのでEFIのファイルは、いかに存在した。
/boot/efi/EFI/boot/bootx64.efi
BIOSインストールしてしまった場合など
EFIインストールに失敗してたり、BIOSからブートできるイメージを使った場合は、grubでEFIブート設定をインストールできる
mkdir -p /boot/efi mount /dev/sda2 /boot/efi ## efi パーティションのマウント /usr/sbin/grub-install --target=x86_64-efi /dev/sdb
あとはfstab を書き換えればオッケ。
もし、別のLinuxにUSBメモリを差し込んで書き換える場合は
sudo mount /dev/sdf5 /mnt for name in /dev /proc /sys ; do sudo mount $name /mnt/$name ; done mount /dev/sdf2 /mnt/boot/efi ## efi パーティションのマウント sudo chroot /mnt mkdir -p /boot/efi /usr/sbin/grub-install --target=x86_64-efi /dev/sdf
EFIブートのディスクにBIOS起動を追加する
/usr/sbin/grub-install --target=i386-pc /dev/sda
まとめ USB メモリを差し替えて快適生活
仮想マシンでLinuxやWindowsを立ち上げると、どうしても不便さが解消されない。
またBootCampや仮想マシンはただでさえ少ないSSD容量を圧迫する。
そこで、USBメモリを差し替えて別OSを次々と切り替えられるのはとても便利だと思うのです。
Ubuntuに限らない
Debian/CentOS/Fedoraなども使える。Windowsや OS X yosemite や El capitan もSierra以前のOSだって手軽に試せるし、持ち運べる。
USB-Cはちょっと・・・
2016年の新型Macbook Pro はどう考えても Macbook Air 2です。少ないSSDにメモリ、なりよりUSB-Cが痛い。しかし、2013/2014 のMacbookProなら、USB-Aポートがしっかりついているので、極小USBメモリを挿しっぱなしにできる。USB-C2ポートは人類には早すぎたんだよ。
USBを挿すだけ
これは、便利なことだと思うのです。
複数OSの管理はめんどくさいけれど、USBさしてMacbook再起動すればいつでも環境を切り替えられる。直感的でよろしい。
極小 USB メモリから WindowsやYosemite起動
これは、今後の課題にしたい。
参考資料
MBR(bios)でもESP(uefi)でも起動できるgrub2の設定方法 - pyopyopyo - Linuxとかプログラミングの覚え書き -
MacOSでext4やext2,3にフォーマットする(mkfsのインストール) - それマグで!
macでフォーマットしてファイルシステムを作るコマンド - それマグで!
Mac で ubuntuするには
https://help.ubuntu.com/community/UEFIBooting#Caution_for_Mac_owners