Skip to content

MacOSでsocketCANを試す

socketCANはlinux上では利用できるがMacOSでは基本的にdocker上で試すしかないらしい (実際どうかはわからないが,私はvcanを使って簡単なプログラムを作ってみたいだけなのでこれで問題なし).

dockerで試してみたが,基本的なubuntu imageではvcanの起動ができず,custom kernelが必要なようだった. これを試すのは面倒なため,UTMというものでlinux環境を作成してみる.

UTMのインストール

公式からインストールする.App storeからだと1500円の様だが,何か差があるのだろうか.

インストールし起動して,"Create a New Virtual Machine"を選択. "Virtualize", "Emulate"があるので"Virtualize"を選択. "Operating System"では"Linux"を選択. ここでイメージを選択するが,そもそもイメージファイルを持っていない. 表示されている”Ubuntu Install Guide”をクリックし,リンク先からARM用のイメージを入手する,

基本的にインストールは特別なことはしないで,通常のアプリのインストールと同じ方法だった.

Ubuntu (Server) のイメージ起動

続いてUbuntuを入れる,M1のMacではARM用のイメージが必要になるが,Ubuntu DesktopのイメージはARM版にはない.従って,ARM版があるserver用イメージを入れる(Ubuntu Server for ARM). 私の使用用途では基本的に(現在のところ)Desktop環境は必要ないが,必要であれば後からコマンドで環境を作ることができるらしい.

イメージをDLしたら,UTMを起動する,新しい仮想環境を作る,のアイコンを選択し,そのまま指示通りに進めれば良い.ただし,私が詰まった点は,設定を終え(User名やパスワード以外はデフォルト)てビルドが終わり再起動した後. 画面は真っ暗で何も起動しない.一度強制的に終了し,再度起動するとまたも OSの初期設定画面になってしまう.

解決方法は単純で,強制終了した後に,起動ディスクの欄からISOイメージの指定を外すことだった.

UTM画面

上記の画像で最下部の欄で,最初の作業直後では選択したイメージファイルが選択されているが,ここの指定を外さなければならない.指定されたままだと,当然ビルドしたものではなくこちらの素のものが起動して設定画面に入ってしまう. 指定を外して再起動すれば問題なくUbuntuが起動できた.

can-utilsでの動作確認

Ubuntuの準備が出来たので,can機能が使えるか確認する.canと言ってもvcanだが.

sudo apt-get update
sudo apt-get install can-utils

aptで入るので楽.後はお決まりの手順でデバイスを有効にして,can-utilsを試す.

sudo modprobe vcan
sudo ip link add dev vcan0 type vcan
sudo ip link set up vcan0
candump vcan0 > test.txt &
cansend vcan0 123#112233

問題なければ,test.txtに以下の内容が書き込まれる.

  vcan0  123   [3]  11 22 33

(スペース等は適当)

ホストマシンとのファイルの共有

OS設定時に~/workを共有ディレクトリとして指定した(上記画像参照). 初期状態ではこの共有は出来ていないので,これを設定する.

sudo apt-get update
sudo apt-get install 9mount
sudo mkdir /mnt/shared
sudo mount -t 9p -o trans=virtio,version=9p2000.L share /mnt/shared

最後のコマンドでshareはおそらく決め打ちの値.環境によって変わるかもしれないが,私の環境ではこの値だった.

上記コマンドを実行すると,/mnt/sharedの下にホスト側のwork下に入っているファイル等が確認できる,

参考: UTM document

注意

M1 MacBook上ではRosetta2というレイヤーを挟んでいるためarm64のアプリが動くらしい.実際にRustのhello worldプログラムで確認するとMach-O 64-bit executable arm64という形式だった. ARMのUtuntuでは当然このアプリは動作しない.従ってクロスコンパイルが必要になる.

このページではクロスコンパイルには触れず,別ページでやり方をまとめたいと思う.