请注意,这个问题与 IPFS 有关(https://ipfs.io)。
是否可以将~/.ipfs
文件夹挂载到外部设备(例如:硬盘、网络驱动器、WD My book 等)?这将有助于~/.ipfs
在不同节点之间共享文件夹。我不确定 IPFS 是否被设计为在节点之间共享该文件系统(同时?)。
请注意,我正在安装到我的 WD My book 外部硬盘驱动器 (https://www.wdc.com/products/wd-recertified/my-book.html,文件系统NTFS)。请参阅我的安装代码行:
$ mkdir /mnt/cifs
$ sudo mount -t cifs //server-name/share-name /mnt/cifs -o \
username=admin,password=my_password,uid=1000
$ mount | grep 'cifs’
//server-name/share-name on /mnt/cifs type cifs (rw)
在安装~/.ipfs
文件夹后,当我尝试运行ipfs init
或 时ipfs add <filename>
,我遇到了以下错误:
Error: fsync: invalid argument
当:ipfs add <filename>
运行时,它会在创建的文件夹内创建块文件,如下所示:
~/.ipfs/blocks/<created_folder_name>
.
~/.ipfs/blocks$ ls
CIQA2 CIQBE CIQCP CIQDV CIQF7 CIQGF CIQHL CIQIY CIQK5 CIQLB CIQMG CIQNM CIQOR
CIQA3 CIQBF CIQCQ CIQDW CIQFA CIQGG CIQHM CIQIZ CIQK6 CIQLC CIQMH CIQNN CIQOS
CIQA4 CIQBG CIQCR CIQDX CIQFB CIQGH CIQHN CIQJ2 CIQK7 CIQLD CIQMI CIQNO CIQOU
例如:ipfs init
执行后,每个创建的文件夹下只创建一个文件。
$ ~/.ipfs/blocks$ ls */
/home/.ipfs/blocks/CIQMJ:
CIQMJCAMEI4UXBQ35CUDVVJOGU3DNWNHI7O7JCWHWNMUWPGKPOTLFYY.data //coming from mounted device.
/home/.ipfs/blocks/CIQMK:
CIQMKGZXBKZV262ZN6ABE4SUO5BNGKVSPTGAQXSOC35UUK7FUPIIAIY.data //coming from mounted device.
此外,运行后ipfs add <filename>
会创建一个新文件夹,其中包含一个文件。我已将该文件夹安装到我的外部设备,它修复了我遇到的错误。
但是,如果ipfs add <filename>
将新的块文件添加到 ~/.ipfs/blocks => 下已创建的文件夹中,则会出现相同的错误:Error: fsync: invalid argument
。
/home/.ipfs/blocks/CIQMI:
CIQMI5TLEXEWEYC3G3WELU6ONMKNLAF6CZUXU5BTWEU453LHPTUNNEI.data //coming from mounted device.
CIQMIRQGFPT23SZ6XYFFU45GLZENEWRYI7PR3YJ7EP7ZC6I4ME7GPFQ.data //newly added file
我写的测试脚本:
仅运行ipfs init
一次后,将执行以下脚本。
$ sudo mount -t cifs //server-name/share-name /mnt/cifs -o username=admin,password=my_password,uid=1000
$ ipfs init
$ cd ~/.ipfs/blocks/
for d in */ ; do
if [ ! -d /mnt/cifs/$d ]; then
mkdir /mnt/cifs/$d
cp $d/* /mnt/cifs/$d/
fi
done
要在运行之前从外部设备恢复文件:ipfs add <filename>
:现在 ~/.ipfs/blocks/ 内的所有文件夹实际上已安装到我的外部设备。
sudo mount -t cifs //<ip_address>/mybloc/ ~/.ipfs/blocks/ -o username=admin,password=my_password,uid=1000
感谢您的宝贵帮助和时间。
答案1
我想我能够解决我面临的问题。ipfs init
执行后,将创建 15 个新文件,每个文件都有唯一的文件夹名称。这些文件不应被删除(我假设这些文件确实包含 Merkle 树的根)。我使用以下sudo chattr +i */*
行使它们不可变。
~/.ipfs/blocks$ ls
CIQBE CIQCC CIQDT CIQFF CIQGC CIQJ2 CIQJB CIQJX CIQKZ CIQOA CIQOL
CIQBG CIQD4 CIQF2 CIQFT CIQIF CIQJA CIQJF CIQKK CIQO2 CIQOH
~/.ipfs/blocks$ ls *
CIQBE:
CIQBED3K6YA5I3QQWLJOCHWXDRK5EXZQILBCKAPEDUJENZ5B5HJ5R3A.data
CIQBG:
CIQBGFIS77LXFM54VZKTDSZ3VKRE6ITTNAQEFHMC2H3ESKBPC3BVCYA.data
...
进一步在运行之前ipfs add <file_name>
,sudo umount ~/.ipfs/blocks/
应该执行。这将让人ipfs
相信只有ipfs init
执行后立即创建的文件和文件夹存在。 (我的 ~/.ipfs/blocks 文件夹中应仅包含ipfs init
执行后立即创建的文件夹和文件。)
我必须仔细检查,但我相信每个*.data
文件名与其包含的信息相关是唯一的,因此<file>.data
不会生成每个文件名相同的文件名。因此覆盖到同一个.dat
文件中不会有问题。
稍后,新生成的文件和文件夹ipfs add <filename>
应复制到外部驱动器中,并应从~/.ipfs
文件夹中删除。
在做任何事情之前ipfs cat <hash-id>
我们应该做:
sudo mount -t cifs //<ip_address>/mybloc/ ~/.ipfs/blocks/ -o username=admin,password=my_password,uid=1000
这将导致 ipfs 能够访问.data
外部驱动器中实际存在的已创建文件。