星际文件系统
星际文件系统 (IPFS) 是一种分布式的超媒体协议,通过内容和身份寻址。IPFS 实现了完全分布式的应用程序、数据存储以及网站的创建,旨在使网络更快、更安全、更开放。
它旨在连接所有进行请求文件传输的对等交换的计算机。在某些方面,这类似于 Web 的最初目标,但不是使用客户端和服务器角色模型以及基于位置的寻址,而是网络中的所有计算机以分布式方式共享有关哪些文件存储在哪里的信息。这样,用户不需要知道哪个服务器包含哪些文件,而只需要知道内容的 ID 即可接收它。网络定位相应的节点并以防篡改的方式请求数据。文件存储在类似于 git 工作方式的对象中,元数据存储和文件传输与 BitTorrent 有相似之处。
添加到 IPFS 节点的文件会被分块和哈希。各个块被添加到 MerkleDAG - 一个树对象 - 它与块一起存储。树对象的哈希是防篡改的内容 ID (CID)。然后,节点将其节点 ID 在网络的分布式哈希表 (DHT) 中发布所有哈希。这样,就可以通过 CID 将内容定位到可以按需提供数据的特定节点。
安装
要开始使用 IPFS,您必须首先执行
$ ipfs init
作为用户。这会创建一个 ~/.ipfs
目录,其中包含所有必要的文件。
现在您可以启动 IPFS 守护进程
$ ipfs daemon
这将启动您的节点,可通过 ipfs
命令行界面 (CLI) 或 localhost:5001/webui 上的 Web 界面访问。此外,本地网关将在 localhost:8080 上启动(默认端口可以在 ~/.ipfs/config
中更改)。
使用服务启动守护进程
为了方便起见,您可以使用 Systemd/User 服务(包含在 kubo 中)自动启动 IPFS 守护进程。这确保了守护进程在您登录时启动,并在崩溃时重新启动。
您可以 启动/启用 ipfs.service
作为 用户单元。
如果您希望服务始终运行,而与用户会话状态无关,请通过 启动/启用 ipfs@username.service
来启用系统范围的服务。
使用不同的命令行启动服务
您可能还想通过使用 trickleAUR 来限制 IPFS 使用的带宽(参见 ipfs/go-ipfs#3429)。您可以 编辑 此 Systemd/User 服务文件到 $HOME/.config/systemd/user/go-ipfs.service
[Unit] Description=InterPlanetary File System (IPFS) daemon (rate-limited via Trickle) After=network-online.target Wants=network-online.target [Service] ExecStart=/usr/bin/trickle -s -u 56 /usr/bin/ipfs daemon --routing=dhtclient Restart=on-failure [Install] WantedBy=default.target
这将使用 trickle 启动 IPFS,并传递参数 --routing=dhtclient
。您当然可以根据需要修改它,或者将您的版本基于软件包的 /usr/lib/systemd/user/ipfs.service
。启动/启用 go-ipfs.service
作为 用户单元。
防火墙
IPFS 需要端口 4001 TCP 和 UDP。它尝试使用 UPnP/IGD 在路由器上配置端口转发。不支持 UPnP/IGD 的路由器将需要手动端口转发。
文件共享
要使用 IPFS 共享文件,您需要守护进程正在运行。
$ ipfs add file
返回一个哈希值。如果之前有人通过 IPFS 共享过此文件,则哈希值将与之前的上传匹配,使您成为该文件的第二个来源。
要通过 IPFS 哈希检索文件,请使用 ipfs cat
$ ipfs cat /ipfs/QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG/readme
您可以将其管道输送到任何其他应用程序,例如,使用 mpv 观看视频
$ ipfs cat QmWenbjgZnA6UguLtmUYayS6e7UQM7woB15zuEymSRRMoi | mpv -
或者您可以下载文件
$ ipfs get QmWenbjgZnA6UguLtmUYayS6e7UQM7woB15zuEymSRRMoi
还有一个 ipgetAUR 实用程序,其作用类似于用于 IPFS 的 wget。此外,它还包含一个引导节点,因此您无需运行或安装 ipfs 守护进程即可使用它。要下载文件
$ ipget QmWenbjgZnA6UguLtmUYayS6e7UQM7woB15zuEymSRRMoi
您可以共享文件和文件夹。文件夹应以递归方式共享
$ ipfs add -r folder
要查看文件夹中的所有文件和缓存(如果哈希是文件夹)
$ ipfs ls QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG
每个与网络共享的文件都可以通过 localhost:8080
上的 IPFS 网关访问,如下所示
https://127.0.0.1:8080/ipfs/QmWenbjgZnA6UguLtmUYayS6e7UQM7woB15zuEymSRRMoi
有公共网关,允许没有运行 IPFS 节点的用戶访问网络上的文件。例如,官方 网站
https://ipfs.io/ipfs/QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG
使用名称解析的简单托管
在 IPFS 中,共享的文件永远不会被删除,并且随着文件的任何更改,其哈希值也会更改。这使得诸如网站托管之类的任务变得困难,因为对网页的任何更改(例如对 index.html
的更改)都将导致其具有不同的哈希值,并且旧的网页仍然可以从旧的哈希值访问。持久存储所有具有完整历史记录的内容是网络的目标之一。IPFS 提供了一种名称服务,您可以使用它来生成持久缓存 - IPNS。IPNS 允许您将任何哈希绑定到您节点在初始化时生成的唯一 ID。您可以像这样查看您的 ID
$ ipfs id
并将任何哈希绑定到它
$ ipfs name publish HASH
这会将文件更改后由 ipfs add
生成的新哈希分配给您的节点 ID,从而使文件夹/文件的更新版本可以在相同的地址访问。
请注意,当使用 IPNS 时,地址具有 ipns
前缀而不是 ipfs
https://127.0.0.1:8080/ipns/QmPtMQErTfQMbZTMMpQh65cpk5y7D94WdYJurCeRqvXKmD/
用作 makepkg DLAGENT
包含指向 IPFS 资源的 URI 的 PKGBUILD 需要安装并配置 ipfs-dlagentAUR 下载代理才能正确构建。