M1 MacにUTMを使ってウェブ開発(LAMP)環境を構築する 【4】(共有ディレクトリ設定・httpd.conf設定)

開発環境

UTMで仮想マシンを作った時に共有ディレクトリを設定した(これはいつでもできる)わけだが、このディレクトリはホストマシン(Mac)で作ったフォルダを指定しただけ。

で、今回はこのディレクトリをゲストマシンのRocky Linux9側からも認識させ操作可能にしていく。

根本的なQemuのことやVirtioというファイルシステムのことなどの知識がゼロなもんで、いろいろと調べながら進めていった。
やはり根本的なシステムに対する理解ができていないとホント大変。
とはいえ、仕事で使えるようにしないといけないので、何はともあれ理解より結果を急ぐww

いろいろなページを参考にしたが、最も参考になったのが
MacのUTMにインストールしたAlmaLinuxで共有フォルダーを有効化する
ここでした。それとChatGPTと対話しながら解決できました、とさ。

ファイルシステムの問題

9pってなんじゃらほい

UTMのドキュメントのshareのところを参照
https://docs.getutm.app/settings-qemu/sharing/

VirtFS
This requires the guest operating system to have driver support for 9pfs and VirtIO. The shared directory is exposed under the VirtFS tag share. Note that unlike WebDAV, the shared directory cannot be changed while the VM is powered on. There is currently a lack of Windows support but the performance on Linux is much better so this is the recommended option if you are running Linux. See this page for more information.

9pファイルシステムは必要なようです。
で、調べてみると、RHEL系のOSは9pサポートしてないことがあるとか?
また、いろいろ情報をたぐっていくと、9pfsが無ければVirtio-FSってのでいけるというやり方もあった。
で、カーネルをアップデートするか、Virtio-FSでやるか、となって簡単そうな後者を選択したんだけど、さんざん試して結局うまく行かなかった。
基本に立ち返ってUTMの方のパラメータをチェックしてみると、

-device virtio-9p-pci,fsdev=virtfs0,mount_tag=share

共有関連のパラメータとしては、やはり9pからは逃げられなさそう。
ということで、頑張ってやってみよう。

9pが使えない現状の確認

ChatGPTに聞いてみた。

# ※面倒なので sudo は省略してまっせ
# 9Pファイルシステムがカーネルでサポートされているかを確認
$ cat /boot/config-$(uname -r) | grep CONFIG_NET_9P
CONFIG_NET_9P is not set  ←カーネルに9Pサポートが含まれてない

どうやらRHEL系の古めのカーネルは9pをサポートしてないらしい。
でもRockyLinux9って古くねーぜ?まあ、やっていこう。

kernelをアップデートする

ここで注意しないといけないのは、普通に

dnf update kernel

とかやっても、必ずしも最新のカーネルになるわけじゃないということ。
最新のカーネルにアップデートするには、ELRepoリポジトリを入れてやることが必要らしい。

ELRepoとは、エンタープライズLinuxパッケージのためのRPMレポジトリです。
Enterprise Linux Repositoryの略だそうです。
Red Hat Enterprise Linux (RHEL)や、その派生ディストリビューション(Scientific Linux、CentOS等)に対応しています。

ということで!進めていくぅ〜!

# まずパブリックキーをインポート
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# ELRepoをインストールして有効化
dnf install https://www.elrepo.org/elrepo-release-9.el9.elrepo.noarch.rpm
dnf config-manager --set-enabled elrepo-kernel
# カーネルのアップデート
dnf install kernel-ml
# 再起動
reboot

再起動したら、ちゃんと目的達成できているか確認しよう

# カーネルによる9pサポートはOK!!

$ cat /boot/config-$(uname -r) | grep CONFIG_NET_9P
CONFIG_NET_9P=m
CONFIG_NET_9P_FD=m
CONFIG_NET_9P_VIRTIO=m
CONFIG_NET_9P_XEN=m
CONFIG_NET_9P_RDMA=m
# CONFIG_NET_9P_DEBUG is not set

# モジュールが起動してるか
$ lsmod | grep 9p
9pnet_virtio           16384  0
9pnet                 102400  1 9pnet_virtio
netfs                 532480  1 9pnet

ということで、満を持して

$ sudo mount -t 9p -o trans=virtio,version=9p2000.L share /home/yngdrsk/utm-shared/html

ということで、無事成功!!!!!

ちなみに、コマンドのパラメータについては以下の通り。

パラメータの詳細
• -t 9p: ファイルシステムタイプを9Pとして指定。
• trans=virtio: VirtIOトランスポートを使用。
• version=9p2000.L: プロトコルのバージョンを指定(9p2000.Lが一般的)。
• share: UTM設定で指定されたmount_tag(この場合share)。
• /home/yngdrsk/utm-shared/html: マウント先ディレクトリ。

これでホスト側・ゲスト側双方からファイルやフォルダを作ったり消したりして確認。お疲れ!

自動マウント

とりあえず出来たけど、このままだとサーバーを起動するたびに共有ディレクトリのマウントをやんなきゃいけないので、起動時に自動的にマウントさせる。

/etc/fstab に以下の一文を追加

share   /home/yngdrsk/utm-shared/html   9p   trans=virtio,version=9p2000.L,rw   0   0

各フィールドの説明

  1. share: マウントタグ。UTMの設定で指定したmount_tag。
  2. /home/yngdrsk/utm-shared/html: マウント先ディレクトリ。
  3. 9p: ファイルシステムタイプ。
  4. trans=virtio,version=9p2000.L,rw: マウントオプション。
    • trans=virtio: Virtioトランスポートを使用。
    • version=9p2000.L: プロトコルバージョン。
    • rw: 読み書き可能。
  5. 0 0: ファイルシステムチェックをスキップ。

以下のコマンドでエラーが出なければ、次回から起動時に自動的にマウントされる

$ sudo mount -a

ということで、再起動して確認してみてOKなら完了!!!

ふぅ・・・勉強になりました・・・

Apacheの設定を書き換え

今回は、apacheのROOT DIRECTORYをこの共有フォルダにすることが目的だったので、httpd.confを編集して、パーミッション関係を整理して、テスト用のhtmlファイルで確認して、これでようやく完了・・・。

ServerNameディレクティブが反映されないことでどん詰まり

開発用のドメインを充ててやるということで、httpd.confのServerNameディレクティブを編集してやったんだけど、全く反映されない。

ServerName hogehoge.com:80

IPアドレスでアクセスしたら普通にアクセスできてるのに、何故??

ブラウザに表示されるのは

DNS_PROBE_FINISHED_NXDOMAIN

ChatGPTに聞いて、提案してくれる解決策も全部試したがダメ。

Apacheのステータス

Apacheは正常に起動しており、エラーログや警告もありません。
hogehoge.comがServerNameとして適切に設定されています。

DNS_PROBE_FINISHED_NXDOMAIN
このエラーは、クライアント側(ブラウザまたはシステム)が名前解決に失敗したことを意味します。
hogehoge.comがどこにも解決されないため、ブラウザがサーバーにリクエストを送れません。

そこでピンときた。
ブラウザはどうやって名前解決してるんだ???
Linuxでいうところの /etc/hosts ファイルがMacにもあるはずやない??

ということで場所を調べたところ、ありました。

/private/etc/hosts

このファイルを編集したところ、無事アクセスできるようになりました、とさ。

確認・・・というか、vagrantで使っていたMBPの /private/etc/hostsファイルを覗いてみたところ、ずら〜〜〜〜〜〜〜っとVirtualHostの設定が記入されていました。
これ、Vagrantfileのhostsupdaterプラグイン用の記述

config.hostsupdater.aliases = [ "hogehoge.com", "aaa.hogehoge.com", "bbb.hogehoge.com", 〜〜]

ここで指定したサブドメイン等が, vagrant up時に /private/etc/hosts に書き込まれていたってことなのね。起動時のプロンプトを眺めてたら、あったわ

==> default: [vagrant-hostsupdater] Writing the following entries to (/etc/hosts)
# この下にずら〜っと

ということで、これからの運用では、この部分はサブドメインを増やすごとに自分で書き足すということで。

めでたし。

2025/01/01開発環境9p,9pfs,Apache,ELRepo,kernel,RockyLinux,UTM,エラー

Posted by YANAGIDAryosuke