Rancher Desktop はデスクトップ環境上に開発用の Kubernetes 環境や Docker 環境を構築できるアプリケーションです。Rancher は現在は SUSE の傘下にあり、Rancher Desktop も SUSE の Rancher チームを中心に開発されています。

先日、Docker Desktop が個人用途を除いて有償化されたため、代替として注目されています。

インストール

Rancher Desktop の公式ページにも案内がありますが、RPM パッケージは以下の OBS リポジトリで配布されています。
https://download.opensuse.org/repositories/isv:/Rancher:/stable/rpm/

インストールはいつもの通りです。

sudo zypper ar -c https://download.opensuse.org/repositories/isv:/Rancher:/stable/rpm/isv:Rancher:stable.repo
sudo zypper ref
sudo zypper in rancher-desktop

あとは、メニューから Rancher Desktop を選べば起動できます。

Kubernetes のインストール

起動すると、何をセットアップするか聞かれます。ここで、containerd を選ぶと nerdctl が使えるようになります。docker を選ぶと、docker コマンドや API が使えるようになるはずです。

しかし、何やらエラーが。

「Reset Kubernetes」でリセットしてみたところ、今度は何も出ませんでした。

クライアントコマンドは ~/.local/bin/ にインストールされるので、パスを通しておきます:

% ls ~/.local/bin
docker@ helm@ kubectl@ nerdctl@

~/.kube/config は勝手に設定してくれるので、らくらくですね。

完了すると Kubernetes などが動いている VM (Lima) が走っていることが分かります。

% pgrep -a qemu
984 /usr/bin/qemu-system-x86_64 -cpu host -machine q35,accel=kvm -smp 2,sockets=1,cores=2,threads=1 -m 6144 -boot order=d,splash-time=0,menu=on -drive file=/home/geeko/.local/share/rancher-desktop/lima/0/basedisk,media=cdrom,readonly=on -drive file=/home/geeko/.local/share/rancher-desktop/lima/0/diffdisk,if=virtio -cdrom /home/geeko/.local/share/rancher-desktop/lima/0/cidata.iso -netdev user,id=net0,net=192.168.5.0/24,dhcpstart=192.168.5.15,hostfwd=tcp:127.0.0.1:45009-:22 -device virtio-net-pci,netdev=net0,mac=52:55:55:f4:b7:19 -device virtio-rng-pci -display none -device virtio-vga -device virtio-keyboard-pci -device virtio-mouse-pci -parallel none -chardev socket,id=char-serial,path=/home/geeko/.local/share/rancher-desktop/lima/0/serial.sock,server=on,wait=off,logfile=/home/geeko/.local/share/rancher-desktop/lima/0/serial.log -serial chardev:char-serial -chardev socket,id=char-qmp,path=/home/geeko/.local/share/rancher-desktop/lima/0/qmp.sock,server=on,wait=off -qmp chardev:char-qmp -name lima-0 -pidfile /home/geeko/.local/share/rancher-desktop/lima/0/qemu.pid

使ってみる

簡単に何かを動かしてみましょう。

kubectl run redmine-test --image=redmine --port=3000
kubectl port-forward redmine-test 8080:3000

あとはブラウザで http://localhost:8080 にアクセス

kubectl によるトンネリングだけではなく、Rancher Desktop 側にもポートフォワーディング機能があるようですが、私の環境では出てきませんので、もう少し探してみます。

2021年を振り返って

By ftake @ 2021-12-26 21:50

この記事は openSUSE Advent Calendar の25日目です。

今年も openSUSE Advent Calendar にご参加頂きありがとうございました。みなさん忙しかったからか、今年は13日目で力尽きてしまいました。

最終日は openSUSE 関連の活動を振り返ってみようと思います。

1〜5月

うーん。何かを行った記録がありません。15.3 向けの開発をしていたかもしれません。

6月

openSUSE Leap 15.3 がリリースされました。今年はリリースパーティーも mini Summit もできなかったので、来年はしたいですね。

8月

openSUSE.Asia Summit をオンラインで開催しました。もともとは昨年にインドで開催する予定でしたが、インドチームによるオンライン開催になりました。

https://events.opensuse.org/conferences/oSAS21

8月末に開催された Open Developers Conference (ODC) では、Cross Distro Developers Camp の枠で Leap 15.3 とリリースモデルの話をしました。

https://speakerdeck.com/ftake/opensuse-leap-15-dot-3-toririsumoderufalsehua

9月〜11月

同じく活動の記録が…。

12月

今年も Advent Calendar を作成しました。序盤は勢い良くスタートしましたが…途中でばったり力尽きてしまった感じになってしまいました。

大晦日には Geeko Magazine Special Edition を久しぶり発行します。2年ぶりとは思えないページ数になっています。オンラインイベントが続くため、頒布機会がなかなか確保できなさそうですが、機会があればお手にとって見たください。

来年は?

今年は仕事が忙しく、Mozc の最新バージョンへのアップデートなど、いろいろやりかけになってしまいました。なんとか時間を取れるようにしたいなと思います。

Geeko Magazine Special Edition 2021冬

By ftake @ 2021-12-19 22:43

openSUSE Advent Calendar の 19日目です。今年はすっかり力尽きてしまいました。クリスマス前にはもう少し投稿できるようにしたいと思います。

2年ぶりの Geeko Magazine Special Edition を発行します。最初の頒布はコミックマーケット C99 で、スペースは 2日目 東テ14b です。今年のコミックマーケットは事前チケットや、ワクチン接種証明書または PCR 検査結果が必要ですので、参加される方はご注意下さい。

今回の記事は次の通りです。久しぶりにも関わらず、例年通り集まりました。

  • SLE とパッケージがバイナリレベルで同じに!openSUSE Leap 15.3 リリース
  • これは使える!?パッケージの説明一覧から見つけた面白そうなソフトウェアはこれだ!?
  • OmegaT + TexTra で、Weblate による packages の説明を翻訳
  • マニフェストデバッグから入る Kubernetes 入門
  • 小説: 女子高生アイドルがギーコと戯れる忙しい日々

コミックマーケット以降の頒布機会は未定です。当面 OSC はオンラインの予定ですので、どうするか検討します。

Window AppMenu

By ftake @ 2021-12-10 00:00

みなさんは KDE のグローバルメニューを使ってますか? グローバルメニューは KDE Plasma のアップレットで、アクティブなウインドウのメニューが表示されます。画面上端にパネルを置いて、そこにこれを配置することで、macOS 風の UI を実現できます。

しかし、このグローバルメニューですが、時々不安定になり、アプリケーションによっては表示されなくなったりすることがあります。

同じようにアクティブウインドウのメニューを表示できるアップレットに Window AppMenu というものがあり、こちらであれば問題が起きないことがあります。困ったときは試してみてください。
https://github.com/psifidotos/applet-window-appmenu

インストール方法はそんなに難しくはなく、Installation.md に書かれている以下のパッケージと

sudo zypper in -y xrandr cmake make gcc gcc-c++ extra-cmake-modules libqt5-qtbase-devel libqt5-qtdeclarative-devel libKF5WindowSystem5 plasma-framework-devel libSM-devel libqt5-qtx11extras-devel libkdecoration2-devel kconfigwidgets-devel kwidgetsaddons-devel kdeclarative-devel

このあたりを追加でインストールしました

sudo zypper in kwayland-devel plasma5-workspace-devel plasma5-addons-devel kitemmodels-devel

あとは install.sh を実行するとインストールされ、パネルに Window AppMenu を追加できるようになります。

openSUSE Advent Calendar 2021 の 4日目です。書き手がまだまだ足りませんので、ぜひ気軽に投稿をお願いします。

今日は新しいPCの話です。これまでは、2012年に組んだ Core i7-3770S のデスクトップ PC を Windows 10 で、Dynabook VZ72 (i7-7500U) で openSUSE Leap を使ってきました。このデスクトップPCのほうが、まもなく10年ということもあり、時々フリーズしたり、性能不足なところもあり、半導体が高騰している微妙なタイミングですが、完全に壊れる前に買い換えることにしました。

構成

新しい PC の構成は次のとおりです。

  • CPU: Ryzen 7 5700G
  • M/B: Gigabyte X570S
    • ネットワークカードは RTL8125 2.5GbE
  • メモリー: SanMax Technologies PC4-25600 16GB CL22 Skhynix × 2
  • SSD: CFD CSSD-M2B5GPG3VNF (512GB, PCIe Gen 4×4)
  • ケース: Fractal Design Define 7 Compact
  • 電源: Antec NeoECO GOLD 550W(旧PCから流用)

マザーボードが無駄にX570なのは、実家の DeskMini A300 の PC の調子が悪く、故障箇所の切り分けを行うために旧CPUに対応したX570にしました。ちょっと無駄です。さらに、GPU 内臓の Ryzen 7 5000G は PCIe が Gen 3 になってしまうので、X570 の意味がありません…。残ったメリットは、増設した場合のメモリークロックくらいでしょうか。

今回こそコンパクトな PC にしたいと思っていたのですが、この状況でマザーボードの選択肢が少なく、結局 ATX ケースになってしまいました。Fractal Design の 5インチベイのないコンパクトラインのケースなのですが、今まで使っていた 15年以上前の ATX ケースよりずいぶん大きいです。最近、デスクトップ PC をわざわざ買う人は、ハイエンドのグラッフィックカードを付けるからか仕方がないですね。HDD は NAS に移してしまったので、3.5インチや2.5インチベイも使っておらず、中身はすっからかんです。そのうち簡易水冷でも導入して有効活用することにしましょう。

openSUSE Leap を入れる

これまで、デスクトップでは Windows を使っていましたが、最近、Steam で配信されているゲーム(AOCとか)は Linux でも動くので、ホスト OS を openSUSE にしてしまうことにしました。加えて、openSUSE 界隈で流行っているかもしれない、PCI pass-through を使って、物理 GPU を Windows ゲストに直接接続すれば快適な Windows ゲスト環境が作れるはず…と考えていました。結局、Windows ゲストはちょっと試しただけで使っていないのですが、この話はまた今度。

さて、openSUSE Leap のカーネルは、新しいハードウェアに対応できるようにパッチがたくさん入っていますが、ちょっと古いです。そのため、最新のハードウェアでは一部の機能が使えないことがあります。今回、Leap は普通にインストールできましたが、画面の解像度が 4K にならないし、もっさりしていて、少なくともグラフィックドライバまわりが動いてない感じでした。

そんなときは、最新のカーネルを OBS から持ってきます。Leap 向けの最新カーネルは以下の OBS プロジェクトでビルドされています。このリポジトリを登録して、kernel-default や kernel-frimware-* をインストールすれば OK です。
https://build.opensuse.org/project/show/Kernel:stable:Backport
このリポジトリは openSUSE Leap としてメンテされているものではありませんのでご注意ください。

新しいPCは?

8コア、16スレッドということで、やっぱりパッケージのビルド作業が快適になりました。CPU内蔵のGPUですが、Full HDでゲームをする分には十分で、グラフィックカードを増設するのはだいぶ先になりそうです。

この記事は小江戸らぐ 5月のオフな集まりの発表ネタです。

2回目の夏を迎えるに当たり、自宅ファイルサーバーの熱とファンの音が気になり、モニタリングしてみることにしてみました。今回は他の用途でも興味があった Grafana を使ってみました。Grafana は CPU 使用率やメモリ使用量といったハードウェアから、データベースやアプリケーションの性能といった様々なメトリクスを可視化・分析するための Web アプリケーションです。インタラクティブに操作できたり、かっこいい見た目だったりで、最近よく見かけます。

小江戸らぐ向け注記: よくカロスさんの発表に出てきます。K8s のクラスタやラズパイの環境センサーの表示で使っていますね。

Grafana Cloud

今回はちょっと横着して、Grafana の SaaS である Grafana Cloud を使いました。Grafana といえば、多くの場合、メトリクス収集と時系列データベース機能を持つ Prometheus と組み合わせ、これら2つをどこかにインストールして使います。Grafana Cloud では Grafana 本体と Prometheus のデータベース部分は Grafana Cloud で動いているものを使うことができます。データの収集は Prometheus からデータベース部分などを簡略化した Grafana Agent で収集できます。

気になるお値段ですが、Free プランがあります。メトリクスの保持期間は2週間というのがポイントになりますが、ちょっと試して見るには十分です。無料プランの主なスペックはこんな感じです:

  • 10,000 系列(種類)までの Prometheus または Graphite のメトリクス
  • 50 GB のログ
  • 14日間のメトリクスとログの保持期間
  • 3人までのチームメンバー

アカウントを作るためにクレジットカードなどの情報は特に必要ありません。 Grafana Cloud のページでアカウント作成に進み、GitHub などの SSO でログインすればすぐ準備完了です。

メトリクス収集

次に、メトリクスの収集を始めましょう。雷のアイコン(⚡) > Walk through をクリックすると、スクリーンショットのように Grafana Cloud がサポートしているプラットフォームのメトリクス収集を簡単にセットアップできるガイドが用意されています。今回は Linux Server を使用します。Prometheus では Node Exporter と呼ばれているものです。

Linux Server をクリックすると、セットアップするためのスクリプトが表示されます。「Choose your OS」には openSUSE が見当たりませんが、「RedHat – based」で OK です。Go言語で実装されたアプリなので、システムライブラリにほとんど依存していません。

あとは、その下に表示されたスクリプトを実行すれば OK です。Grafana Agent の RPM のインストールと設定ファイルの作成、起動まで一気に行われます。セットアップが終わると、最初から用意されているダッシュボードに収集した情報が表示されます。(datasource で grafanacloud-xxxx-prom を選択)

ダッシュボードの作成

もちろん、ダッシュボードを自分で組み立てることもできます。ここではパネルを配置し、Visualization を Time Series にして次を追加してみました。収集されているメトリクスの一覧がドロップダウンメニューに表示されるので、ここからそれっぽいものを選んで追加することができます。

  • node_cpu_scaling_frequency_hertz
  • instance:node_cpu_utilisation:rate1m
  • node_hwmon_temp_celsius

各系列のスタイルや、単位、Y軸の設定は、ちょっとわかりにくいですが Overrides タブで系列を選んで個別に設定できます。

このファイルサーバーは普段ほとんどアイドル状態なのですが、CPU クロックが思った以上に落ちていないことが分かりました。ファンコントロールのターゲット温度が45℃設定なのですが、55℃くらいをキープしているようです。

おわりに

Grafana Cloud を使って自宅ファイルサーバーの監視を簡単にしてみました。そして Grafana Agent が CPU 時間を他と比較して使ってしまっていますので、場合によっては収集する項目を減らすなどを考えたほうが良いかもしれません。

自宅サーバーをセットアップした際に、すべてを HDD にインストールしていたのですが、今回、/home と /boot、過去のスナップショットデータ以外を SSD に引っ越しました。このとき、Btrfs のサブボリュームとしての引っ越しをしてみました。

最初に openSUSE の Btrfs のサブボリューム構成についておさらいです。Snapper が有効化された状態のサブボリューム構成は次のようになっていました。Btrfs の / には @ というサブボリュームが1つだけあります。@ の中にマウントしたシステムの / にあるディレクトリに対応したサブボリュームがあります。ちなみに /@ が / としてマウントするのではなく、それぞれのサブボリュームごとに /etc/fstab でマウントしています(例: /@/home が /home)。Snapper を使用している場合は 1 番目のスナップショットが現在の / です。

以下のリストに無い、/@/.snapshots/1/ や /@/boot/grub2/ はサブボリュームではなく、その上にあるサブボリューム内のディレクトリです。

/@
/@/.snapshots
/@/.snapshots/1/snapshot
略
/@/.snapshots/61/snapshot
/@/boot/grub2/i386-pc
/@/boot/grub2/x86_64-efi
/@/home
/@/opt
/@/root
/@/srv
/@/tmp
/@/usr/local
/@/var
/@/var/lib/machines

さて、今回は /@/home と /@/boot/* を HDD に残し、その他を SSD に移動することにしました。パーティション全体であれば、dd で、ファイルレベルであれば rsync と色々な方法がありますが、今回は Btrfs のサブボリュームを他の Btrfs ファイルシステムに転送する btrfs send を使いました。

作ってみたスクリプトを先に貼り付けて、ポイントを個別に説明します。使い方はコピー元を /dev/sda1、コピー先を /dev/sdb1 とし、次のように使います。3番目の引数はスキップするサブボリュームのパターンです。/dev/sdb1 は mkfs.btrfs でフォーマットしてある前提です。
$ btrfs-subvols-copy.sh /dev/sda1 /dev/sdb1 "@/home|@/.snapshots/[2-9][0-9]*|@/boot"

#!/bin/sh

set -eu

exclude=$3

# mounting root volumes
workdir=`mktemp -d`
echo "working directory is '$workdir'"
cd $workdir
mkdir src
mkdir dest

# ルートのサブボリュームをマウントマウントする
echo "mounting root subvolumes of src and dest"
mount -t btrfs -o subvol=/ $1 $workdir/src
mount -t btrfs -o subvol=/ $2 $workdir/dest

src=$workdir/src
dest=$workdir/dest

backup_date=`date -u +'%s'`

# サブボリュームの一覧を出力
for subvol in `btrfs subvolume list --sort=path $src | awk '{print $9}'`; do
    echo -n ">> $subvol: "
    if [[ $subvol =~ $exclude ]]; then
        echo "matched to a exclude pattern, skipped"
    elif [ -e $dest/$subvol ]; then
        echo "the destination subvolume already exists, skipped"
    else
        echo "create readonly tmp snapshot"
        tmpsnap=$subvol.tmpsnap
        # スナップショットを作って送る
        echo "creating a read-only temporary snapshot to send] $src/$tmpsnap"
        btrfs subvolume snapshot -r $src/$subvol $src/$tmpsnap
        echo "copying"
        btrfs send $src/$tmpsnap | btrfs receive $dest/`dirname $tmpsnap`

        # 送信用のスナップショットを消す
        echo "deleting the temporary snapshot: $src/$tmpsnap"
        btrfs subvolume delete $src/$tmpsnap

        # .tmpsnap を外す
        echo "renaming the copied subvolume"
        mv $dest/$tmpsnap $dest/$subvol

        # property を元のサブボリュームと同じにする
        echo "copying subvolume properties"
        for prop in `btrfs property get $src/$subvol`; do
            btrfs property set $dest/$subvol ${prop/=/ }
        done

        echo "done"
    fi
done

echo "unmounting src and dest"
umount $workdir/src
umount $workdir/dest
echo "cleaning up working directory"
rmdir src
rmdir dest
rmdir $workdir

まずは、送信元、先のボリュームのマウントです。

# ルートのサブボリュームをマウントマウントする
echo "mounting root subvolumes of src and dest"
mount -t btrfs -o subvol=/ $1 $workdir/src
mount -t btrfs -o subvol=/ $2 $workdir/dest

送信元と先をマウントするだけなのですが、注意点が1つあります。Btrfs では任意のサブボリュームを選んでマウントすることができますが、何も指定しないと / ではなく、デフォルトのサブボリューム(btrfs subvolume set-default で設定可能)がマウントされてしまいます。特に Snapper を使用していると、1番目の Snapper スナップショットがデフォルトになっていますので、明示的に subvol でマウントしたいサブボリュームの指定が必要です。

次に、送信元のサブボリュームのリストアップです。

# サブボリュームの一覧を出力
for subvol in `btrfs subvolume list --sort=path $src | awk '{print $9}'`; do

--sort=path を指定して、親ディレクトリを含むサブボリュームを先にリストし、サブボリュームのツリー構造の親サブボリュームとディレクトリを先にコピーするようにします(存在しないとエラーになってしまいます)。

次に送信するところです。

        # スナップショットを作って送る
        echo "creating a read-only temporary snapshot to send] $src/$tmpsnap"
        btrfs subvolume snapshot -r $src/$subvol $src/$tmpsnap
        echo "copying"
        btrfs send $src/$tmpsnap | btrfs receive $dest/`dirname $tmpsnap`

btrfs send コマンドを使ってコピーするのですが、送信できるのは読み取り専用のサブボリュームなので、一度スナップショットを読み取り専用で作成し、このスナップショットを送ります。コピーは btrfs sendbtrfs receive のペアで行えます。サブボリュームの名前(パス)は送信元と同じものが作成されます。そのため、スナップショットの名前になってしまうので、あとで mv が必要でちょっと不便です(スナップショットを別のディレクトリに作成する方法もあり)。

注意が必要なことが1つあります。この送り方では Snapper のスナップショットを送れません。Snapper のスナップショットはスナップショット間で共通するデータを共有していますが、この方法ではこの共有が解けて複製されてしまいます。btrfs send のオプションにベースとなったスナップショットを指定し、差分だけを送る機能があるようなので、もう少し工夫すると実現できるかもしれません。

最後に、サブボリュームのプロパティのコピーです。

        # property を元のサブボリュームと同じにする
        echo "copying subvolume properties"
        for prop in `btrfs property get $src/$subvol`; do
            btrfs property set $dest/$subvol ${prop/=/ }
        done

送信前に読み取り専用のスナップショットを作成していますので、読み取り専用を含めた、送信後サブボリュームのプロパティをもと同じに戻します。