それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

MacBook をEFIブートするUSBディスク作成してubuntuを起動する-macをusb ubuntu でEFIブート

この記事は Mac OSX の Advend カレンダーにあわせて書きました

macOS Advent Calendar 2016 - Qiita

OSX がどんどん劣化している。。。

OSXmacOS なんていう文化の香りがしない名称に変えられ、MacbookProにOLED touch barという、キーボードユーザーを馬鹿にしている商品が発売されようとしていて、MacBookの先行きに暗雲が立ち込めてきました。

Yosemiteでは、AppStore以外のアプリがKeychainsを使えなくなりました。 そのためChrome.app などがKeychainsを捨てるという結果を招きました。 Sierra では、ついに非署名pkg のインストーラーを起動できなくなってしまいました。 古い更新されてないドライバどうするんだよ。。。 どんどん不自由になる現実。そろそろ見切ってもいいんじゃないか。

ubuntu が起動するUSBメモリを作って移行に備える。

OSXが自縄自縛になる来るべきX-DAY。その前に、逃げる準備だけはしておこう。

Linuxが起動するUSBメモリを作ろうと思い立った。

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のパーティションテーブルを格納して、そこから起動すると実現できます。

macbookEFIブート

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を知らなくても良くなっている便利。

MacBookEFI

Macは古くからEFIブートになっている。

Macなどはこの仕組を上手く利用して、EFIの選択も可能。

Macでは起動ディスク選ぶ画面、あれがMacブートローダ

USBを差し込んだときは、USBのEFIが優先されるらしい。

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.fatmkfs.ext4gdiskコマンドを導入しておきます。

USB メモリをGPTにする

GPT化はDisk Utility.app でも出来ますが、今回は EFIBIOS パーティションを共存させたいので、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 # エキスパートモード抜ける

ディスクの先頭にBIOSブートパーティションを作る。

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パーティションを作成する

/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にする。

f:id:takuya_1st:20161202230609j:plain:w350

EFI起動にして無事に起動スレば準備完了。

BIOS ブートの確認

BIOSでブートできるか確認する。

VirtualboxEFIチェック外して起動するか確認する。 (ここは細かいところ忘れたので後で調べる。

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

macbook は 少し古い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 でのマウント先

Linuxでは EFIは次の場所にマウントされる

/boot/efi/

なのでEFIのファイルは、いかに存在した。

/boot/efi/EFI/boot/bootx64.efi

BIOSインストールしてしまった場合など

EFIインストールに失敗してたり、BIOSからブートできるイメージを使った場合は、grubEFIブート設定をインストールできる

mkdir -p /boot/efi
mount /dev/sda2 /boot/efi ## efi パーティションのマウント
/usr/sbin/grub-install --target=x86_64-efi /dev/sdb

あとはfstab を書き換えればオッケ。

もし、別のLinuxUSBメモリを差し込んで書き換える場合は

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 メモリを差し替えて快適生活

仮想マシンLinuxWindowsを立ち上げると、どうしても不便さが解消されない。

またBootCampや仮想マシンはただでさえ少ないSSD容量を圧迫する。

そこで、USBメモリを差し替えて別OSを次々と切り替えられるのはとても便利だと思うのです。

Ubuntuに限らない

Debian/CentOS/Fedoraなども使える。WindowsOS X yosemite や El capitanSierra以前の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でフォーマットしてファイルシステムを作るコマンド - それマグで!

Macubuntuするには

https://help.ubuntu.com/community/UEFIBooting#Caution_for_Mac_owners

2021-06-22

EFIパーティションでヒットしないので、記述を見直し