Daydreaming in Brookline, MA

AlmaLinux 9環境をM1 MacBook上に再構築しました

1 はじめに

使っていたMacBookが壊れてM1モデルになったのですが、使い慣れたVirtualBoxのARM対応がいまいちなので、UTM上にAlmaLinuxを入れて使っていました。ところがあるとき、AlmaLinuxで dnf update をしたらGNOMEが起動しなくなり、sshでしかアクセスできなくなってしまいました。これというのも、UTMがスナップショット未対応なのが悪いのです!

この問題を解決するためにいろいろと調べたら、UTMのバージョンを3.2.4に下げるとよいという情報を見つけたので、3.2.4にダウングレードしたところ、何をどう間違ったのか、なんと、既存のVMがデータごと全て消えてしまいました。。。ガーン。

そこで、泣く泣くAlmaLinux環境の再構築をする羽目になりました。 → 後からわかったのですが、既存VMデータ(.utmファイル)は残っていました。自動で読み込んでくれればいいのに。。。

2 UTMの使い勝手

VirtualBoxと比べて、UTM(M1 Mac版)はまだまだ実用的では無いと思います。例えば、

  • ホストであるMacから、localhostの指定ポートでVMにアクセスできない
    • IPアドレスで ssh する(Bridgedモード)ことはできますが、自宅と自宅以外の場所でVMのIPアドレスが変わってしまうので、使い勝手が悪いです
    • Emulated VLANモードだと、 ssh -v で指定ポートに繋がった後で sshd にアクセスできていないように見えます
  • スナップショットが使えない(qemuはサポートしているのに。。)
    • 今回のように dnf update で動かなくなっても、以前の状態に戻すことができません。。
    • cloneをスナップショット代わりに使うと良さそう(?)ですが、全容量コピーするので容量がきついです。また、ついうっかりスナップショット用のクローンを使ってしまったり、間違えてオリジナルを消したりしてしまいそう。
  • MacBookのスリープにうまく対応していない
    • スリープから復帰した後で、VMの時間がずれたままです。 systemctl restart chronyd するのが面倒

VirtualBoxのARM版は安定したのでしょうか。そちらを待ったほうが良かったかも。。。と思ったのですが、まだdeveloper preview版でした。

3 環境再構築

自分用に復旧のステップを一通りメモしておきます。

3.1 AlmaLinuxインストール

3.1.1 AlmaLinux最新版のダウンロード

3.1.2 VM作成

  • UTM > + > Virtualize > Linux > Boot ISO Image > Browse
  • > AlmaLinux-9-latest-aarch64-dvd.iso > Continue
  • > (メモリサイズを2GBにしました) > Continue > (ドライブは64GBのまま)
  • > Continue > Shared Directory > Browse > 選択 > Continue > Save
  • right-click vm > Edit > Network > Bridged (Advanced) > Save

3.1.3 AlmaLinuxインストール

  • Run VM > Install AlmaLinux 9.2 > English (United States) > Continue
  • > Time & Date > タイムゾーン選択 > set Root password > create a user
  • > check Make this user administrator > Installation Destination
  • > Network & Host Name > <a9> > Begin Installation > (wait)
  • > eject ISO > Reboot System
  • Login > No Thanks > run terminal > poweroff

3.1.4 dnf update

ネットワークに繋がっていることを確認し、dnf updateします。

sudo dnf update -y
sudo dnf install yum-utils
sudo dnf config-manager --set-enabled crb
sudo dnf install epel-release
sudo dnf install epel-next-release

終わったら一旦リブートして、きちんと上がってくることを確認します。前回は黒画面のままになったので。。 更に、VMのクローンを作成しておきます。

3.2 環境再構築

3.2.1 gitのインストールと初期設定

復旧元となるgithubにアクセスするためにgitを入れます。

  • sudo dnf install git
  • 初期設定
git config --global user.email "<user@email.com>"
git config --global user.name "<your name>"

3.2.2 Pythonのインストールと設定

VMにpythonのプロジェクトをいくつか置く必要があります。 複数バージョンのPythonが使えるように、pyenvをインストールし、それを使って最新バージョンのPythonをインストールします。

  • pyenvのインストール
sudo dnf install make gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel tk-devel libffi-devel xz-devel
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
  • .bash_profileの変更
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/shims:$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
source .bash_profile
  • Python最新版のインストール

pyenvを使って、最新版のPythonをインストールします。

pyenv install --list
pyenv install 3.11.4
pyenv global 3.11.4
pyenv rehash

3.2.3 lsp serverのインストール

ホストであるMacBook上のemacsから、VM上のpythonファイルを編集できるようにします。

pip install 'python-lsp-server[all]'

3.2.4 emacsのインストール

ゲストVMにもemacsを入れます。ブログの作成に使っているサイトジェネレーターのpelicanでorgファイルを変換するのに使われます。

sudo dnf install emacs

3.2.5 ssh keyのインポート

MacBookからAlmaLinuxに、パスワード認証無しでsshで入れるように、ssh keyをVMにインポートします。これをやっておくと、trampモードを使って、ホストのMacからVM上のファイルをemacsでシームレスに編集できるようになります。

  • まずは、VM上で sshd が動いていることを確認します。
systemctl status sshd
  • 次にホストであるMacBookからVMにsshできることを確認します。最初はパスワードを聞かれます。
ssh <user>@<VM IP>
  • ホストからsshキーをインポートします。
ssh-copy-id -i <id_rsa> <user>@<VM IP>
  • 無事に、パスワード認証無しで ssh できることを確認します。
ssh <user>@<VM IP>

3.2.6 github に sshできるようにする

  • ssh-agentにキーを登録します。
cd ~/.ssh
eval "$(ssh-agent -s)"
ssh-add <id_rsa>
ssh-add -l
ssh -vT git@github.com
  • うまくいったら、~/.ssh/configに設定します。
IdentityFile ~/.ssh/<id_rsaファイル>

3.2.7 githubから復旧

必要なプロジェクトをgithubからgit cloneしてきます(ステップ略)。

3.2.8 メール環境復旧

いちおうnotmuchでのメール環境を こちら を見ながら復旧します。メールのデータをVMに起き、ホストであるmac上のemacsからメールの読み書きをする設定です。同期するのが面倒で最近はあまり使っていませんでしたが。

同期の mbsync -a で出るwarningは相変わらずです。

3.3 ブログ環境の復旧

私はgithub pagesにある当ブログを作るのに静的サイトジェネレーターのPelicanを使っています。emacsのorg-modeでブログエントリーを書き、pelican(+org_readerプラグイン)でhtmlに変換して、ghp-importでgithub pagesにアップロードできるようにします。

ブログエントリーの.orgファイルは独立したgithubプロジェクトとしてgithubにバックアップしているのですが、肝心なpelican等のブログ環境は環境構築の度に毎回手動で設定しなおしています。もう少しスマートな方法があるような気もするのですが。。。

3.3.1 サイトジェネレーター Pelican 設定

mkdir py; cd py
mkdir blg; cd blg
python -m venv ve
source ve/bin/activate
pip install pelican
pip install ghp-import
  • pelican-quickstart 実行
> Where do you want to create your new web site? [.] 
> What will be the title of this web site? Daydreaming in Brookline, MA
> Who will be the author of this web site? Kyos
> What will be the default language of this web site? [en] ja
> Do you want to specify a URL prefix? e.g., https://example.com   (Y/n) 
> What is your URL prefix? (see above example; no trailing slash) https://achiwa912.github.io
> Do you want to enable article pagination? (Y/n) 
> How many articles per page do you want? [10] 20
> What is your time zone? [Europe/Rome] America/New_York
> Do you want to generate a tasks.py/Makefile to automate generation and publishing? (Y/n) 
> Do you want to upload your website using FTP? (y/N) 
> Do you want to upload your website using SSH? (y/N) y
> What is the hostname of your SSH server? [localhost] github.com
> What is the port of your SSH server? [22] 
> What is your username on that server? [root] git
> Where do you want to put your web site on that server? [/var/www] 
> Do you want to upload your website using Dropbox? (y/N) 
> Do you want to upload your website using S3? (y/N) 
> Do you want to upload your website using Rackspace Cloud Files? (y/N) 
> Do you want to upload your website using GitHub Pages? (y/N) y
> Is this your personal page (username.github.io)? (y/N) y
  • ブログで使用しているテーマをダウンロード

pelican-octopress-themeを使っています。いろいろと試した中で一番良かったです。

cd
mkdir git; cd git
git clone https://github.com/duilio/pelican-octopress-theme.git
git clone --recursive https://github.com/getpelican/pelican-plugins
  • pelicanconf.py を編集し、テーマ(とorgファイルを扱う)プラグインを指定します。更に、about meのページをメニューに追加。
THEME = "/home/kachiwa/git/pelican-octopress-theme"
PLUGIN_PATHS = ["/home/kachiwa/git/pelican-plugins"]
PLUGINS = ["org_reader"]
ORG_READER_EMACS_LOCATION = "/usr/bin/emacs"
MENUITEMS = [
    ("About Me", "/pages/about.html"),
]

なお、orgファイルを扱うプラグインは3種類あるようです。 https://kwpav.github.io/posts/pelican-and-org/

  • githubに置いてあるブログのコンテンツをクローンして、pelicanのcontentディレクトリをシンボリックリンクで置き換えます。なお、このレポジトリはプライベート設定のため、本人しかアクセスできません。
cd ~/git
git clone git@github.com:achiwa912/blog.git
cd ~/py/blg
rmdir content
ln -s ~/git/blog content
  • ここでpelicanを実行します。なんだか、出力されるwarningの数がやたらと増えたような気もしますが、何とか通りました。
pelican
  • ブログをアップロードするための git設定
git init
git remote add origin git@github.com:achiwa912/achiwa912.github.io.git
  • アップロードします。
ghp-import output
git push -f origin gh-pages:master

なんとか、ブログ環境の復旧ができました。VMの古いクローンを消して、新しクローンを作成しておきます。

4 終わりに

2〜3日がかりでAlmaLinuxの環境を復旧しました。それにしても、UTMの機能や使い勝手はまだまだ実用的ではないように思います。VirtualBoxのarm版が正式に出たら、そちらも試してみたいと思いますが、こちらはこちらで性能面に不安があります。