是否可以将 ~/.ipfs 文件夹挂载到外部驱动器?

是否可以将 ~/.ipfs 文件夹挂载到外部驱动器?

请注意,这个问题与 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外部驱动器中实际存在的已创建文件。

相关内容