はじめに
いつものようにMacからCisco機器にコンソール接続しようとしたところ、
% ls /dev/tty.*
を叩いてもお馴染みの/dev/tty.usbserial-XXXXがどこにも見当たらない...
調べ進めていくうちに、maxOS Sequoia -> Tahoeへのアップデートと、
FTDIドライバが絡んだ落とし穴だったので記録として残しておこうと思いました。
想定読者
- Apple Sillicon Mac(M1/M2など)でFTDI製USB-シリアルを使っている人
- macOSアップデート後に/dev/tty.usbserial-XXXXが消えてCisco機器にコンソール接続出来なくなった人
環境
今回の事象が起きた環境はこんな感じです。
- ハードウェア
- MacBook Pro(M1 Pro)
- OS
- アップデート前: macOS Sequoia
- アップデート後: macOS Tahoe
- 接続対象
- Cisco 891FJ
- USB-シリアルアダプタ
- FTDIチップ採用
- 用途
- ターミナルからscreenでCiscoにコンソール接続
Sequoiaの頃はUSBを挿せば何も考えずに/dev/tty.usbserial-XXXXが見えていました。
ここで一つモヤっとしたのが、
「そもそも過去に FTDI のドライバなんて入れたっけ…?」
という点です。
自分の記憶では 「FTDI 専用のドライバをインストールした覚えはない」 のですが、標準ドライバで動いていたのか、いつの間にか入っていたのかまでは追い切れていません。
この記事は筆者の環境で発生した体験談です。
macOSのバージョンやFTDI デバイスの種類、セキュリティ設定などによっては、同じ手順でもまったく同じ事象が再現しない可能性があります。「こういう切り分け方・調べ方があるんだな」くらいで読んでいただければ幸いです。
トラブルシューティング/原因調査
1. 発端:「/dev/tty.usbserial-XXXXがない」
1-1. アップデート後のls /dev/tty.*
macOSがTahoeに上がったあと、いつも通り
% ls /dev/tty.*
を実行すると、こんな感じの結果でした。(一例):
/dev/tty.Bluetooth-Incoming-Port
/dev/tty.debug-console
/dev/tty.usbserial-XXXXが一切出てこない状態です。
USBケーブルを抜き差ししても変化なし。
この時点では、
- USB-シリアルが物理的に壊れた?
- Cisco側の問題?
などを疑いましたが、冷静に考えると**/dev/tty.usbserial-XXXXが無い = そもそもmacOSがUSBシリアルを認識していない**ので、OS側(ドライバ周り)を疑うべきだと判断して調査を始めました。
2. まずは基本確認:物理認識&kextの状態
2-1. USBデバイスとして認識されているか
最初に確認したのは「そもそもUSBデバイスとして見えているか」です。
% system_profiler -listDatatypes
[Available Datatypes:
SP...
SP...
SP...
SPUSBHostDataType ← これ!
% system_profiler SPUSBHostDataType
SPUSBHostDataTypeはmacOSによって名称が違う可能性がありますのでお気をつけください。
ここでFTDIデバイス(例: FT232R USB UART)などが見えていれば、
- 物理的な接続はOK
- 「ドライバがttyを生やしていない」
と切り分けられます。
2-2. AppleUSBSerial.kextの存在
次に、Apple純正のUSBシリアルドライバが存在しているかを確認しました。
% ls /System/Library/Extensions | grep -i "USBSerial"
AppleUSBSerial.kext
USBシリアルドライバは存在していることは確認できました。
ここで一瞬「ドライバあるじゃん!」と安心しかけますが、
「.kextが存在していること≠実際にロードされている/使われている」です。
2-3. 実際にロードされているkextを確認
そこで、ロード済みのkextを確認します。
% kmutil showloaded | egrep -i 'usbserial|ftdi'
結果:何も出力されない。
これはつまり、
- AppleUSBSerial.kextはディスク上に存在している
- しかし現時点ではカーネルにロードされていない/FTDIデバイスにマッチしていない
という状態を示しているのだと考えられます。
3. DriverKit(dext)を意識する
最近のmacOS(Big Sur以降)では、ドライバ事情が大きく変わっていると思われます。
- 従来: カーネル拡張(kext)を
/System/Library/Extensionsなどに配置して読み込む - 現在: DriverKit(dext)ベースの「システム拡張」として動かす流れにシフト
つまり、kextだけ見ていても全体像は掴めないということです。
4. systemextensionsctlでDriverKit(dext)を確認
DriverKitベースのドライバは、systemextensionsctlで確認できます。
% systemextensionsctl list
0 extension(s)
つまり、
- FTDIのDriverKitがインストールされていない
- システム拡張として認識されていない?
などが原因だと考えました。
一方で、当初は/dev/tty.usbserial-XXXXが現れていたので、
- macOS Sequoiaのことに使われていたkext経路
- あるいはApple純正のAppleUSBSerial経路
が、OSアップデートにより実質無効化されてしまったのではと思いました。
解決方法
5. FTDI VCP DriverKitの導入
5-1. FTDI公式のVCPドライバ
FTDIは公式にVCPドライバを配布しています。[1]
- VCP = USBデバイスを仮想COMポートとして見せるドライバ
- macOS用にもDriverKit版が提供されています
Homebrewでもftdi-vcp-driverというcaskにまとまっており、説明[2]には
Once you've rebooted, you can (re)connect your FTDI
device and it will show up in /dev, usually like this:
と書かれていました。
5-2. インストール手順(今回の対応)
今回はHomebrew経由ではなく、FTDIの配布物を直接使いましたが、流れとしては大体同じです。
- FTDIのVCPドライバページからmacOS用ドライバのダウンロード
- .dmgを開き、/Applications配下へ移動
- アプリを実行してインストール
- 「システム設定 → プライバシーとセキュリティ」からシステム拡張を許可
- 再起動
5-3. アプリ削除時の注意
インストールが完了し、インストーラを削除しようとしてFTDIUSBSerialDextInstaller_1_5_0.appをゴミ箱に送ろうと思っていた際にmacOSから次のような警告が出ました。
アプリケーション“FTDIUSBSerialDextInstaller_1_5_0.app”はホスティングシステムの機能拡張です。続けると、これらの機能拡張は削除されます。
これは、
- この.appがDriverKitのシステム拡張をホストしている
- ゴミ箱に入れるとドライバ本体も削除される
ことを意味しているのだと思いました。
削除する際は要注意するようにしてください。
6. /dev/tty.usbserial-XXXXの復活
インストール&再起動後に、再度USB-シリアルを挿し直してから
% ls /dev/tty.*
を実行すると、/dev/tty.usbserial-XXXXの出力が確認できました🥳
また、Ciscoへのコンソール接続ができました。
さらに、USB-シリアルを抜くことで/dev/tty.usbserial-XXXXが消えたことから、
きちんと認識していることが確認できました。
おわりに
今回の件で一番感じたのは、OSのメジャーアップデートは慎重に検討しようという点でした。
特に、
- UDBシリアル
- NIC
- VPNクライアント
などの「ドライバを使う系」は、
OSのメジャーアップデートのたびに挙動が変わるリスクがあるので、
今回のようなトラブルシュートの手段を確立しておくと安心かなと思いました。
同じように
「あれ、/dev/tty.usbserial-XXXXがない?」
からハマった方の参考になれば嬉しいです。
余談: 過去にFTDIドライバを入れた記憶がない問題
個人的にひとつモヤっとしているのが、
- macOSのアップデート前には
/dev/tty.usbserial-XXXXは普通に見えていた - にも関わらず、自分でFTDI用の専用ドライバをインストールした記憶がない
という点です。
記憶ベースでは、「Apple標準ドライバで動いていたのでは?」という気持ちが強いのですが、過去のインストール履歴などを残していなかったため、「昔の自分がどこかのタイミングで入れていて忘れている」可能性も否定できません。
このあたりはあくまで主観なので、記事内では「標準ドライバ or 既存の何かで動いていた可能性が高い」という程度の扱いに留めておきます。
参考文献
[1] FTDI VPC Drivers
[2] Homebrew Formulae ftdi-vcp-driver link
