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

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

はじめに

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

 

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にアクセスをすると、アップロードされたファイルを見ることができます(2.は表示に時間を要する場合があります)。

  1. https://cloudflare-ipfs.com/ipfs/QmXix6awDMwNPU8PeLmQbNfxzvV48GuV7h4oGpugWwwRW7
  2. https://ipfs.io/ipfs/QmXix6awDMwNPU8PeLmQbNfxzvV48GuV7h4oGpugWwwRW7

Brave browserを使っている場合には、以下のURLでも見ることができます(ipfs.ioを経由しない分だけ表示に要する時間を短縮できるかもしれません)。

ipfs://bafybeieln6pm3xkyz4idfhskdbeybgif44pq7mrw4qhfmbgfbyjnos7vva/

daemonのサービス化

ipfs daemonコマンドをPCの起動ごとに実行するのは面倒である上に忘れがちなので、サービス化してしまいます。

この記事のgrowi.service及びstartgrowi.shを参考にサービスのユニットファイル(ipfs.service)及びユニットファイルから起動するシェルスクリプト(startipfs.sh)を書きます。

ipfs.service

ipfs.serviceは以下の通りです。

startipfs.sh

startipfs.shは以下の通りです。

ファイル名に”start”とありますが、終了もできます。

ipfs.serviceからの参照先(/opt/ipfs)の下に置きます。

試運転

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

[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
root 105869 0.0 0.3 222512 3532 ? Ss 21:20 0:00 /bin/bash /opt/ipfs/startipfs.sh
root 105870 0.0 0.7 229988 6964 ? S 21:20 0:00 su – panda -c /usr/local/bin/ipfs daemon
panda 105871 12.8 8.2 1344356 80696 ? Ssl 21:20 0:00 /usr/local/bin/ipfs daemon
root 105899 0.0 0.2 221672 2212 pts/0 S+ 21:20 0:00 grep --color=auto ipfs
# systemctl stop ipfs
# ps aux | grep ipfs

 
問題なさそうです。👍

スポンサーリンク

まとめ

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

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

この記事は以上です。