Daydreaming in Brookline, MA

AlmaLinux 9.2(とRocky Linux 9.4)環境をM1 MacBook上に再構築しました

1 はじめに

M1 MacBook用のVirtualBoxはまだ正式版ではないようなので、UTMを使っているのですが、スナップショットに未対応でVMをまるごとクローンするしかありません。ディスクを大量消費するので、ついクローンを取るのを怠っていると、 dnf update したときにブートしなくなる、、、ことを繰り返しています。

なお、VMにはメールとブログのデータ&環境を置いています。メールはgmailに全てあるので問題ないのですが、ブログはgithubへのアップデートを怠ると、VMが使えなくなった時に復旧できないデータが出てきます。

本エントリは2023年の6月にAlmaLinux9.2を入れ直した時に作成したものですが、今回(2024年7月)はRocky Linux 9.4で作成しなおしたので、その情報も追記したかたちでアップデートします。

2 UTMの使い勝手

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

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

VirtualBoxのARM版は安定したのでしょうか。そちらを待ったほうが良かったかも。。。と思ったのですが、まだdeveloper preview版でした。せめてUTMでスナップショットが自由に使えるようになるといいのですが。

3 環境再構築

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

3.1 AlmaLinuxインストール

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

Rocky Linux 9.4は https://rockylinux.org/download > ARM (aarch64) > v9.4 > DVD ISO から。

3.1.2 VM作成

  • UTM > + > Virtualize > Linux > Boot ISO Image > Browse
    • 7/12/2024追記: 今回、dnf updateで立ち上がらなくなるのを回避するために、Use Apple Virtualization をチェックしました。参考。暫定回避策かもしれませんが。
  • > 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

Rocky Linux 9.4でもそのまま行けます。

3.1.4 dnf update

ネットワークに繋がっていることを確認します。繋がっていなかったら一旦power offしてVMのネットワーク設定をBridgedにすれば大丈夫なはず。ここで一旦power offしてVMのクローンを取ります。

そして鬼門の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

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

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.12.4
pyenv global 3.12.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キーをインポートします。<id_rsa>はプライベートキーを指定します。
ssh-copy-id -i <id_rsa> <user>@<VM IP>
  • 無事に、パスワード認証無しで ssh できることを確認します。
ssh <user>@<VM IP>

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

  • ssh-agentにキーを登録します。<id_rsa>はプライベートキーを指定します。
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は相変わらずです。 → 7/12/2024追記: なぜか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版が正式に出たら、そちらも試してみたいと思いますが、こちらはこちらで性能面に不安があります。

7/12/2024追記: Rocky Linux 9.4で環境を作り直しましたが、このメモのおかげて半日で済みました。