Fedora 35で稼働するIPFSのノードを立ち上げてみた。

By | 2021年12月5日 , Last update: 2022年5月4日

はじめに

TezosやNFTの文献をいくつか読んでいるのですが、その途中で「IPFS」というキーワードが目に入りました。

もう少し調べてみると、IPFSとは惑星間(InterPlanetary(!))の分散型のファイルシステムのようです。

分散型ファイルシステムなので、公開してもよいコンテンツであれば置くことができそうです。

以上、雑な説明でした。🙇

IPFSはIPFSなりに面白そうだと思ったので、TezosやNFTのことはいったんちょっと脇に置いて、手元にあるFedora 35のPCでIPFSのノードを立ち上げてみることにしました。

スポンサーリンク

IPFSのインストール

dnfコマンドでインストールが可能か否かの確認

Fedoraへのインストールということで、まず最初にdnfコマンドでIPFSがインストールできないか試してみます。

すると…

[panda@pandanote.info ~]$ sudo dnf install ipfs
[sudo] panda のパスワード:
メタデータの期限切れの最終確認: 1:19:05 時間前の 2021年12月02日 15時28分43秒 に実施しました。
一致した引数がありません: ipfs
エラー: 一致するものが見つかりません: ipfs

 

IPFSに関連するパッケージはなさそうなことがわかりました。

tarballからインストール

dnfコマンドを用いてのインストールができないことが確認されたところで、以下の手順でインストールします。

  1. 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

     

  2. 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

     

  3. 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

     

  4. /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の受信バッファのサイズを変更(大きく)します。

[panda@pandanote.info ~]$ sudo sysctl -w net.core.rmem_max=2500000
net.core.rmem_max = 2500000

 

設定ができることが確認できたら、以下のコマンドを実行し、起動時の設定用ファイルを作成します。

# echo “net.core.rmem_max=2500000” > /etc/sysctl.d/98-ipfs.conf

 

IPFSが使用するポートの開放


スポンサーリンク

IPFSの他ノードと通信を行うために以下のコマンドを実行し、TCP及びUDPの4001番ポートだけを開けます。他のノードとの通信はIPv6によるものに限定したいので、リッチルールを使ってポートを開放するための設定を行っています。

[panda@pandanote.info ~]$ sudo firewall-cmd --zone=FedoraServer --add-rich-rule=”rule family=ipv6 destination address=<IPv6 address> port port=4001 protocol=tcp accept”
[sudo] panda のパスワード:
success
[panda@pandanote.info ~]$ sudo firewall-cmd --zone=FedoraServer --add-rich-rule=”rule family=ipv6 destination address=<IPv6 address> port port=4001 protocol=udp accept”
success
[panda@pandanote.info ~]$ sudo firewall-cmd --zone=FedoraServer --add-rich-rule=”rule family=ipv6 destination address=<IPv6 address> port port=4001 protocol=tcp accept” –permanent
success
[panda@pandanote.info ~]$ sudo firewall-cmd --zone=FedoraServer --add-rich-rule=”rule family=ipv6 destination address=<IPv6 address> port port=4001 protocol=udp accept” –permanent
success

 

IPFSノードの試運転

ノードの初期化

設定ができたらipfs initを実行して、ノードを初期化します。

[panda@pandanote.info ~]$ ipfs init
generating ED25519 keypair…done
peer identity: <hash>
initializing IPFS node at /home/panda/.ipfs
to get started, enter:

ipfs cat /ipfs/QmQPeNsJPyVWPFDVHb77w8G42Fvo15z4bG2X8D2GhfbSXc/readme

 
IPFSのノードをホームディレクトリの直下の.ipfsディレクトリに生成した旨のメッセージが表示されます。

また、上記の出力にIPFSのREADMEのIPFS上での置き場が示されていますので、見てみます。


スポンサーリンク

端末によってはAAの表示が崩れることがあるので、リモートデスクトップのスクリーンショットです。

なお、peer identityの行に表示されるハッシュ値は初期化したノードのIDになりますが、ノードの初期化後であっても必要に応じてipfs idコマンドで確認できます。

[panda@pandanote.info ~]$ ipfs id
{
“ID”: “12D3KooWAvFheJxW9Em7TKXS9W5jwjnF7BMriUQjLpKHD8RWPN66”,
(以下略)
}

 

IDキーに対応する値が初期化したノードのIDです。

IPFSのストレージサイズの確認

IPFSのノードになるので、IPFSが使用できるストレージサイズを確認します。

IPFSが使用できるストレージサイズは.ipfs/configファイルに定義されていますので、以下のコマンドで確認できます。

[panda@pandanote.info ~]$ grep StorageMax .ipfs/config
“StorageMax”: “10GB”,

 
必要に応じて上記の設定値を変更するべきところではありますが、ストレージの容量に若干の余裕のあるPCを使用していますので、変更せずにそのまま使用することとしました。

daemonの実行

スポンサーリンク

初期化が完了したところで、別端末からipfs daemonコマンドを実行します。

すると、設定に問題がなければ…

[panda@pandanote.info ~]$ ipfs daemon
Initializing daemon…
go-ipfs version: 0.10.0
Repo version: 11
System version: amd64/linux
Golang version: go1.16.8
Swarm listening on /ip4/127.0.0.1/tcp/4001
Swarm listening on /ip4/127.0.0.1/udp/4001/quic
(中略, 外向けのIPアドレスとlistenするポート番号が表示されます。)
Swarm listening on /ip6/::1/tcp/4001
Swarm listening on /ip6/::1/udp/4001/quic
Swarm listening on /p2p-circuit
Swarm announcing /ip4/127.0.0.1/tcp/4001
Swarm announcing /ip4/127.0.0.1/udp/4001/quic
(中略, announceの対象となる外向けのIPアドレス及びポート番号が表示されます。)
Swarm announcing /ip6/::1/tcp/4001
Swarm announcing /ip6/::1/udp/4001/quic
API server listening on /ip4/127.0.0.1/tcp/5001
WebUI: http://127.0.0.1:5001/webui
Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080
Daemon is ready

 

と表示されて、daemonがforegroundで起動します。

接続状況の確認

接続状況はipfs swarm peersコマンドで確認できます。

[panda@pandanote.info ~]$ ipfs swarm peers
(接続可能なpeerの一覧が表示されます。結構長いです。)

 

ファイルのアップロード

「ノードの初期化」の節の画像を試しにIPFSにアップロードしてみます。

とりあえず、ファイル名を「ipfs_on_fedora35_20211204.png」としてアップロードします。

[panda@pandanote.info ~]$ ipfs add ipfs_on_fedora35_20211204.png added QmXix6awDMwNPU8PeLmQbNfxzvV48GuV7h4oGpugWwwRW7 ipfs_on_fedora35_20211204.png
98.47 KiB / 98.47 KiB [===============================================] 100.00%

 

これで以下のURLにアクセスをすると、アップロードされたファイルを見ることができます(表示に時間を要する場合があります)。

  1. https://cloudflare-ipfs.com/ipfs/QmXix6awDMwNPU8PeLmQbNfxzvV48GuV7h4oGpugWwwRW7
  2. 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は以下の通りです。

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の餌食になっていることがわかりました。

ある程度の時間にわたり連続して稼働させることを想定しているサーバに対して自動パッケージ更新を行うと予期せぬトラブルを引き起こす恐れがありそうですので、以下のコマンドを実行して、コマンドの実行を抑止します。

# systemctl disable dnf-makecache.timer

 

試運転

試運転の前には以下のコマンドを実行し、追加したユニットファイルが使用できるようにしておきます。

[panda@pandanote.info ~]$ sudo systemctl daemon-reload

 
起動→停止の順で実行し、動くことを確認します。

# ps aux | grep ipfs
root 105863 0.0 0.2 221672 2172 pts/0 S+ 21:20 0:00 grep –color=auto ipfs
# systemctl start ipfs
# ps aux | grep ipfs
panda 1127 15.6 38.3 1988428 379156 ? Ssl 17:02 49:08 /usr/local/bin/ipfs daemon –enable-gc –enable-namesys-pubsub
panda 7910 0.0 0.2 221800 2420 pts/0 S+ 22:16 0:00 grep –color=auto ipfs
# systemctl stop ipfs
# ps aux | grep ipfs

 
問題なさそうです。👍

まとめ

ここまでの手順による作業手順でFedora 35でIPFSのノードを立ち上げることができたようです。

この状態でしばらく様子を見つつ、IPFSにサムネイル画像を置いたりなどしてみたいと考えています。

この記事は以上です。