1Password 8に上げてSSHキーを管理出来るようにする

1Password 8で見た目が変わったり機能が増えたりしていますが、自分が一番おっと思ったのはSSHキーを管理出来るという所ですね。
というわけで、メモがてら記事にしていこうと思います。

インストール

いま(2022/7/9)時点でまだMac AppStoreには8はきていないのでダウンロードします。

1password.com

1Password Installer.app を起動すれば自動的にアップデートされます。

だいぶ見た目が変わってます。(ダークモードに対応したのね)

設定

まずは設定を有効にします。
1Password > 環境設定 > 開発者
を開きます。

デフォルトだと何もチェックがついてない状態ですね。

SSHエージェントを使用する にチェックします。
1Password CLI用の生体認証ロック解除op というコマンドを使うようなのだがとりあえず今は使わないのでそのままです。

1PasswordがSSHキー名をディスクに保存出来るようにします を許可します。
FingerPrintを表示されても分からんしね。

~/.ssh/config に表示されているスニペットを追加します。(xxxxxxxxxxのところのパスは環境によって違うようです)

Host *
    IdentityAgent "~/Library/Group Containers/xxxxxxxxxx.com.1password/t/agent.sock"

Remember key approval が、until 1Password locks でも until 1Password quits でもどちらにしろロックしたらTouch IDが出てくるので、自動ロックの間隔を調整してもいいんじゃないでしょうか。
デフォルトの10分は自分には厳しすぎます。
1Password > 環境設定 > セキュリティ > 自動ロック
で、変更しちゃいます。

既存のキーを使ってSSHする

ラズパイへのSSHキーを1Passwordで管理してみます。
キーを作るときにEd25519かRSA(2048ビット以上)にしていない場合は作り直す必要があります。
お勧めはEd25519らしいです。

とりあえず既にあるRSAの鍵をインポートします。
+新規アイテム > SSHキー で登録します。

秘密鍵を追加 からキーファイルを読み込む でもいいし、ラズパイからわざわざ持ってこなこなくても クリップボードから鍵を張り付け で登録出来ます。
既存のキーならローカルにあるかもしれないですが、クリップボード貼り付けができるのは地味に便利。
パスフレーズが設定されていれば入力画面が出てきます。

キーが登録出来ました。

それではログインしてみます。
既存のキーなので ~/.ssh/authorized_keys は設定済みの想定です。

Touch IDでログイン出来ました!

ssh-keygenを使わずに1Passwordで新しいキーを作る事も出来ます。
その場合、秘密鍵をどこにもコピーせずに公開鍵をauthorized_keysに登録するだけなのでちょっと安心ですね。

Git Cloneできるようにする

個人ではGitHub、仕事ではBitbucketを使っているので両方試してみます。

GitHub

まずGitHubから。
Settings > SSH and GPG keys へ行きます。

New SSH keyを押します。

Titleをクリックすると、1Passwordのブラウザ拡張が入っていれば SSHキーの作成 が出ます。

作成と入力を押すとキーが作成されて1Passwordへ登録され、GitHubの画面に反映されますので、Add SSH key を押して登録します。

それではCloneしてみます。
まずはCLIで。

git clone git@github.com:gozuk16/test.git
Cloning into 'test'...
remote: Enumerating objects: 35, done.
remote: Counting objects: 100% (14/14), done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 35 (delta 5), reused 14 (delta 5), pack-reused 21
Receiving objects: 100% (35/35), 5.04 KiB | 1.26 MiB/s, done.
Resolving deltas: 100% (9/9), done.

出来ました。

次に自分が使ってるGitクライアントのForkでやってみます。
CloneするときのプロトコルhttpsからSSHに切り替えます。

1PasswordがTouch IDの画面を出してくれるのでピッと触ればCloneできます。

うーん便利!

ちなみに、GitHubは2023年末までにTwo-factor authenticationを設定せよというわけで2FAも1Passwordで設定しています。
Sign inの時に1Passwordでパスワードを入力すると遷移先ではtokenが自動でセットされるので便利です。(まあいいという事にしといて...)

Bitbucket

基本的には同じです。
Personal settings > SSH 鍵 > 鍵を追加 でGitHubと同じように出来ます。

その他

  • いまのところ保管庫はデフォルトで作られるPersonalじゃないとダメみたいです

増えてくるとちょっと分かりにくくなるので、別の保管庫も何れ使えるようになるといいな。

  • TailscaleにSSHの接続管理をしてくれる機能が追加されたようです

tailscale.com

codezine.jp

TailscaleのエージェントにSSHを内包してるのかな?
sshdを立てる必要すらないという事で、結構すごいなーと思った。
こうなると1Passwordとか言ってる次元じゃないよね。
調べようと思ってるけど、いまのところ会社でTailscale使えないので何となく先送りしてる。。。

iTerm2のプロファイルごとに表示する仮想デスクトップ(スペース)を切り替える

自分はMacの仮想デスクトップを常時2つ使っていてデスクトップ1を通常業務に、デスクトップ2はコード書き用にして、iTerm2のプロファイルも通常業務用とコード書き用に分けています。
iTerm2を起動したら任意のスペースに表示するっぽい設定があるのにうまく出来ていませんでした。
改めて試してみたらできちゃったのでメモしておきます。

まずスペースの設定は、 Preferences > Profiles > Window > Space です。
多分そうだろうと思っていたけどここで間違いないです。
ここで表示したいスペースを選びます。
自分だったら通常業務用の desktop1 プロファイルは Space 1に、コード書き用の desktop2 プロファイルは Space 2 に設定します。

ここで、スペースを選ぶと注意喚起のメッセージが出ます。

これを無視していたのがよくなかった…
ここに書いてあるように、システム環境設定で ^ 1 とか ^ 2 を有効にしないといけません。

システム環境設定 > キーボード > ショートカット > Mission Control で、 デスクトップ1へ切り替え とか デスクトップ2 へ切り替えと出ているのを必要な分だけチェックします。

最後にDockのアイコンから設定を確認します。
iTerm2アイコン右クリック > オプション > 割り当て先 です。
デフォルトで なし になってると思いますが、自分はうまくいかなくていじってたので なし に戻します。

これで、プロファイル毎に表示するデスクトップを固定することが出来ました!

gopsutilで温度情報を取得する(OS別)

この記事は、Infocom Advent Calendar 2021 7日目の記事です。

qiita.com

あまり業務とは関係ないのですが、shirou/gopsutilを使ってサーバ情報を表示するアプリを作っている過程で、各種温度情報が取れるのが分かりました。 ただし、MacLinuxWindowsでそれぞれ違っていて、試行錯誤したので記録に残しておきます。

今年のアドベントカレンダーは全然埋まってないので、皆さん頑張ってw

Mac

開発をしているのがMacなのでまずはMacでとれるようにします。
個人で使っているMacbook Air(Intel) Mojaveです。

package main

import (
    "fmt"
    "os"

    "github.com/shirou/gopsutil/v3/host"
)

func main() {
    h1, h2, h3, _ := host.PlatformInformation()
    fmt.Println(h1, h2, h3)
    t, err := host.SensorsTemperatures()
    if err != nil {
        fmt.Println(err.Error())
        os.Exit(1)
    }
    for _, v := range t {
        fmt.Printf("sensorKey: %s, temperature: %2.0f, sensorHigh: %2.0f, sensorCritical: %2.0f\n", v.SensorKey, v.Temperature, v.High, v.Critical)
    }
}

実行してみます。

$ go run main.go
darwin Standalone Workstation 11.5.1
sensorKey: TA0P, temperature:  0, sensorHigh:  0, sensorCritical:  0
sensorKey: TA1P, temperature:  0, sensorHigh:  0, sensorCritical:  0
sensorKey: TC0D, temperature:  0, sensorHigh:  0, sensorCritical:  0
sensorKey: TC0H, temperature:  0, sensorHigh:  0, sensorCritical:  0
sensorKey: TC0P, temperature: 58, sensorHigh:  0, sensorCritical:  0
sensorKey: TB0T, temperature: 36, sensorHigh:  0, sensorCritical:  0
sensorKey: TB1T, temperature: 36, sensorHigh:  0, sensorCritical:  0
sensorKey: TB2T, temperature: 32, sensorHigh:  0, sensorCritical:  0
sensorKey: TB3T, temperature:  0, sensorHigh:  0, sensorCritical:  0
sensorKey: TG0D, temperature:  0, sensorHigh:  0, sensorCritical:  0
sensorKey: TG0H, temperature:  0, sensorHigh:  0, sensorCritical:  0
sensorKey: TG0P, temperature:  0, sensorHigh:  0, sensorCritical:  0
sensorKey: TH0P, temperature:  0, sensorHigh:  0, sensorCritical:  0
sensorKey: TM0S, temperature:  0, sensorHigh:  0, sensorCritical:  0
sensorKey: TM0P, temperature: 54, sensorHigh:  0, sensorCritical:  0
sensorKey: TN0H, temperature:  0, sensorHigh:  0, sensorCritical:  0
sensorKey: TN0D, temperature:  0, sensorHigh:  0, sensorCritical:  0
sensorKey: TN0P, temperature:  0, sensorHigh:  0, sensorCritical:  0
sensorKey: TI0P, temperature:  0, sensorHigh:  0, sensorCritical:  0
sensorKey: TI1P, temperature:  0, sensorHigh:  0, sensorCritical:  0
sensorKey: TW0P, temperature: 49, sensorHigh:  0, sensorCritical:  0

TA0Pとかは、smc_darwin.hで定義されているようです。

https://github.com/shirou/gopsutil/blob/master/v3/host/smc_darwin.h

#define AMBIENT_AIR_0          "TA0P"
#define AMBIENT_AIR_1          "TA1P"
#define CPU_0_DIODE            "TC0D"
#define CPU_0_HEATSINK         "TC0H"
#define CPU_0_PROXIMITY        "TC0P"
#define ENCLOSURE_BASE_0       "TB0T"
#define ENCLOSURE_BASE_1       "TB1T"
#define ENCLOSURE_BASE_2       "TB2T"
#define ENCLOSURE_BASE_3       "TB3T"
#define GPU_0_DIODE            "TG0D"
#define GPU_0_HEATSINK         "TG0H"
#define GPU_0_PROXIMITY        "TG0P"
#define HARD_DRIVE_BAY         "TH0P"
#define MEMORY_SLOT_0          "TM0S"
#define MEMORY_SLOTS_PROXIMITY "TM0P"
#define NORTHBRIDGE            "TN0H"
#define NORTHBRIDGE_DIODE      "TN0D"
#define NORTHBRIDGE_PROXIMITY  "TN0P"
#define THUNDERBOLT_0          "TI0P"
#define THUNDERBOLT_1          "TI1P"
#define WIRELESS_MODULE        "TW0P"

CPU関係では、TC0DとTC0Hは取れておらず、TC0Pだけ取れているようです。
PROXIMITYは近い・近接的な意味のようなのでCPU温度を見るならとりあえずTC0Pでよいのかなと思いました。

Windows

お仕事ではWindowsサーバを使うのでこちらも取得してみます。

とりあえず同じコードを実行してみます。

C:\home\gozu\go\src\github.com\gozuk16\cputemp>go run main.go
Microsoft Windows 10 Pro Standalone Workstation 10.0.19042 Build 19042
例外が発生しました。 (アクセスは拒否されました )
exit status 1

どうやらWindowsでは管理者権限が必要みたいですね。
管理者権限で実行してみます。

C:\home\gozu\go\src\github.com\gozuk16\cputemp>go run main.go
Microsoft Windows 10 Pro Standalone Workstation 10.0.19043 Build 19043
sensorKey: ACPI\ThermalZone\THM0_0, temperature: 40, sensorHigh:  0, sensorCritical:  0

ACPI\ThermalZone\THM0_0というのが1つだけ取れました。

これはWMIの情報のようです。wmicで確認のため同じものを取得してみます。 (この場合も管理者権限が必要です)

> wmic /namespace:\\root\wmi PATH MSAcpi_ThermalZoneTemperature get CurrentTemperature
Temperature
CurrentTemperature
3132

3132度???
いやいやそんなわけない。
これはケルビンという値を10倍したものが取れるものらしい。
ケルビンとは絶対温度の事で、摂氏を求めるには「ケルビン - 273.16」とすればよい
つまり、摂氏に直すと 3132 / 10 - 273.16 = 40.04 となります。
どうやらプログラムで取った値は正しそうですね。

管理者権限が必要なのは面倒くさいなぁ。

Linux

VMじゃない実機のLinuxだとラズパイがあるのでやってみました。

Raspberry Pi OS 64bit版にしてあるのですが、どうやらaptで入るGoは1.11という古いバージョンなのでダウンロードして入れます。

$ wget https://golang.org/dl/go1.16.7.linux-arm64.tar.gz
$ sudo tar -C /usr/local -xzf go1.16.7.linux-arm64.tar.gz
$ vi .bashrc
# ↓を追加
export PATH=$PATH:/usr/local/go/bin
$ . .bashrc
$ go version
go version go1.16.7 linux/arm64

同じものを実行します。

$ go run main.go
raspbian debian 10.10
sensorKey: cpu_thermal, temperature: 62 sensorHigh:  0, sensorCritical:  0

cpu_thermalというのが1つ取れました。
確認のためコマンドでたたいてみます。

$ cat /sys/class/thermal/thermal_zone0/temp
62322

62322度な訳は無いw
これは1000倍で取れるそうなのであってます。

docker composeでInfluxDBの起動エラー

久しぶりにInfluxDBのdockerを起動したら動かなくなってた。

$ docker compose up
[+] Running 2/2
 ⠿ Network influxdb_default       Created                                                                                                        0.0s
 ⠿ Container influxdb_influxdb_1  Created                                                                                                        0.0s
Attaching to influxdb_1
influxdb_1  | chown: changing ownership of '/var/lib/influxdb2': Permission denied
influxdb_1  | chown: changing ownership of '/var/lib/influxdb2/engine': Permission denied
influxdb_1 exited with code 1

ぐぐったらこれが引っかかった。

github.com

user を追加したら動いた。

version: '3'
services:
  influxdb:
    image: influxdb
    ports:
      - "8086:8086"
    volumes:
      - ./influxdb/data:/var/lib/influxdb
      - ./influxdb/config:/etc/influxdb2
      - ./influxdb/scripts:/docker-entrypoint-initdb.d
    environment:
      - DOCKER_INFLUXDB_INIT_MODE=setup
      - DOCKER_INFLUXDB_INIT_USERNAME=ユーザ名
      - DOCKER_INFLUXDB_INIT_PASSWORD=パスワード
      - DOCKER_INFLUXDB_INIT_ORG=組織を指定
      - DOCKER_INFLUXDB_INIT_BUCKET=バケットを指定
      - DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=トークンをここに書くよ
    user: "501:501"

Karabiner-elementsでMacのPowerPointの行末移動をctrl+eで出来るようにする

MacPowerPointでCtrl+eと打つと「文字列中央揃え」になるんですよね。
これ間違いすぎてストレスたまりすぎたのでKarabinerで行末移動になるようにしました。

frontmost_application_if でオフィス系ソフトとブラウザを指定していますが、 オフィス系ソフトとChromeは上手くいっていて、Firefox、Edge、Safariがまだ上手くいってません。
うーんなんだろう。

    {
      "description": "Left Control + e to End",
      "manipulators": [
        {
          "type": "basic",
          "from": {
            "key_code": "e",
            "modifiers": {
              "mandatory": [
                "control"
              ]
            }
          },
          "to": [
            {
              "key_code": "end"
            }
          ],
      "conditions": [
            {
              "type": "frontmost_application_if",
              "bundle_identifiers": [
                "^com\\.microsoft\\.Excel$",
                "^com\\.microsoft\\.Powerpoint$",
                "^com\\.microsoft\\.Word$",
                "^org\\.mozilla\\.firefox$",
                "^org\\.google\\.Chrome$",
                "^com\\.microsoft\\.edgemac$",
                "^com\\.apple\\.Safari$"
              ]
            }
      ]
        }
      ]
    }

BigGanttでJIRAのFilterが出てこないとき

BigGanttでプロジェクト作った後で、タスクを選択するためにJIRAでフィルター作っても候補が出てこない。
いつも対応方法を忘れるのでメモ。

f:id:gozuk16:20210531183005p:plain

Filterのところだけなぜか新しく作ったり修正してもなかなか反映されない。
Cacheをクリアしたら出てきたので、キャッシュクリアの方法。
詳細→アプリ→BigGantt→App configuration→Advanced→Clear cache

f:id:gozuk16:20210531183135p:plain

ラズパイ4で64bit OSをmSATA接続のSSDから起動させる

最初に書いておくと、盛大にハマりました。
この手の記事はぐぐればたくさん引っかかるし皆さんうまくいっているようです。
ただ失敗の記事はあまり引っかからないので書いとこうかなと思ったわけですね。

買ったもの

購入したのは、Raspberry Pi 4 Model B (メモリ8GB)です。
ヨドバシで共立プロダクツのスターターセットを購入しました。
付属のSDカードにはRaspberry Pi OS 32bit版が入っていました。

$ sudo dmesg | grep Machine
[    0.000000] OF: fdt: Machine model: Raspberry Pi 4 Model B Rev 1.4

$ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 10 (buster)"
NAME="Raspbian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

$ uname -a
Linux raspberrypi 5.10.17-v7l+ #1403 SMP Mon Feb 22 11:33:35 GMT 2021 armv7l GNU/Linux

速いストレージにしたかったので外付けのSSDも一緒に買おうと思ったのですが、ちょっと急いでいたのでヨドバシの購入ページでお勧めされていたトランセンドのmSATA3/128GB(TS128GMSA370)を一緒に買いました。
今思うとこれが良くなかった。いまさらマイナーなmSATAを買う事もなかったんだよね。ちゃんと調べとけばなー。
届いてからUSB3.0へ変換するケースが必要な事に気がつき、AmazonでZheinoのUSB3.0-mSATAケースを買いました。(アホだな)

https://www.amazon.co.jp/gp/product/B06XSD129T/

ついでに自分のモニターにはHDMIがないのでHDMI DVI変換アダプター HDMIメスタイプ BSHDADVも買いました。

www.buffalo.jp

ちゃんと調べないから、始めるまでが長いw

ブートローダー(EEPROM)の設定

結論から言うと、最新化する必要はありませんでした…

初期状態で以下のようになっています。
2020-09-03版ですね。

$ sudo rpi-eeprom-update
BOOTLOADER: up-to-date
   CURRENT: 202093日 木曜日 12:11:43 UTC (1599135103)
    LATEST: 202093日 木曜日 12:11:43 UTC (1599135103)
   RELEASE: default (/lib/firmware/raspberrypi/bootloader/default)
            Use raspi-config to change the release.

  VL805_FW: Using bootloader EEPROM
     VL805: up-to-date
   CURRENT: 000138a1
    LATEST: 000138a1

$ vcgencmd bootloader_version
Sep  3 2020 13:11:43
version c305221a6d7e532693cc7ff57fddfc8649def167 (release)
timestamp 1599135103
update-time 0
capabilities 0x00000000

最新のほうがいいかなと思って、 FIRMWARE_RELEASE_STATUS="stable" にしてから2021-03-18版にしましたが、必要はなく元に戻しています。

USBで起動出来るようにしておく必要はあります。
初期状態の設定は以下のようになっています。

$ vcgencmd bootloader_config
[all]
BOOT_UART=0
WAKE_ON_GPIO=1
POWER_OFF_ON_HALT=0
DHCP_TIMEOUT=45000
DHCP_REQ_TIMEOUT=4000
TFTP_FILE_TIMEOUT=30000
TFTP_IP=
TFTP_PREFIX=0
BOOT_ORDER=0x1
SD_BOOT_MAX_RETRIES=3
NET_BOOT_MAX_RETRIES=5
[none]
FREEZE_VERSION=0

起動の優先順位をUSBにするには raspi-config で簡単に出来ます。

$ sudo raspi-config
→ 6 Advanced Options   Configure advanced settings
  → A6 Boot Order      Choose network or USB device boot
    → B2 USB Boot      Boot from USB if available, otherwise boot from SD Card

これでSDカードを抜かなくてもUSBから起動します。(USBが無ければSDカードで上がります)
この設定をすると再起動が要求されますが、一度シャットダウンしておきます。
SSDから64bit OSで起動している現在の設定は以下のようになっています。
(BOOT_ORDER=0xf14 となっている所がUSB起動の設定です)

$ vcgencmd bootloader_config
[all]
BOOT_UART=0
WAKE_ON_GPIO=1
POWER_OFF_ON_HALT=0
DHCP_TIMEOUT=45000
DHCP_REQ_TIMEOUT=4000
TFTP_FILE_TIMEOUT=30000
ENABLE_SELF_UPDATE=1
DISABLE_HDMI=0
BOOT_ORDER=0xf14

SSDへOS書き込み

今どきは、Raspberry Pi Imagerで簡単に書き込みが出来ます。
Mac版のRaspberry Pi Imagerを以下からダウンロードして起動します。

www.raspberrypi.org

32bit版ならこのツールから自動でダウンロードして書き込みまでしてくれますが、せっかくの8GBを有効利用したいので64bit版のRaspberry Pi OSを自分でダウンロードします。
今回は 2021-03-04-raspios-buster-arm64.zip を使います。
ここから落としました。

ftp.jaist.ac.jp

ホスト名やSSHWiFiの設定をあらかじめ出来ます。
Ctrl+Shift+x で設定画面が出てきますので設定しました。

CHOOSE OS から Use custom を選択し、あらかじめダウンロードしておいた 2021-03-04-raspios-buster-arm64.zip をセットします。

CHOOSE SD CARD で、Macに繋げたSSDを選択します。

WRITE を押します。

簡単です。

SSD起動

64bit OSを書き込んだSSDをラズパイにつなぎます。
当然、USB 3.0の口につなぐのですがこれでハマりました。

まず初回起動時ですが、root filesystemにある空き容量を検知して勝手にパーティションのリサイズが始まります。
これが結構時間がかかるので、LEDランプの点滅が収まるまで辛抱強く待ちましょう。うちは30分以上掛かりました。

その後、起動プロセスが始まるのですがなぜか EXT4-fs error が大量に出続けます。
fsck掛けたり、あらかじめパーティションを拡張しておいたり、EEPROMのバージョンを戻したり(最初は2021-03-18でやってた)、ケーブルを変えてみたり別のSSDと別のケースを持ってきたり、色々試しましたがどうしても解消しません…
いろいろぐぐって、このページにあるようにUSB 2.0にSSDを差し替えるとあっけなく起動しました。

qiita.com

何だったんだ…

諦めきれず、他に情報がないか調べていたら今度はこちらのサイトにあたりました。

signal-flag-z.blogspot.com

これがビンゴ!!
自分もこの記事と同じ、 JMicron Technology Corp. / JMicron USA Technology Corp. JMS567 SATA 6Gb/s bridge でした。

この記事の通りやって無事、USB 3.0で起動しました!

まずはとりあえずUSB 2.0につないだ状態で起動して設定します。

$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 152d:0578 JMicron Technology Corp. / JMicron USA Technology Corp. JMS567 SATA 6Gb/s bridge
Bus 001 Device 003: ID 1bcf:0029 Sunplus Innovation Technology Inc.
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

$ lsusb -t
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 5000M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 3: Dev 3, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
        |__ Port 4: Dev 4, If 0, Class=Mass Storage, Driver=uas, 480M

JMicronのチップが使われているようです。
Driverが uas になっている事が確認出来ます。
こちらの記事によるとUSAは、USB Attached SCSIというプロトコルで、USB mass-storageより高速なのですが、ドライバの実装がよくないと遅くなる事があるようです。

www.raspberrypi.org

/boot/cmdline.txtカーネルパラメーターを追加して、usb-storageで動作するようにします。
先頭に usb-storage.quirks=152d:0578:u というパラメータを入れます。改行は入れてはダメです。

$ sudo vi /boot/cmdline.txt
console=serial0,115200 console=tty1 root=PARTUUID=7ff05857-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
↓
usb-storage.quirks=152d:0578:u console=serial0,115200 console=tty1 root=PARTUUID=7ff05857-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles

これでシャットダウンして、SSDをUSB 3.0の口に差し替えます。
電源を入れると起動しました!すばらしい!!

$ lsusb
Bus 002 Device 002: ID 152d:0578 JMicron Technology Corp. / JMicron USA Technology Corp. JMS567 SATA 6Gb/s bridge
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

$ lsusb -t
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 5000M
    |__ Port 2: Dev 2, If 0, Class=Mass Storage, Driver=usb-storage, 5000M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M

ちゃんとドライバが切り替わっているようです。(※マウスは外しちゃいました)
一応簡単にベンチマーク取っておきます。

  • SDカード
$ sudo hdparm -t /dev/mmcblk0p2

/dev/mmcblk0p2:
 HDIO_DRIVE_CMD(identify) failed: Invalid argument
 Timing buffered disk reads:  28 MB in  3.00 seconds =   9.32 MB/sec
  • USB 2.0でのSSD
$ sudo hdparm -t /dev/sda2

/dev/sda2:
 Timing buffered disk reads: 112 MB in  3.03 seconds =  36.97 MB/sec
  • USB 3.0でのSSD
$ sudo hdparm -t /dev/sda2

/dev/sda2:
 Timing buffered disk reads: 690 MB in  3.00 seconds = 229.96 MB/sec

やったね。ちゃんと速くなってるよ!
フルスペックじゃないにしてもまあいいでしょう。
しかし、使い始めるまで長かったなー。

結論

ちゃんと下調べして買おう…