お家ファイルサーバーの構築

By ftake @ 2020-12-18 01:59

この記事は openSUSE Advent Calendar 18日目です。 残り、あと少しですが、まだ埋まってなく3年連続の完走がピンチ。みなさんご協力下さい。

この内容は小江戸らぐのオフな集まり2月と、オフだけどオンライン開催だった5月の発表内容でもあります。

ことの始まり

この春、ファイルサーバーを組みました。これまで、写真等の大きめのファイルはデスクトップに置いていましたが、タブレットやスマフォを使用しているとデスクトップを起動しないこともあり、アクセスするにはちょっと不便でした。かといってクラウドに上げるには容量が大きいのが現状です。

このとき、電源の故障で引退した、ちょっと古いけどまだ使える一式(Socket FM2 の M/B, AMD A4-5300 APU, DDR3 8 GBメモリ)があったのと、鹿さん から、使わなくなったファイルサーバー用の MiniITX ケースを頂いたので、これでファイルサーバーを組んでみることにしました。

RAID カード調達

HDD は NAS 用のものを適当に買うとして、1度はRAID 5 や 6 で組んでみたい!ということで、RAID カードを探しました。一般のご家庭(誤変換)では、数万円クラスのカードを使っているかと思いますが、この「ありあわせ構成」には不釣り合いです。安く入手する方法としては、ヤフオクなどでサーバーから抜き取ったものを探す手がありますが、あまりに古いと EFI に対応していなかったり、4 KB セクタや 2TB の壁にあたる可能性があります。また、中古品はキャッシュ保護用のバッテリーが死んでいる可能性もあります。

そこで今回は eBay で3世代前の Adaptec ASR-71605 の新古品を買ってみました。キャッシュ保護用のコンデンサ付き、送料込みで 8500円くらいでした。ドライバはカーネルに入っているのですぐに使えます。

意外と高かったのがケーブルでした。Mini SAS HD から SATA ×4にするもので、Amazon で 2500 円くらいでした。

OS インストール

セットアップに困ることはないはずが、openSUSE 15.1 をインストールすると、なぜかディスプレイドライバが固まります。いろいろ試したところ modeset ドライバを ACPI が有効な状態で使うとダメなようです。今回はディスプレイはほとんど使わないので nomodeset を起動オプションに追加することで回避しました。(modeset ドライバだと、コンソールの解像度がディスプレイにあわせて変わるので良いのですが…)

ファイルサーバーの設定

Samba は入れるだけです。とっても簡単ですね。

Btrfs にしてスナップショットを取るようにしました。このあたりはOSCのスライドや Geeko Magazine を見てください。

iSCSI サーバーは4月に書いた別の記事で。

バックアップの設定

重要なディレクトリを選んで USB 接続の HDD に1日に1回、Snapper の最新スナップショットからバックアップを取るようにしました。単純に rsync でコピーを取ります。Btrfs のバックアップといえば、ファイルシステムレベルで差分転送をできる btrfs send があります。しかし、ファイルシステムが壊れてしまった場合に、btrfs send を行うとバックアップも壊れる可能性があるのではないかと考え、今回は使用しませんでした。

タイマーとスクリプトはこのような感じです。タイマーの時間は Snapper の実行中にならないように気をつける必要があります。

backup-to-usb-disk.timer

[Unit]
Description=Back up files to USB disk daily

[Timer]
OnCalendar=*-*-* 6:20:00
Persistent=true

[Install]
WantedBy=timers.target

backup-to-usb-disk.service

[Unit]
Description=Back up files to USB disk

[Service]
ExecStart=/usr/local/sbin/backup-to-usb-disk.sh
Type=oneshot

backup-to-usb-disk.sh

#!/bin/bash

set -e

if [ ! -f /var/backup/backupdisk ]; then
    echo "Back up disk is not found"
    exit 1
fi

# home
snapshot_root=/home/.snapshots

cd $snapshot_root
latest_snapshot=`ls -1 | grep "[0-9]*" | sort -nr | head -n 1`/snapshot/
echo "creating back up of /home/.snapshots/$latest_snapshot"

if [ ! -e $latest_snapshot ]; then
    echo "Snapshot directory error"
    exit 1
fi

target_dir=/var/backup/home/

rsync -va --delete $latest_snapshot $target_dir 

様子見中

Snapper が走る時(おそらく)に btrfs-cleaner がかなり CPU を使うので、試しに Quota 機能を無効にしています。

おわりに

簡単にではありますが、ファイルサーバーを構築したときのいろいろを紹介しました。このファイルサーバーでは、先日書いた Spotify クライアント も動いています。新たな活用を始めたら記事にしたいと思います。

openSUSE Advent Calendar の14日目です。

オンラインイベント続きで Zoom が欠かせない今日この頃ですね。openSUSE 用のクライアントアプリの RPM パッケージは公開されていますが、なぜかリポジトリからの配信ではありません。そのため、アップデートが簡単にできなく不便です。

ということで、1コマンドで更新する小ネタです。単に zypper で URL を指定するだけです。自動更新がよければ、Systemd Timer で定期実行してもいいかもしれませんね。

sudo zypper in https://zoom.us/client/latest/zoom_openSUSE_x86_64.rpm

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

今日は Open Build Service(動画配信ソフトと紛らわしいですが、以下 OBS)をセルフホストする話です。

Open Build Service

ご存知の人も多いかと思いますが、まずは OBS についておさらいしておきたいと思います。OBS は openSUSE で使用しているパッケージの開発のためのシステムです。openSUSE で使用している OBS の Web UI には次のページからアクセスすることができます。
https://build.opensuse.org

OBS が提供する主な機能は以下のとおりです:

  • パッケージソースのバージョン管理
  • Pull request スタイルのパッケージ開発のコラボレーション
  • CI 環境(オンラインビルド、ビルド結果の配信)
    • rpm はもちろん、deb パッケージも扱えます!

OBS のセルフホスト

OBS 自体もオープンソースソフトウェアであり、openSUSE で使うインスタンスを SaaS として使うだけではなく、自身のサーバーにインストールして使うことができます。これにより、会社内で使用するビルドサーバーをローカルに構築することも可能です。

今回は openSUSE Leap 15.2 上にパッケージから OBS をセットアップする方法を紹介します。公式ウェブサイトのダウンロードページの目立つところには(2020年12月現在) 15.1 ベースの ISO イメージからインストールする簡単な方法が書かれていますが、15.1 のサポート期間もそろそろ終わることですし、この方法は今回は使わないことにします。
https://openbuildservice.org/download/

パッケージから OBS をインストール

それでは始めましょう。openSUSE Leap 15.2 はいつものようにセットアップしてください。私が今回実験する上では VirtManager で KVM の VM を作って試しました。

セットアップした後、Web アプリサーバーですので、OBS サーバーにアクセスするときに使用するホスト名の設定をしておいてください。この後の設定スクリプトでがこのホスト名でオレオレ証明書を作ってくれます(設定されていないと止まります)。ちゃんとしたドメインのホスト名でも良いですし、LAN 内の /etc/hosts に設定して回っても OK です。私はルーター (RTX810) の DNS で、LAN 内でのみ有効なホスト名を割り当ててます。

OBS サーバーのパッケージをインストールしましょう。リポジトリを追加して OBS_Server パターンをインストールするだけです。実際は機能ごとにサーバーを分けることもできますが、今回は全部入れてしまいます。

zypper ar -f https://download.opensuse.org/repositories/OBS:/Server:/2.10/openSUSE_15.2/OBS:Server:2.10.repo
zypper in -t pattern OBS_Server

※OBS を構成するサービスについては、ユーザーガイドに解説があります。今回はビルドも含めて一緒に動かします。
https://openbuildservice.org/help/manuals/obs-user-guide/cha.obs.architecture.html

OBS サーバーを起動するために色々設定しましょう。ここでも手を抜いて設定スクリプトを使います。/usr/share/doc/packages/obs-server/README.md に書かれている通り、次のスクリプトを実行して、あとは待つだけです。

/usr/lib/obs/server/setup-appliance.sh

OBS アプリケーションの設定

セットアップが終わったら、https://設定したホスト名/ にアクセスしてみましょう。オレオレ証明書の警告は出ると思いますので、続行するか信頼済みの証明書に登録するかはおまかせします。

まずは Admin アカウントでログインしてみてください。初期パスワードは opensuse です。そうすると、いつもの OBS の Web UI に見たことのない管理用のアイコンが並んでいます。(画像はプロジェクトとパッケージをいくつか追加した後の状態)

あとは、ユーザーを追加したり、プロジェクトとパッケージを追加したり、好きなようにできます。1つやっておいたほうがよいことは、openSUSE の OBS との連携設定です。というのも、セットアップした状態では、ビルドターゲットのディストリビューションの定義(パッケージ類)がない状態です。これを1から作る(パッケージをアップロードしたり)のは大変です。そこで、openSUSE の OBS とリンクします。これにより、openSUSE をはじめとしたディストリビューションの定義やパッケージを必要に応じて、自動的に openSUSE の OBS から取ってこられるようにできます。設定自体は簡単で、設定画面から「Interconnect」にあるボタンを1回クリックするだけで終わります。

詳しい情報

ユーザーガイドとアドミニストレータガイドがあるので、見ておくと良いでしょう。 https://openbuildservice.org/help/

Open Developers Conference に参加します

By ftake @ 2020-12-06 15:05

この記事は openSUSE Advent Calendar の6日目です。今日時点でまだ半分残っているので、みなさん参加してくださいね!

12月19日(土)に OSC でおなじみの OSPN 主催で開発者向けイベント Open Developers Conference 2020 Online が開催されます。今回は openSUSE としてではなく Cross Distro Developers Camp として出展します。
https://event.ospn.jp/ODC2020-Online/

14時からのセミナーでは「Linuxディストリビューション大集合 〜あなたのLinuxディストリビューションを見つけてみよう〜」と題し、「ディストリビューション」についての説明の後、各ディストリビューションの関係者からそれぞれのディストリビューションの特徴について紹介する予定です。openSUSE については私が担当し、Debian、Solus についての発表も聞けます。

セミナーの後、15時15分からの枠では、パネルディスカッション形式でディストリビューションの開発について話す予定です。パネリストの体験談と会場からの質問をもとに、ディストリビューションの開発に参加してみようかなと思ってもらえるような情報を提供できればと思っています。

openSUSE Advent Calendar 2020 が始まりました。今年も完走できるのか!?まだ空きがありますので、みなさんご協力お願いします。

みなさん、Spotify を使っていますか? Spotify は定額サブスクリプションで音楽をストリーミングで聴けるサービスです。再生クライアントはデスクトップ、モバイル各種プラットフォームに対応しており、さらに Linux 用の公式クライアントもあります。

これまで音楽を再生するときは、PC から再生するか、PCの電源が切れているときは、スマホとオーディオアンプ(AI-301DA)を Bluetooth で接続して再生していました。ただ、スマホからの再生は電池を消費するのがちょっと難点です。

ということで、常時電源が点いているファイルサーバー(もちろん OS は openSUSE)から Spotify を再生できるようにしてみました。Spotify の公式クライアントにはちょっと便利な機能があり、自身のアカウントでログインした、他のデバイスの Spotify クライアントを使ってリモートで再生することができます(Spotify Connect)。スマホの Spotify クライアントを使って、PC や Amazon Echo から再生するというのがおそらく一般的な使い方です。

ファイルサーバーにはディスプレイが接続されておらず、デスクトップ環境も動いていませんので、公式の Spotify クライアントではなく、今回は Spotifyd という OSS の非公式クライアントを使用してみました。その名の通り、デーモンとしてバックグラウンドで動作するクライアントです。

ビルド・インストール

誰かが作ったパッケージがあるにはあるのですが、今回はソースからビルドしてインストールしました。master ブランチではなく、リリース版の 0.2.24 を使います。設定ファイルのフォーマットが違う(master では TOML 形式になっている)ので、ドキュメントのバージョンには気をつけて下さい。

https://github.com/Spotifyd/spotifyd/releases/tag/v0.2.24

Rust は openSUSE Leap 15.2 で提供されているものが使えました。

$ sudo zypper in cargo alsa-devel make gcc

ドキュメントに従ってビルドします。

cargo build --release

ビルド結果は target/release/spotifyd にありますので、これをファイルサーバーの /opt/spotifyd/bin あたりに転送します。

設定

/etc/spotifyd.conf を作成します。設定例は README.md に書いてあるとおりです。 https://github.com/Spotifyd/spotifyd/blob/v0.2.24/README.md

  • password: Spotify の管理画面でデバイス用のパスワードを発行しておく
  • device: 書いてあるとおり aplay -L で使いたい出力のデバイス名を調べて下さい
  • cache_path: /var/cache/spotifyd あたりに設定しておきましょう

自動起動に使用する service ファイル(/etc/systemd/system/spotifyd.service)はこんな感じです。ソースコードの contrib ディレクトリ内の例からは少し変えてあります。まず、User は spotifyd ユーザーを作成して root から落としてあります。RestartSec は、spotifyd がときどき落ちていることがあったので、起動ループになると嫌だなと思い、長めに設定してみました。

[Unit]
Description=A spotify playing daemon
Documentation=https://github.com/Spotifyd/spotifyd
Wants=sound.target After=sound.target Wants=network-online.target
After=network-online.target [Service] ExecStart=/opt/spotifyd/bin/spotifyd --no-daemon Restart=always RestartSec=300 User=spotifyd Group=nobody Type=simple [Install] WantedBy=default.target

あとは spotifyd を起動して、クライアントからデバイスに接続できるかを試してみて下さい。

$ systemctl enable spotifyd
$ systemctl start spotifyd

最近、電源が壊れたPCを1台リプレースし、余ったマザーボード、CPU、メモリーでファイルサーバーを構築しました。その際にデータをファイルサーバーに移し、デスクトップ PC の HDD を外してしまったので、仮想マシン用の VM の仮想ディスクイメージもファイルサーバーに移す必要がありました。しかし、Hyper-V のディスクイメージは Samba サーバーに置くことができないようなので、仮想マシンのディスクイメージを iSCSI で Hyper-V に接続するようにしてみました。

今日は openSUSE Leap 15.2 (beta) で iSCSI Target(サーバー)のセットアップ方法を紹介します。今回設定する構成はディスクイメージを iSCSI で公開するファイルサーバーと、ファイルサーバーと同じネットワークにあり、そのディスクイメージを使用する Windows 10 のデスクトップ PC からなる単純なものです。

必要なパッケージは targetcli をインストールすれば揃います。YaST でも設定できるのですが、設定できる項目が少ないようなので、targetcli を使って設定します。

$ sudo zypper in targetcli

それでは targetcli を起動して設定していきます。

$ sudo targetcli

まずはディスクイメージファイルを作成します。targetcli の中で /backstores/fileio に移動して、create コマンドでディスクイメージを作成できますここでは /var/storage/disk1.img に 10 GB のディスクイメージ作成します。 /var/storage ディレクトリは先に作成しておく必要があります。

ls コマンドで disk1 が作成されたことが確認できます。

/> cd backstores/fileio 
/backstores/fileio> create file_or_dev=/var/storage/disk1.img name=disk1 size=10G
Created fileio disk1 with size 10737418240
/backstores/fileio> ls
o- fileio ............................................................. [Storage Objects: 1]
  o- disk1 ....................... [/var/storage/disk1.img (10.0GiB) write-back deactivated]
    o- alua ............................................................... [ALUA Groups: 1]
      o- default_tg_pt_gp ................................... [ALUA state: Active/optimized]

次に /iscsi で create コマンドを実行し、iSCSI の target を作成します。create の IQN 形式の ID を省略すると勝手に作成してくれます。

/backstores/fileio> cd /iscsi
/iscsi> create
Created target iqn.2003-01.org.linux-iscsi.testserver.x8664:sn.b527a14e621a.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.
/iscsi> ls
o- iscsi ...................................................................... [Targets: 1]
  o- iqn.2003-01.org.linux-iscsi.testserver.x8664:sn.b527a14e621a ................ [TPGs: 1]
    o- tpg1 ......................................................... [no-gen-acls, no-auth]
      o- acls .................................................................... [ACLs: 0]
      o- luns .................................................................... [LUNs: 0]
      o- portals .............................................................. [Portals: 1]
        o- 0.0.0.0:3260 ............................................................... [OK]

この target で公開するディスク (lun0) を作成し、最初に作成したディスクイメージ(/backstores/fileio/disk1)を割り当てます。

/iscsi> cd iqn.2003-01.org.linux-iscsi.testserver.x8664:sn.b527a14e621a/tpg1/luns
/iscsi/iqn.20...21a/tpg1/luns> create storage_object=/backstores/fileio/disk1 
Created LUN 0.
/iscsi/iqn.20...21a/tpg1/luns> ls
o- luns .......................................................................... [LUNs: 1]
  o- lun0 ....................... [fileio/disk1 (/var/storage/disk1.img) (default_tg_pt_gp)]

最後に、この taget にはデスクトップPC からしかアクセスできないようにします。ここではデスクトップPCのID(Windows の iSCSI イニシエーターに設定するもの)を iqn.2020-04.example.com:desktop-pc とします。tpg1/acls 内でイニシエーター名を指定し、create コマンドを実行します。さらに、ユーザーIDとパスワードを設定し、事実上誰からもアクセスできる状態にならないようにします。

/iscsi/iqn.20...21a/tpg1/luns> cd ../acls
/iscsi/iqn.20...21a/tpg1/acls> create iqn.2020-04.example.com:desktop-pc
Created Node ACL for iqn.2020-04.example.com:desktop-pc
Created mapped LUN 0.
/iscsi/iqn.20...21a/tpg1/acls> cd iqn.2020-04.example.com:desktop-pc/
/iscsi/iqn.20...om:desktop-pc> set auth userid=testuser
Parameter userid is now 'testuser'.
/iscsi/iqn.20...om:desktop-pc> set auth password=testpassword1234
Parameter password is now 'testpassword1234'.
/iscsi/iqn.20...om:desktop-pc> ls
o- iqn.2020-04.example.com:desktop-pc ..................................... [Mapped LUNs: 1]
  o- mapped_lun0 .................................................. [lun0 fileio/disk1 (rw)]

この段階で mapped_lun0 が作成され、iqn.2020-04.example.com:desktop-pc に mapped_lun0 が作成されます。Leap 15.1 で試したときは、この mapped_lun0 が自動的に作成されず、Windows の iSCSI イニシエーターから接続してもディスクが何も表示されない状態になってしまいました。このような場合は、次のコマンドで mapped_lun を作成することができます。

create mapped_lun=0 tpg_lun_or_backstore=lun0

これまでの設定は以下の通りです。この状態で Windows の iSCSI イニシエーターでファイルサーバーに接続すると、ディスクの管理で iqn.2003-01.org.linux-iscsi.testserver.x8664:sn.b527a14e621a の lun0 (/backstores/fileio/disk1, /var/storage/disk1.img) がディスクとして見えるようになります。あとは Hyper-V でこのディスクを割り当てれば仮想マシンのディスクとして使用することができます。

/> ls /
o- / ................................................................................. [...]
  o- backstores ...................................................................... [...]
  | o- block .......................................................... [Storage Objects: 0]
  | o- fileio ......................................................... [Storage Objects: 1]
  | | o- disk1 ..................... [/var/storage/disk1.img (10.0GiB) write-back activated]
  | |   o- alua ........................................................... [ALUA Groups: 1]
  | |     o- default_tg_pt_gp ............................... [ALUA state: Active/optimized]
  | o- pscsi .......................................................... [Storage Objects: 0]
  | o- ramdisk ........................................................ [Storage Objects: 0]
  | o- rbd ............................................................ [Storage Objects: 0]
  o- iscsi .................................................................... [Targets: 1]
  | o- iqn.2003-01.org.linux-iscsi.testserver.x8664:sn.b527a14e621a .............. [TPGs: 1]
  |   o- tpg1 ....................................................... [no-gen-acls, no-auth]
  |     o- acls .................................................................. [ACLs: 1]
  |     | o- iqn.2020-04.example.com:desktop-pc ........................... [Mapped LUNs: 1]
  |     |   o- mapped_lun0 ........................................ [lun0 fileio/disk1 (rw)]
  |     o- luns .................................................................. [LUNs: 1]
  |     | o- lun0 ............... [fileio/disk1 (/var/storage/disk1.img) (default_tg_pt_gp)]
  |     o- portals ............................................................ [Portals: 1]
  |       o- 0.0.0.0:3260 ............................................................. [OK]
  o- loopback ................................................................. [Targets: 0]
  o- vhost .................................................................... [Targets: 0]
  o- xen-pvscsi ............................................................... [Targets: 0]

2019年のイベントふりかえり

By ftake @ 2019-12-25 23:55

openSUSE Advent Calendar 25日目です。今回も無事完走できました。

最終日の今日は1年間のイベントをふりかえってみます。全体の傾向としては、今年は毎年抑えている OSC のみで、北海道や島根などの地方 OSC への参加は少なめでした。

また、OSC 東京の後、高幡不動で飲んでいる間に企画が立ち上がった Cross Distribution Developers Camp (XDDC) が始動し、openSUSE 単独のもくもく会のかわりに、他のディストリビューションを巻き込んだイベントが多くなりました。

1月

  • openSUSE もくもく会・新年会@京都
  • OSC 大阪
    • ブースのみ出展

2月

  • OSC 浜名湖
    • 「eBPFを使ってシステムコールをトレースしてみよう」(川上さん)
  • OSC Tokyo/Spring
    • 「Kubic で簡単お手軽 Kubernetes クラスタ構築」(修太さん)
    • 「最近良く聞く Kubernetes を体験してみた」(武山)

3月

  • openSUSE Leap 15.1 Bug Squashing Party

5月

  • openSUSE Conference
  • openSUSE Leap 15.1 リリース

6月

  • ディストリビューション開発合宿

7月

  • OSC 名古屋
    • 「GPU仮想化最前線 – KVMGTとvirtio-gpu -」(安藤さん)
  • openSUSE mini Summit

8月

  • OSC 京都
    • 「XDPによる高速パケット処理プログラミング入門」(川上さん)
  • コミックマーケット C96
  • Open Developers Conference
    • 「日本語入力の危機を乗り越える インプットメソッド・フレームワークとかな漢字変換に訪れている課題とその対策」(Cross Distribution Developers Camp)

9月

  • ディストリ開発もくもく会
  • 技術書展7

10月

  • openSUSE.Asia Summit 2019

11月

  • 関西オープンフォーラム
  • ディストリビューション開発合宿
  • OSC Tokyo/Fall
    • 「最近よく聞く!? ― eBPF (extended Berkeley Packet Filter) を用いた PostgreSQL の性能測定」(川上さん)

12月

  • コミックマーケットC97(4日目の12/31です)

来年のイベントは?

コミケがまだ残っていますが、来年は京都のもくもく会&新年会東京の新年会からスタートです。その後は OSC 大阪に出展します。

それでは来年もよろしくお願い致します。良いお年を。