はじめに
TezosやNFTの文献をいくつか読んでいるのですが、その途中で「IPFS」というキーワードが目に入りました。
もう少し調べてみると、IPFSとは惑星間(InterPlanetary(!))の分散型のファイルシステムのようです。
分散型ファイルシステムなので、公開してもよいコンテンツであれば置くことができそうです。
以上、雑な説明でした。
IPFSはIPFSなりに面白そうだと思ったので、TezosやNFTのことはいったんちょっと脇に置いて、手元にあるFedora 35のPCでIPFSのノードを立ち上げてみることにしました。
IPFSのインストール
dnfコマンドでインストールが可能か否かの確認
Fedoraへのインストールということで、まず最初にdnfコマンドでIPFSがインストールできないか試してみます。
すると…
IPFSに関連するパッケージはなさそうなことがわかりました。
tarballからインストール
dnfコマンドを用いてのインストールができないことが確認されたところで、以下の手順でインストールします。
- IPFSのサイトからtarballをダウンロードします。
[panda@pandanote.info ~]$ wget https://dist.ipfs.io/go-ipfs/v0.10.0/go-ipfs_v0.10.0_linux-amd64.tar.gz --2021-12-02 17:15:45-- https://dist.ipfs.io/go-ipfs/v0.10.0/go-ipfs_v0.10.0_linux-amd64.tar.gz dist.ipfs.io (dist.ipfs.io) をDNSに問いあわせています… 2602:fea2:3::1, 209.94.78.1 dist.ipfs.io (dist.ipfs.io)|2602:fea2:3::1|:443 に接続しています… 接続しました。 HTTP による接続要求を送信しました、応答を待っています… 200 OK 長さ: 26156481 (25M) [application/gzip] `go-ipfs_v0.10.0_linux-amd64.tar.gz’ に保存中 go-ipfs_v0.10.0_lin 100%[===================>] 24.94M 1.76MB/s 時間 19s 2021-12-02 17:16:04 (1.32 MB/s) – `go-ipfs_v0.10.0_linux-amd64.tar.gz’ へ保存完了 [26156481/26156481] [panda@pandanote.info ~]$ ls -l 合計 25544 -rw-r–r–. 1 panda panda 26156481 12月 2 17:15 go-ipfs_v0.10.0_linux-amd64.tar.gz
- tarballのダウンロードができたら、tarコマンドを実行して展開します。
[panda@pandanote.info ~]$ tar zxvf go-ipfs_v0.10.0_linux-amd64.tar.gz go-ipfs/LICENSE go-ipfs/LICENSE-APACHE go-ipfs/LICENSE-MIT go-ipfs/README.md go-ipfs/install.sh go-ipfs/ipfs
- go-ipfsというディレクトリができますので、その下にあるinstall.shを実行します。
[panda@pandanote.info ~]$ cd go-ipfs/ [panda@pandanote.info go-ipfs]$ ls LICENSE LICENSE-APACHE LICENSE-MIT README.md install.sh ipfs [panda@pandanote.info go-ipfs]$ ls -l 合計 60568 -rw-r–r–. 1 panda panda 508 10月 2 02:37 LICENSE -rw-r–r–. 1 panda panda 520 10月 2 02:37 LICENSE-APACHE -rw-r–r–. 1 panda panda 1046 10月 2 02:37 LICENSE-MIT -rw-r–r–. 1 panda panda 467 10月 2 02:37 README.md -rwxr-xr-x. 1 panda panda 852 10月 2 02:37 install.sh -rwxr-xr-x. 1 panda panda 61998400 10月 2 02:37 ipfs [panda@pandanote.info go-ipfs]$ sudo sh ./install.sh [sudo] panda のパスワード: Moved ./ipfs to /usr/local/bin
- /usr/local/binの下にインストールができていることを確認します。[panda@pandanote.info go-ipfs]$ ls -l /usr/local/bin 合計 108044 -rwxr-xr-x. 1 panda panda 61998400 10月 2 02:37 ipfs (以下略)
スポンサーリンク
PC側の設定
IPFSを稼働させるためにはPC側でも設定が必要です。
UDPの受信バッファのサイズの変更
IPFSはQUICによる通信を行いますが、UDPの受信バッファのサイズを大きくするとQUICによる高帯域幅の通信を行うことができます。
そこで、以下のコマンドを実行し、UDPの受信バッファのサイズを変更(大きく)します。
設定ができることが確認できたら、以下のコマンドを実行し、起動時の設定用ファイルを作成します。
IPFSが使用するポートの開放
IPFSの他ノードと通信を行うために以下のコマンドを実行し、TCP及びUDPの4001番ポートだけを開けます。他のノードとの通信はIPv6によるものに限定したいので、リッチルールを使ってポートを開放するための設定を行っています。
IPFSノードの試運転
ノードの初期化
設定ができたらipfs initを実行して、ノードを初期化します。
IPFSのノードをホームディレクトリの直下の.ipfsディレクトリに生成した旨のメッセージが表示されます。
また、上記の出力にIPFSのREADMEのIPFS上での置き場が示されていますので、見てみます。
端末によってはAAの表示が崩れることがあるので、リモートデスクトップのスクリーンショットです。
なお、peer identityの行に表示されるハッシュ値は初期化したノードのIDになりますが、ノードの初期化後であっても必要に応じてipfs idコマンドで確認できます。
IDキーに対応する値が初期化したノードのIDです。
IPFSのストレージサイズの確認
IPFSのノードになるので、IPFSが使用できるストレージサイズを確認します。
IPFSが使用できるストレージサイズは.ipfs/configファイルに定義されていますので、以下のコマンドで確認できます。
必要に応じて上記の設定値を変更するべきところではありますが、ストレージの容量に若干の余裕のあるPCを使用していますので、変更せずにそのまま使用することとしました。
daemonの実行
初期化が完了したところで、別端末からipfs daemonコマンドを実行します。
すると、設定に問題がなければ…
と表示されて、daemonがforegroundで起動します。
接続状況の確認
接続状況はipfs swarm peersコマンドで確認できます。
ファイルのアップロード
「ノードの初期化」の節の画像を試しにIPFSにアップロードしてみます。
とりあえず、ファイル名を「ipfs_on_fedora35_20211204.png」としてアップロードします。
これで以下のURLにアクセスをすると、アップロードされたファイルを見ることができます(表示に時間を要する場合があります)。
- https://cloudflare-ipfs.com/ipfs/QmXix6awDMwNPU8PeLmQbNfxzvV48GuV7h4oGpugWwwRW7
- https://ipfs.io/ipfs/QmXix6awDMwNPU8PeLmQbNfxzvV48GuV7h4oGpugWwwRW7
Brave browserを使っている場合には、以下のURLでも見ることができます(Brave browserに設定されているIPFS Gatewayを経由してIPFSへのアクセスが実行されます)。
ipfs://bafybeieln6pm3xkyz4idfhskdbeybgif44pq7mrw4qhfmbgfbyjnos7vva/
daemonのサービス化
ipfs daemonコマンドをPCの起動ごとに実行するのは面倒である上に忘れがちなので、サービス化してしまいます。
この記事のgrowi.serviceを参考にサービスのユニットファイル(ipfs.service)を作成します。
※IPFSのセットアップ直後はユニットファイルから起動するシェルスクリプト(startipfs.sh)を書いていましたが、ipfsはメモリをかなり消費するためにOOM Killerでkillされる現象が頻発したため、サービスのユニットファイル(ipfs.service)を使用する方法に変更しています。
ipfs.serviceのソースコード
ipfs.serviceは以下の通りです。
[Unit] | |
Description=Ipfs | |
After=network-online.target | |
[Service] | |
User=panda | |
WorkingDirectory=/home/panda | |
OOMScoreAdjust=-1000 | |
ExecStart=/usr/local/bin/ipfs daemon --enable-gc --enable-namesys-pubsub | |
ExecStop=/usr/bin/pkill --signal SIGINT ipfs | |
[Install] | |
WantedBy=multi-user.target |
ipfs.serviceの概要の説明
前節のソースコードの概要の説明は以下の通りです。
- User及びWorkingDirectoryはIPFSのセットアップを行ったユーザ及びIPFSノードが使用するデータ一式を置くディレクトリを指定します(5,6行目)。
- ipfsはメモリを消費するためにOOM Killerに狙われがちになりますので、OOMScoreAdjustを-1000に設定してOOM Killerによる強制終了の実行対象から除外します(7行目)。
- 起動時にはenable-namesys-pubsubオプションを設定して、IPNSが利用できる(=レスポンスを改善する)ように設定します(8行目。IPNSの詳細については次の記事参照です)。
メモリを消費するコマンドの自動実行の抑止
IPFSとは直接関連しませんが、OOM Killerの実行状況を観察していたところ、dnfによる自動パッケージ更新用のコマンドがかなり頻繁にOOM Killerの餌食になっていることがわかりました。
ある程度の時間にわたり連続して稼働させることを想定しているサーバに対して自動パッケージ更新を行うと予期せぬトラブルを引き起こす恐れがありそうですので、以下のコマンドを実行して、コマンドの実行を抑止します。
試運転
試運転の前には以下のコマンドを実行し、追加したユニットファイルが使用できるようにしておきます。
起動→停止の順で実行し、動くことを確認します。
問題なさそうです。
まとめ
ここまでの手順による作業手順でFedora 35でIPFSのノードを立ち上げることができたようです。
この状態でしばらく様子を見つつ、IPFSにサムネイル画像を置いたりなどしてみたいと考えています。
この記事は以上です。