M1 MacにZabbixテスト用仮想環境 + Discord連携を構築

この記事は約21分で読めます。

このたびM1 MacBookでLinux(ARM64版Ubuntu 20.04.3)やWindows 11 Insider Preview for ARMの実行環境を構築できたので、その情報を共有する。

前提知識

まず以下の内容について説明をする。

  • Apple M1の概要
  • QEMUとUTMについて
  • Emulation(エミュレーション)とVirtualization(仮想化)の違い

次に、実際の構築手順について説明をする。

  • UTMのインストール
  • UTM上でARM64版Ubuntu 20.04.3のインストール
  • UTM上のUbuntu 20.04.3上でZabbixのインストール
  • ZabbixとDiscordの連携設定(Discordに通知する)

Apple M1の概要

昨年から仕事用のメインマシンをM1搭載のMacBook Airにしている。

M1は強力なCPUだ。処理性能の高さは間違いない。新しいアーキテクチャ、新しいプロセスルール。過去を引き摺る互換性の課題が少ないこともあり、このARMアーキテクチャのCPUは爆速である。それだけでなく、電力消費量もこれまでのCPUと比べて格段に低い。いままで所有してきたノート型PCは、電源に繋げられるときは繋いでおかないと不安になるのが当たり前だったが、このM1 Macはまるでスマホやタブレットのようにバッテリー駆動で不安が少ない。

Apple M1は、AppleがMac及びiPad Pro向けにARMアーキテクチャのライセンスを受けて設計したシステムオンチップ(SoC)である。TSMCの5nmプロセスで製造されている。

2020年11月10日のApple Eventで発表された。Appleが「省電力シリコンとしては世界最速のCPUコア」「ワット当たりのCPU性能は世界最高」と述べている[1]他、実際にもAppleの主張が正しいことが数々のベンチマークや記事で判明している。

Linuxでは、2021年のLinuxカーネル5.13以降においてサポートされている。

Apple M1 - Wikipedia より引用

CPUは高性能コア「Firestorm」と高効率コア「Icestorm」各4コアの計8コアの構成。これによって、Intel Macデバイスでは不可能だった電源管理の最適化が可能となる。Appleは、高効率コアの消費電力が高性能コアの10分の1だと述べている。

高性能コア「Firestorm」は、192KBのL1命令キャッシュと128KBのL1データキャッシュ、12MBのL2キャッシュをコア内で共有し、クロック周波数は0.6 GHz〜3.204 GHz、最大消費電力は13.8W。

高効率コア「Icestorm」は、128KBのL1命令キャッシュと64KBのL1データキャッシュ、4MBのL2キャッシュをコア内で共有し、クロック周波数は0.6 GHz〜2.064 GHz、最大消費電力は1.3W。

CPU以外に、8コアのGPUと16コアのNeural Engineを搭載しているほか、画像信号プロセッサ(ISP)、NVMeストレージコントローラ、Thunderbolt 4 コントローラ、Secure Enclave なども搭載している。

M1チップはユニファイドメモリ構造であり、CPUやGPUといったチップ内すべてのコンポーネントがメモリアドレスを共有している。メモリには4266 MHzのLPDDR4X SDRAMが採用されており、SoCと同一基板上にDRAMチップがハンダ付けで実装されている(SiPではない)。

M1を搭載したMacでは、Rosetta 2を介してIntel Mac用ソフトウェア、iPhoneやiPadのアプリを動かすことができる。

だがしかし、このCPUは非Intelアーキテクチャであるが故に、x86/x64の仮想化環境を構築できないという弱点があった。いままで使ってきたCore i7版のMacBook Proにはvmware fusionをインストールしてあり、ありとあらゆるOSの仮想化環境を構築してあった。これはシステム開発時にとても便利だし、macOSで動作しないソフトウェアを利用するためにも役立った。どれくらい実用的かというと、仮想化環境にあるLinuxサーバにおいて性能面で困ったことは一度もないし、仮想化されたWindows 10上で統合版のMinecraftのサーバとクライアントを実行してもまともに動作した。

M1対応版Parallels DesktopとUTMの登場

Macの仮想化環境といえばvmware fusion、Parallels Desktop、VirtualBoxなど様々な選択肢があったが、Apple M1となるとそれらの選択肢はなくなってしまった。2022年現在、Parallels DesktopがM1に対応したが、有償ソフトウェアであるためvmware fusionを使ってきた自分は迷いがあった。

そこに現れたのがUTMだ。

QEMUというオープンソースのエミュレータソフトがある。

QEMUの概要を理解する助けになるリンクを貼っておく。

読んでいただくとおわかりいただけるが、QEMUはCPUエミュレータなので、Apple M1というARMアーキテクチャのコンピュータ上で他のCPUをエミュレートすることができる。

そしてこのQEMUや他の仮想化技術・エミュレーション技術を組み合わせて作られたソフトウェアがUTMである。Apple M1に対応しているほか、iOS(iPhone, iPad)版もリリースされている。App Storeでは有償となっているが、本家サイトから無償で手に入れることができる。App Storeの有償版は、開発コストを援助したい人向けとなっているらしい。

UTMはQEMUを内包しており、ARMアーキテクチャ向けのOSを仮想化することと、非ARMアーキテクチャ向けのOSをCPUレベルからエミュレーションことの両方が可能。

本ドキュメントで紹介する手順について

本稿で紹介している手順はM1搭載のMacにUTMをインストールして、最終的にZabbixが動作する環境を構築することが主目的だが、それ以外にもZabbixの実行には必ずしも必要のない手順も含まれている。

  • SSHでX11 Forwardingする設定
    macOS側にM1対応版のXQuartzをインストールすることで、UbuntuのX11アプリケーションをmacOS側で利用することを目的とする。
  • Ubuntu Desktop
    Zabbixサーバ専用で利用する場合、Desktop環境は必要ない。X11 ForwardingもSPICEも必要ない。
  • 日本語環境・日本語フォントの設定
    ロケールはja_JP.UTF-8、日本語フォント導入手順も含む。
  • zsh / zpreztoの設定
    Ubuntu 20.04.3の標準シェルであるBashを利用する場合は不要。
  • ネットワーク関連ツール
    利用目的がない場合は不要。
  • PHP 8.0
    ZabbixはUbuntu 20.04.3にデフォルトでインストールされているPHP 7.4で動作する。

本稿は、Zabbixを利用する場合に限らず、一般的にUbuntuをインストールする場合に導入するソフトウェアのインストールや環境設定をまとめ、Ubuntu導入の参考資料となるようにまとめた。

手順

UTMのインストール

UTMのインストールは簡単で、上記サイトから最新版のdmgパッケージをダウンロードし、ダブルクリックしてdmgをマウントしてアプリをドラッグ&ドロップするだけ。多くのmacOS用ソフトウェアとやり方は同じだ。

UTMにUbuntu 20.04.3 for ARMをインストール

Ubuntu Serverのセットアップ

Ubuntu Server for ARM(20.04.3)のisoファイルを下記サイトからダウンロードする。Ubuntu 21もリリースされているが、20.04を選ぶ理由は、それがLTSであるから。

次にUTMを起動し、+(プラス)ボタンを押すと、次のような画面が現れる。

「Virtualize」を選択。次の画面で「Browse...」ボタンをクリックし、ダウンロードしたUbuntuのisoファイルを指定する。「Next」をクリックして次へ進む。

VMに割り当てるCPUコア数とRAM容量を指定して、「Next」。

VMにマウントするストレージの最大容量を指定して、「Next」。

VMとホスト側の間で共有したいディレクトリがある場合は指定して、「Next」。ここで指定したディレクトリは後述するSPICEをインストールするまでVM上のUbuntuからは見えない。また、ここで指定しなくても後で簡単に設定することもできる。

「Save」をクリックして準備完了。UTM上に出来上がったUbuntuの再生ボタンをクリックすると、UTM上でUbuntu Serverが起動する。

Ubuntu Desktopのインストール

インストールしたUbuntu ServerのCUIにログインし、次のコマンドを実行する。

sudo apt update
sudo apt install ubuntu-desktop
sudo reboot

SPICEの導入

SPICEを導入すると、ホストOSとゲストOSの間でクリップボードやディレクトリの共有が可能になる。vmwareのvmware toolsみたいなもの。インストール手順は次の通り。

sudo apt install spice-vdagent spice-webdavd

共有設定されたディレクトリはWebDAV経由で http://127.0.0.1:9843/ からアクセスできる。WebDAVクライアントを使うもよし、mount.davfsでマウントするもよし。

apt upgrade

最新の状態にするため、お決まりのapt updateとapt upgradeをやっておこう。

sudo apt update
sudo apt upgrade

タイムゾーン

date
sudo timedatectl set-timezone Asia/Tokyo
date

zshのインストールと設定

zsh

sudo apt install zsh
chsh your_username

zprezto

git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"
setopt EXTENDED_GLOB
mv .zshrc _zshrc_old
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do  \n  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"  \ndone
prompt -p

各種設定

vi ~/.zshrc
alias ll='ls -l'
alias la='ls -al'
vi ~/.zpreztorc
zstyle ':prezto:module:prompt' theme 'agnoster'
source ~/.zshrc
source ~/.zpreztorc

vim

vi ~/.vimrc
set number
set backspace=indent,eol,start
set ambiwidth=double
set ignorecase
set smartcase
set incsearch
set hlsearch
set showmatch matchtime=1
set list
set listchars=tab:^\ ,trail:~
set history=1000
set expandtab
set shiftwidth=2
set softtabstop=2
set tabstop=2

SSH

Ubuntu(ゲストOS)側でSSH用のユーザディレクトリ等を作成

cd
mkdir .ssh
chmod 700 .ssh
cd .ssh
touch authorized_keys
chmod 600 authorized_keys

macOS(ホストOS)側でSSH鍵を作成

ssh-keygen -t ed25519 -c "your_email@your_domain.com"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/Users/user/.ssh/id_ed25519): /Users/your_username/.ssh/my_public_key
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

作った鍵ペアの公開鍵をMacのターミナルからUbuntuのホームディレクトリにSCPでコピー

scp ~/my_public_key.pub user@hostname:~/

Ubuntu(ゲストOS)側でSSH公開鍵を登録

cat ~/my_public_key.pub >> ~/.ssh/authorized_keys
rm ~/my_public_key.pub

Ubuntu(ゲストOS)側でSSHサーバの設定

sudo vi /etc/ssh/ssh_config
PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys .ssh/authorized_keys2
PasswordAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no
AcceptEnv LANG LC_*
Subsystem sftp  /usr/lib/openssh/sftp-server
X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost yes
sudo systemctl restart sshd

ネットワーク関連ツール

tshark

sudo apt install tshark
tshark -v
tshard -D

tcpdump

sudo apt install tcpdump
tcpdump -D

whois / nmap / traceroute

sudo apt install whois nmap traceroute
whois klavier.jp

フォント関連

Ricty

Rictyフォントを生成するためにはInconsolataとMigu 1Mという2種類のフォントが必要。

FontForgeのインストール(オープンソースのフォント作成プログラム)

sudo apt install fontforge

Inconsolataのダウンロード

wget http://levien.com/type/myfonts/Inconsolata.otf

Migu 1Mはこちらからダウンロードする。
そして解凍。

unzip migu-1m-20200307.zip

Rictyジェネレータのシェルスクリプト

git clone git://github.com/yascentur/Ricty.git
sh ricty_generator.sh auto
cp *.ttf ~/.fonts
sudo reboot

Takaoゴシック

sudo apt install fonts-takao
sudo fc-cache -fv
fc-match TakaoGothic

IPAフォント

sudo apt install fonts-ipafont fonts-ipaexfont
sudo fc-cache -fv
fc-match IPAGothic

Microsoft Windows標準フォント群

sudo apt install ttf-mscorefonts-installer

EURA(End-User License Agreement)に同意する画面が表示される。「yes」を選択。

sudo fc-cache -fv
fc-match Arial

XQuartz(M1 Mac側)

Homebrewがインストールされている前提。Homebrewのインストール手順はここでは割愛。

brew install xquartz

Ubuntuの日本語環境設定

人によっては不要かもしれないが、日本語環境の設定も書いておく。基本的に英語環境のまま使うとしてもロケールの設定はやっておこう。日本語の場合は ja_JP.UTF-8で、英語の場合はen_US.UTF-8が一般的だ。

sudo apt install locales-all
locale -a
sudo apt install language-pack-ja-base language-pack-ja ibus-mozc
sudo localectl set-locale LANG=ja_JP.UTF-8
vi ~/.zshrc
# Locale
export LANGUAGE=ja_JP.UTF-8
export LC_ALL=ja_JP.UTF-8
export LANG=ja_JP.UTF-8
export LC_TYPE=ja_JP.UTF-8
source ~/.zshrc
sudo vi /etc/locale.gen

以下の行のコメントアウトを外す

ja_JP.UTF-8 UTF-8

Zabbixに必要なソフトウェア

PostgreSQL

sudo apt install postgresql postgresql-contrib

Apache

sudo apt install apache2

PHP 8.0

Ubuntu 20.04.03はデフォルトでPHP 7.4が入っている。今回は実験のため8.0を追加で導入。

sudo add-apt-repository ppa:ondrej/php
sudo apt install php8.0
sudo apt search php8.0-*
sudo apt install php8.0-gd php8.0-xml php8.0-soap php8.0-mbstring php8.0-mysql
sudo update-alternatives --config php

php.iniにタイムゾーンを設定

sudo vi /etc/php/7.4/apache2/php.ini
sudo vi /etc/php/7.4/cli/php.ini
sudo vi /etc/php/8.0/apache2/php.ini
sudo vi /etc/php/8.0/cli/php.ini

上記すべてのファイルで次の編集をする。

 962 date.timezone = Asia/Tokyo
sudo systemctl restart apache2

ufw

TCP/UDPポート指定で開けるよりも、アプリケーションごとに開けるほうがあとあと管理が楽。

sudo ufw status verbose
sudo ufw enable
sudo ufw app list
sudo ufw allow 'Apache Full'
sudo ufw allow OpenSSH
sudo ufw status

Zabbix

Zabbixのインストール

wget https://repo.zabbix.com/zabbix/5.0/ubuntu-arm64/pool/main/z/zabbix-release/zabbix-release_5.0-1+ubuntu20.04_all.deb
sudo dpkg -i zabbix-release_5.0-1+ubuntu20.04_all.deb
sudo apt update
sudo apt install zabbix-server-pgsql zabbix-frontend-php php7.4-pgsql zabbix-apache-conf zabbix-agent

PostgreSQLにユーザとデータベースを作成

sudo -u postgres createuser --pwprompt zabbix
sudo -u postgres createdb -O zabbix zabbix
zcat /usr/share/doc/zabbix-server-pgsql*/create.sql.gz | sudo -u zabbix psql zabbix

Zabbix側のDB接続設定

sudo vi /etc/zabbix/zabbix_server.conf
DBPassword=your_zabbix_user_password

Apacheのタイムゾーン設定

sudo vi /etc/zabbix/apache.conf

php.value.date.timezoneの値をAsia/Tokyoにする(2箇所あるので注意)。

<Directory "/usr/share/zabbix">
    Options FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all

    <IfModule mod_php5.c>
        php_value max_execution_time 300
        php_value memory_limit 128M
        php_value post_max_size 16M
        php_value upload_max_filesize 2M
        php_value max_input_time 300
        php_value max_input_vars 10000
        php_value always_populate_raw_post_data -1
        # php_value date.timezone Europe/Riga
        php_value date.timezone Asia/Tokyo
    </IfModule>
    <IfModule mod_php7.c>
        php_value max_execution_time 300
        php_value memory_limit 128M
        php_value post_max_size 16M
        php_value upload_max_filesize 2M
        php_value max_input_time 300
        php_value max_input_vars 10000
        php_value always_populate_raw_post_data -1
        # php_value date.timezone Europe/Riga
        php_value date.timezone Asia/Tokyo
    </IfModule>
</Directory>

Zabbixサーバ、エージェント、Apacheの再起動

sudo systemctl restart zabbix-server zabbix-agent apache2

Zabbixのグラフ等、画像埋め込み文字の日本語文字化け対策

sudo update-alternatives --install /usr/share/zabbix/assets/fonts/graphfont.ttf zabbix-frontend-font /usr/share/fonts/truetype/takao-gothic/TakaoPGothic.ttf 20
sudo update-alternatives --config zabbix-frontend-font
sudo systemctl restart zabbix-server

Zabbixの初期設定(Web)

ブラウザから http://your_server_ip/zabbix にアクセス。

ここまでの手順をやっていれば、「Next step」で進んでいくだけで設定は完了する。

Zabbixへのアクセス

Zabbixには http://your_server_ip/zabbix からアクセスできる。デフォルトのユーザ名はAdmin、パスワードはzabbix。ログインしたらすぐにAdminのパスワードは変更し、別の特権ユーザを作成する。Adminアカウントは無効化したほうが安全。

ユーザー設定からUIを日本語に変更する。

グラフを表示してグラフの画像ファイル内のフォントがTakao Pゴシックになっていることを確認。日本語が半角の□で化けてしまっている場合は、「Zabbixのグラフ等、画像埋め込み文字の日本語文字化け対策」の章にあるupdate-alternativesのコマンドに失敗している可能性がある。

ZabbixのDiscord連携

Discord: チャンネルとWebフックの作成

  1. Discordにログインし、テキストチャンネルを作成
  2. 左ペインにある作成したチャンネルの上で右クリックし、「チャンネルの編集」をクリック
  3. 「連携サービス」をクリック
  4. 「ウェブフックを作成」をクリック
  5. ウェブフックの名前に、Zabbix-botなど名前を入力
  6. 「変更を保存する」
  7. 「ウェブフックURLのコピー」をクリック(ここでコピーしたURLは次章で使う)

Zabbix: ユーザ毎のメディアの設定

「ユーザー設定」→「メディア」タブを開く。

「追加」をクリック。

  • タイプ:Discord
  • 送信先:Discordで作成したWebフックのURL
  • その他は次の画像の通り(デフォルトのまま)

「更新」をクリックして保存。

Zabbix: マクロの設定

「管理」→「一般設定」を開き、上のプルダウンから「マクロ」を選択。

「追加」をクリック。

  • マクロ:{$ZABBIX.URL}
  • 値:http://your_zabbix_server_IP_address/zabbix

「更新」をクリックして保存。

SSL化

コメント