M1 MacでUTMにGentooをインストールする

先日、10年ほど使っていたMacbook Airのバッテリが膨張してきたのでM1 Macに買い替えた。
dotfile整備したりdockerなどインストールして、さて次はVirtualBoxを...というところで、VirtualBoxがM1 Macには対応していないことを知った。

代わりの選択肢はいくつかあるが、その一つにUTMという仮想マシン作成ソフトがある。
今回はこのUTMを使ってGentoo Linuxをインストールしてみる。

環境はこちら

~ $ system_profiler SPHardwareDataType
Hardware:

    Hardware Overview:

      Model Name: MacBook Pro
      Model Identifier: MacBookPro17,1
      Chip: Apple M1
      Total Number of Cores: 8 (4 performance and 4 efficiency)
      Memory: 16 GB
      System Firmware Version: 6723.140.2
      OS Loader Version: 6723.140.2

目次

UTMとは

UTMは、QEMU(オープンソースのCPUエミュレータ)のラッパー。
VirtualBoxとの違いを以下に簡単にまとめた。

UTM VirtualBox
ホストOS macOS(Intel, Apple M1) macOS(Intel), Windows, Linux(x86/64)
ゲストOS Windows, Linux(x86/x64, ARM64) macOS(Intel), Windows, Linux(x86/64)
方法 エミュレーション 仮想化

ポイントとして、UTMではホストとゲストのCPUアーキテクチャが異なっていても動かすことができる(パフォーマンスは落ちるが)。例えば従来のIntel Mac(x64)上でARMアーキテクチャLinuxを動かしたり、Apple M1(ARM64)上でx64アーキテクチャLinuxを動かすことができる。

MacbookIntelチップ搭載モデルは今後生産中止されていくと予想されるので、M1 Macに買い替えた人がUTMを使い始めるケースが増えていくのではないかと思う。

Gentooのインストール

M1 MacARMアーキテクチャのCPUなので、GentooもARM64をインストールしようと考えていた。
が、残念ながらARM64のハンドブックは現在利用できないので、AMD64をインストールすることにした。*1
wiki.gentoo.org

1. 仮想マシン作成

utmをインストール

brew install --cask utm

以下のハードウェア要件を満たすように仮想マシンを作成する

f:id:y_nishizawa:20211220101129p:plain
仮想マシンスペック
Gentooをインストールするディスク(NVMEで30GB)と、isoをマウントするディスク(IDE)を作成した

2. インストールメディアの選択

Downloads – Gentoo Linux
上記からamd64のisoイメージをダウンロードし、仮想マシンのCD/DVDにマウントして起動

3. ネットワーク設定

DHCPが動いていない環境だとネットワーク設定手順が必要
今回はDHCP機能付きルータを使っていてすでにpingが通るので何もする必要がない

livecd ~ $ ping -c 3 www.gentoo.org

4. ディスクの準備

まず自分の環境がBIOS起動かUEFI起動かを確認する

livecd ~ $ ls /sys/firmware
acpi dmi efi memmap

efiディレクトリがあるのでUEFIで起動していることが分かる
UEFI起動の場合はGPTでパーティションを作成する*2

4.1 GPT でディスクをパーティショニングする

GPTでEFIシステム、swap、ルートパーティションを作成する

livecd ~ $ fdisk /dev/nvme0n1
# パーティションを作成する(コマンドは省略)
4.2 ファイルシステムを作成する
livecd ~ $ mkfs.vfat -F 32 /dev/nvme0n1p1
livecd ~ $ mkfs.ext4 /dev/nvme0n1p3
livecd ~ $ mkswap /dev/nvme0n1p2
livecd ~ $ swapon /dev/nvme0n1p2

Tips: parted -l コマンドでmountされていないファイルシステムが正しく作成されていることを確認できる

4.3 ルートパーティションのマウント
livecd ~ $ mount /dev/nvme0n1p3 /mnt/gentoo
livecd ~ $ cd /mnt/gentoo

5. Gentooインストールファイルをインストール

5.1 stage tarballをインストールする

日時を設定する

livecd /mnt/gentoo $ ntpd -q -g

amd64 stage openRCをダウンロードする

livecd /mnt/gentoo $ links https://www.gentoo.org/downloads/mirrors/

展開

livecd /mnt/gentoo $ tar xpvf stage3-*.tar.xz --xattrs-include='*.*' --numeric-owner

6. Gentooベースシステムのインストール

6.1 chrootする

DNS情報をコピーする

livecd ~ $ cp --dereference /etc/resolv.conf /mnt/gentoo/etc/

必要なファイルシステムをマウントする

livecd ~ $ mount --types proc /proc /mnt/gentoo/proc
livecd ~ $ mount --rbind /sys /mnt/gentoo/sys
livecd ~ $ mount --rbind /dev /mnt/gentoo/dev
livecd ~ $ mount --rbind /run /mnt/gentoo/run

新しい環境に入る

livecd ~ $ chroot /mnt/gentoo /bin/bash
livecd ~ $ source /etc/profile
livecd ~ $ export PS1="(chroot) ${PS1}"
(chroot) livecd ~ $

ブートパーティションをマウントする

(chroot) livecd ~ $ mount /dev/nvme0n1p1 /boot
6.2 Portageを設定する

Gentoo ebuildリポジトリのスナップショットをインストールする

(chroot) livecd ~ $ emerge-webrsync

@worldの更新

(chroot) livecd ~ $ emerge --ask --verbose --update --deep --newuse @world
6.3 タイムゾーン
(chroot) livecd ~ $ echo "Japan" > /etc/timezone
(chroot) livecd ~ $ emerge --config sys-libs/timezone-data
6.4 ロケールの設定
(chroot) livecd ~ $ echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen
(chroot) livecd ~ $ locale-gen
(chroot) livecd ~ $ eselect locale set 4  #en_US.utf8を選択した
(chroot) livecd ~ $ env-update && source /etc/profile && export PS1="(chroot) ${PS1}"

(optiional) vimを使いたい(required)

(chroot) livecd ~ $ emerge --ask vim

7. Linuxカーネルの設定

7.1 カーネルソースのインストール
(chroot) livecd ~ $ emerge --ask sys-kernel/gentoo-sources
(chroot) livecd ~ $ eselect kernel set 1
(chroot) livecd ~ $ emerge --ask sys-apps/pciutils
7.2 genkernel*3

genkernelと、依存するlinux-firmwareをインストールするためのライセンス設定

# /etc/portage/package.license

# Accepting both licenses for linux-firmware
sys-kernel/linux-firmware linux-fw-redistributable no-source-code
# Accepting both licenses for genkernel
sys-kernel/genkernel linux-fw-redistributable no-source-code

genkernelのインストール

(chroot) livecd ~ $ emerge --ask sys-kernel/genkernel

カーネル(/boot/vmlinuz*)、モジュール群(/lib/modules)、initramfs(/boot/initramfs*)を生成する

# etc/fstab
/dev/nvme0n1p1  /boot         vfat    noauto, noatime   1 2

(chroot) livecd ~ $ genkernel all #1日くらい待つ

8. システムの設定

# etc/fstab
/dev/nvme0n1p1  /boot         vfat    noauto, noatime   1 2
/dev/nvme0n1p2  none          swap    sw                0 0
/dev/nvme0n1p3  /             ext4    noatime           0 1
/dev/cdrom      /mnt/cdrom    auto    noauto, user      0 0

# /etc/conf.d/hostname
hostname="zawanishi"

# /etc/conf.d/keymaps
keymap="jp106"
(chroot) livecd /etc/init.d $ emerge --ask net-misc/dhcpcd
(chroot) livecd /etc/init.d $ rc-update add dhcpcd default
(chroot) livecd /etc/init.d $ rc-service dhcpcd start  # DHCPが既に動いていれば不要

(chroot) livecd ~ $ passwd

9. 必要なシステムツールのインストール

(optional)なくても動くが大体ないと困る

# syslog
(chroot) livecd /etc/init.d $ emerge --ask app-admin/sysklogd
(chroot) livecd /etc/init.d $ rc-update add sysklogd default
# cron
(chroot) livecd /etc/init.d $ emerge --ask sys-process/cronie
(chroot) livecd /etc/init.d $ rc-update add cronie default
# file index
(chroot) livecd /etc/init.d $ emerge --ask sys-apps/mlocate
# ssh
(chroot) livecd /etc/init.d $ rc-update add sshd default

VFATはデフォルトでサポートされていないのでインストールが必要

(chroot) livecd /etc/init.d $ emerge --ask sys-fs/dosfstools

10. ブートローダの設定

GRUB2をインストール
emergeで出てくるメッセージにGRUB_PLATFORMS="efi-64"があることを確認する

(chroot) livecd ~ $ emerge --ask --verbose sys-boot/grub
(chroot) livecd ~ $ grub-install --target=x86_64-efi --efi-directory=/boot
(chroot) livecd ~ $ grub-mkconfig -o /boot/grub/grub.cfg

シャットダウン

(chroot) livecd ~ $ exit
livecd ~ $ umount -R /mnt/gentoo
livecd ~ $ halt

UTMの管理画面でCD/DVDをClearして再起動
Gentooの起動画面が出れば成功

f:id:y_nishizawa:20211220093938p:plain
gentoo起動画面

まとめ

楽しみながらLinuxを学ぶことができる。
最適なパフォーマンスを得るための設定をするのは難しい(自分も全然わかってない)が、とりあえず動かすだけならLinux初心者でもなんとかなる。
LPICを取ろうとしている人やLinux環境で仕事をしているけどあんまり詳しくない人、駆け出しエンジニアを抜け出したい人なんかにもオススメしたい。

*1:ARM64がサポートされていないわけではなく、インストール手順のサポートがされていない

*2:VirtualBoxでインストールする場合、BIOS起動なのでMBRパーティションで作成する

*3:公式ハンドブックではマニュアル設定がオススメされているがかなり難しいので、初めてのインストールではgenkernelを使うと良いと思う

インターネット接続が切れる原因を調べた

最近よくインターネット接続が切れる。
数分経つと自然に回復するので放っといていたが、一日に何度も起きるようになって仕事に支障がでてきたので原因を調べた。

問題の切り分け

1. 端末(Mac, iPhone)の問題か?
iPhoneMacともにインターネット接続できない
=> 端末の問題ではない

2. 接続方式(無線LAN、有線LAN)の問題か?
Wi-Fiイーサネットともにインターネット接続できない
=> 接続方式の問題ではない

となるとルーターに問題がありそう。

無線モデム

私の家においてあるのはルーター機能付き無線モデムである。ルーター機能に加え、ケーブルテレビ回線を使ってインターネット接続するためにイーサネットとの変換を行っている。

インターネットや無線LAN(Wi-Fi)に接続できない | JCOMサポート
公式トラブルシューティングに書いてあるモデムの再起動、工場出荷時状態に戻すresetなどを行ったが解決しない。
もう諦めてJCOMに問い合わせて訪問対応してもらうか・・・と思ったが、まだできることがある。

192.168.0.1

192.168.0.1は多くのルーターのデフォルトIPアドレスになっていて、ブラウザでアクセスするとGUIルーターの設定ができる。
GUIでイベントログを見ることができた(MACアドレスは改変)。

時間 重要度 説明
Sat Nov 13 20:43:14 2021 Critical (3) DHCP FAILED - Discover sent, no offer received;CM-MAC=xx:xx:xx:xx:xx:xx;CMTS-MAC=yy:yy:yy:yy:yy:yy;CM-QOS=1.0;CM-VER=3.0;
Sat Nov 13 20:42:13 2021 Critical (3) No Ranging Response received - T3 time-out;CM-MAC=xx:xx:xx:xx:xx:xx;CMTS-MAC=yy:yy:yy:yy:yy:yy;CM-QOS=1.0;CM-VER=3.0;
Sat Nov 13 20:41:18 2021 Critical (3) Received Response to Broadcast Maintenance Request, But no Unicast Maintenance opportunities received - T4 time out;CM-MAC=xx:xx:xx:xx:xx:xx;CMTS-MAC=yy:yy:yy:yy:yy:yy;CM-QOS=1.1;CM-VER=3.0;
Sat Nov 13 20:40:45 2021 Critical (3) Started Unicast Maintenance Ranging - No Response received - T3 time-out;CM-MAC=xx:xx:xx:xx:xx:xx;CMTS-MAC=yy:yy:yy:yy:yy:yy;CM-QOS=1.1;CM-VER=3.0;

よくわからないがCriticalログが大量に出ている。

最終的にDHCPが失敗している*1ためにネットワーク接続ができていなさそう。
そしてDHCPに失敗している根本原因はMaintenance RangingやMaintenance opportunitiesなどに失敗していることのように見えるが、これは何なのか?

DOCSIS

ケーブルテレビ回線でデータ通信を行うための標準規格をDOCSISという。
DOCSISではインターネット(Wide Area Network)とケーブルモデムの間を取り持つ「CMTS(Cable Modem Termination System)」が存在している。

https://volpefirm.com/wp-content/uploads/2017/01/CM-SP-CMCIv3.0-I02-1407291.pdf


CMとCMTSは周期レンジング(Periodic Ranging)を行うことによって通信の安定を維持(maintenance)している。具体的には、送信パワー、送信タイミング、送信周波数などの調整をする。
CMTSはCMにレンジングの機会(Unicast Maintenance opportunities)を与える。一定時間が経過すると終了できるように、タイマー(T4)が設けられている。
CMはレンジングリクエスト(Unicast Maintenance Ranging Request)を送信するが、同様にタイマー(T3)やリトライカウンタ(RNG-REQ retries Retry Counter)が設けられている。
イベントログの「T3 timeout」「T4 timeout」などは、この周期レンジングに失敗していることを意味する。
詳しくは下のフローチャートを参照。

https://volpefirm.com/wp-content/uploads/2017/01/CM-SP-MULPIv3.0-I27-1505281.pdf

ということでインターネットとCMTSの間ではなくCMTSとCMの通信に問題があることがわかった。CMTSとCMの間を分解すると、

  • 「CMTS」と「家の壁のケーブル端子」を繋ぐケーブル回線
  • 「家の壁のケーブル端子」と「CM」を繋ぐ同軸ケーブル

なので、このどちらかに原因があるというところまで絞り込めた。
さらに調べ続けていたら決定的な記述を見つけた。

T3 ( Ranging Request Retries Exhausted )

Fixes:
1. Check for the loose or Bad cables. This is by far most neglected and most common fix
2. Remove extra splitters in house
3. Buy powered amplifier to boost your upstream power
4. Buy better coaxial cables
5. Call for a technician visit to inspect and fix cables outside and inside home (could be rain damage, fire damage, animal damage, construction damage, etc)
Cable Modem T3 and T4 Timeouts Error Messages and How to Fix them - Pick My Modem

T3 timeoutが出るケースはほとんどの場合同軸ケーブルの緩みが原因だとのこと。
同軸ケーブルを締め直したらエラーが出なくなり、解決した。*2

まとめ

知らないことでも調べて解決できると楽しい。

*1:一般的な「DHCP機能付きルーターがPCにIPアドレスを割り当て」ではなく、「ルーターの上流に設置されたDHCPサーバがルーターIPアドレスを割り当て」なので注意。

*2:引越してきた時に「このケーブルは絶対に触ったり抜き差しはしないでください」と言われたので勝手に締め直したりしなかった。

CTOのお誘いを辞退した話

先日、地方に住む友人が経営するスタートアップ企業のCTO就任の話をいただきました。
当初は話を受けるつもりでしたが、後述する「社会通念」に対する私の理解が足りないことが原因で心身を病みそうになったため辞退をしました。

社会通念とはなにか、私が何を体験したのか、淡々と読むのも退屈だと思いますのでクイズにします。

社会通念クイズ

ご厚意で指導していただいている方(以下、指導者)から以下の指摘をされたとします。

あなたは経営者に全く不向きです。
...略...がなければ、そもそもスタートにすら立てません。

私は以下の返事をしました。

経営者としてそもそもスタートにすら立てていないという危機感を持ち、この現状を打開するために必要なことを全て、謙虚な気持ちで学ばさせていただきます。

では問題です。
私の返事には社会通念上間違っている点があります。それはどこでしょう?
制限時間は5秒です。解らなければ指導者に叱られます。


ヒント
社会通念(しゃかいつうねん、英: Common sense)とは、一般的な考え方のこと。法律とは異なり、明文化はされていないことが多い。常識ともいう。社会通念 - Wikipedia











答え

  1. 「謙虚な気持ち」は不適切です。
    「謙虚」は相手に認められている時に使う言葉です。何も結果を出していない、相手に認められていない人が使うと煽りになります。
    「自分はできているんだけど、指摘をちょっと受け入れようと思います」と相手に伝わります。

  2. 「危機感を持ち」は不適切です。
    危機感は、「これまで良好だった状態に問題が発生した状況や、物事が悪い方向へ転じそうなときに浮かぶマイナスな要因を危ぶむ感覚・感情」です。スタートにすら立てていない状態は良好ではないのでおかしいですね。
    「特に問題なく良好な状態だけど、気を引き締めます」と相手に伝わります。

  3. 相手から指摘されたという点が抜けています。
    まるで自分で気づいたかのような言い回しです。相手は蔑ろにされていると感じます。
    「ご指摘をいただき、経営者としてスタートにすら立てていないという自覚をもちました」などが適切です。



指導者「(上記のように)相手には伝わるんだよ。こんなんキレられて当然だよなあ」
私「はい。そのように伝わってしまい申し訳ありません」
指導者「「伝わってしまい」じゃねえだろ!そう伝わるんだ!というか文章でそう書いてあるだろ!!! こっちの読み取り能力のせいか?と思わされる」
私「はい、申し訳ありません........」

厳しい状況

私は上記のような間違いを含む発言やメールを何度もして、何度も叱られました。

正確な言語伝達能力は同質の人間関係の中だけでは育まれないことを教わりました。外とのやりとりがほとんどなく、社内のエンジニア同士でしか会話しない私には身に付いていません。
指摘されたことを正確に理解できない、そして(正しいかも分からない)自分の解釈を相手に正確に伝えることができない状況は、挫折とはレベルの違うショッキングな出来事でした。
今まで自由に操っていたはずの日本語は、得体の知れないものに変わりました。

私の弱さ

どれだけ叱られても、「努力すれば必ずこの状況を打破できるはずだ」と自分を信じることができており、精神面は安定していました。
それでも身体は無意識にストレスを感じていたのでしょう、段々と異変が出始めました。最終的には吐き気・腹痛・不眠などの症状が出始め、「このままでは死んでしまう」と妻が泣いて心配するほどでした。*1

身体の不調が現れると、精神も弱くなってくるものですね。さまざまな疑念が浮かんできます。本当に努力を続ければこの状況は改善するのだろうか?このままだと身体の状態は悪化するのではないのか?やはり自分はCTOに向いていないのではないのか?

それまで精神を根っこから支えていた「自分ならできる」という張り詰めた糸が、「もしかしたら無理かもしれない」という一瞬頭をよぎった考えによって「プツン」と切れたのを感じました。
一度切れてしまった気持ちはもう元に戻ることはなく、自分を信じられなくなった私はいただいた話を辞退しました。

後日談

さて、上記のクイズをエンジニアの同僚に出してみましたが誰も分かりません。
(同質の人間以外との関わりが多い)ビジネス企画の同僚にも聞いてみましたが分からないようです。
社会通念 = 常識であるはずなのに、誰も分からないのは一体どういうことなんだ?と考えていたときに、以下の文章を読みました。

そして、一廉の人物が自分の仲間になるかもしれないと思って教育をするとき、そこには莫大な常識が流れます。その常識を横から掠め取るだけでも相当なものです。
引用元:Twitter で医師を拾ってきて Google のソフトウェアエンジニアにするだけの簡単なお仕事 - 白のカピバラの逆極限 S.144-3

なるほど....!
私はここで言われているような「常識」を横から掠め取ったのだと理解しました。
医学部であったり、研究室であったり、googleであったり、それぞれの場所にそれぞれの常識があるわけです。いや、言われてみれば当たり前すぎることなのですが、私はずっと気づけませんでした。新しい概念ではなく誰もが知っている日本語や文化に関するものだったからかもしれません。

私が掠め取った常識は、(地方で)ビジネスを行う経営層水準の常識でしょう。経営知識ではなく、経営層なら当然知っている社会人としての常識だと思います。
私に足りていない社会通念とはこの常識を指していたのか、と後になってから理解をしました。

まとめ

30にもなって本気の教育を受けるというありがたい経験をしました。
半月ほどでしたが、見ず知らずの人間を指導してくれたことに感謝をしています。*2
そして「鍛えがいのある良い人材だ」と評されて、時間もエネルギーも奪って指導していただいたのに、期待に応えられず失望させてしまったことを思い出すと辛くなります。

今は気持ちを切り替えて、目の前のことを一つ一つ頑張っていきます。




おまけ1

友人(メガバンク勤務)にクイズを出したところ正解していました。それどころか、

  • 「全て」だと「全部教わるつもりかよ、そもそも何が必要かまだわかってないだろ」と思われる
  • 「させていただく」は許可をもらうときに使う言葉だから、「学ぶ許可を求めるなよ」と思われる

こういう指摘を毎日されると言っていました。銀行の厳しさの一面を知りました。

おまけ2

友人(五大商社勤務)にクイズを出したところ、全て意味がわからなく、

  • 1~3全て論破できる
  • 特に2は相手の主観で物を語ってる前提が許せない

と言っていました。商社マンらしいバイタリティが感じられていいですね。


*1:「合わなかったら辞めて良い」と常に言われていたので、逃げ道は用意されていました。友人は何年もこの環境で過ごして成長しており、また合わない人は実際に辞めていたようなので、パワハラだとかブラックな環境ではありません。誤解のないよう念の為。

*2:指導者は誰なのかが気になるとは思いますが、特定を防ぐために詳細は伏せさせていただきます。