# Lotus 服务器初始化

在使用机器之前,我们需要先统一把所有的机器初始化环境:

  1. 安装好 lotus 运行依赖库。
  2. 初始化并挂载好磁盘,主要是挂载 Worker 的 SSD/NVME 缓存盘,多张磁盘需要组 RAID 整列。
  3. 如果有 GPU 的机器还需要安装 GPU 驱动。

以上操作我们都可以通过原语云的 【任务面板】 来一次性批量完成。

提示

如果你的机器之前已经跑过集群了,那可能你的机器已经初始化过了,就可以跳过此步骤。此外你还需要做一件事情,就是把你之前用做 lotus/lotus-miner/lotus-worker 的 repo 目录所在磁盘设备重新挂载到 /yuanyu 目录下。具体详细的操作文档请阅读原语云集群迁移

# 01-安装 Lotus 运行依赖

安装 Lotus 运行依赖,并设置服务器时区,同步时间。

  1. 下载 install_lotus_deps.lua

  2. 双击 任务面板, 新建任务.

  3. 点击 更多操作 下来菜单,编辑任务代码.

  4. 复制第 1 步下载文件的内容,粘贴到代码输入框,保存代码

  5. 点击 更多操作 下来菜单,选择 运行.

  6. 选择节点分发方式.

  7. 选择你需要推送脚本运行的节点,点击 确定 按钮.

  8. 最后,输入服务密码之后即可执行.

  9. 脚本执行成功之后,右上角会弹出提示框.

  10. 可以导出脚本执行日志,查看执行结果.

# 02-安装 GPU 驱动

有 GPU 的机器都需要安装 GPU 驱动才可以正常工作。安装 GPU 驱动的步骤跟上面安装依赖差不多,只不过在编辑代码的时候,脚本引擎选择 Bash, 然后把下面的脚本输入到代码编辑框中。

apt install nvidia-driver-460

安装完成之后记得禁止 GPU 驱动升级, 否则 GPU 驱动自动升级的话,会导致 GPU 无法调用,需要重启系统。

mv /etc/apt/apt.conf.d/20auto-upgrades /etc/apt/apt.conf.d/disabled.20auto-upgrades
mv /etc/apt/apt.conf.d/50auto-upgrades /etc/apt/apt.conf.d/disabled.50auto-upgrades

# 03-设置系统 ulimit 参数

随着扇区数量越来越多,在做时空证明的时候需要打开的文件也会越来越多,通常一个 Partition 超过 1024 个扇区之后 Miner 就会报 too many open files 错误,导致时空证明提交失败。daemon 在同步文件过多的时候也会出现类似的错误。这是因为系统默认的 ulimit 大小只有 1024.

提示

原语云在启动 minerdaemon 进程的时候会自动设置程序的 ulimit1024000, 所以,通常你是不需要手动去设置 ulimit 参数的,但是目前没有针对不同的系统做大规模的测试,如果你发现启动应用的时候没有生效,请自行手动设置。

你可以通过如下方式去检测当前 lotus/lotus-miner 进程的 max open files 参数具体是多少:

  1. 获取 lotus/lotus-miner 程序的进程 ID
     ps aux|grep lotus-miner
    
  2. 查看进程的 max open files 参数(假设你的 lotus-miner 的进程 ID 为 1234):
    grep "Max open files" /proc/1234/limits  
    # 会输出类似下面的信息
    #Limit              Soft Limit   Hard Limit   Units
    Max open files      10240        1048576      files
    

如果你的 max open files 值小于 65535 的话(不管是 Soft Limit 还是 Hard Limit),你可能需要把值设置得大一点,设置方法如下:

  1. 如果只是临时修改 ulimit 我们可以使用如下操作:

    ulimit -n 1024000
    
  2. 如果要永久设置,操作就复杂一些。

    2.1. 首先,需要设置系统层面的 ulimit。

    echo 'fs.file-max = 1024000' | sudo tee -a /etc/sysctl.conf
    sudo sysctl -p # 立即生效 
    

    2.2. 然后在修改用户层的配置:

    sudo tee -a /etc/security/limits.conf << EOF
    *               hard    nofile          1024000
    *               soft    nofile          1024000
    root            hard    nofile          1024000
    root            soft    nofile          1024000
    EOF
    

    2.3. 然后修改 Systemd 层:

    sudo sed -i '/DefaultLimitNOFILE/c DefaultLimitNOFILE=1048576' /etc/systemd/*.conf
    sudo systemctl daemon-reexec
    

    改完记得要重启才能生效!!!

# 04-挂载磁盘

提示

1、如果你之前已经用官方或者其他方案搭建好了集群,现在想迁移到原语的服务来搭建,那么很可能你的机器的磁盘已经初始化了(已经挂载),那么您可以跳过磁盘初始化步骤。

2、原语云的应用的数据和日志都是默认存储在 /yuanyu 路径下,所以如果你是自己挂载磁盘的话,请务必记住把最大磁盘(数据盘)重新挂载到 /yuanyu 路径下,以免造成空间不足。

我们提供了一个 Ark 语言写的脚本,可以自动根据你的条件扫描出所有的未挂载的磁盘,并自动组建好 RAID0,自动挂载并写入到 /etc/fstab 文件中。

警告

此操作会擦除磁盘所有数据,请谨慎操作。 如果过滤脚本只找到一块符合要求的磁盘,会直接格式化并挂载,如果找到多块磁盘,则会先组建 RAID0 再挂载。 已经挂载的磁盘不会处理。

  1. 下载 mount_disk.lua

  2. 双击 任务面板, 新建任务.

  3. 点击 更多操作 下来菜单,编辑任务代码.

  4. 复制第 1 步下载文件的内容,粘贴到代码输入框,保存代码

    提示

    你可能需要根据机器的具体情况修改 disk_min_sizedisk_max_size 这两个变量,分别表示最大磁盘大小和最小磁盘大小, 默认值分别为 5TiB9TiB刚好可以筛选出 8TiB 的磁盘), 用来辅助你需筛选出符合你要求的磁盘,防止误把其他磁盘格式化了。如果你的是 4TiB 的磁盘的话,这里你可以改成 3TiB5TiB

    -- 下面两个变量可以帮助你筛选出你需要挂载的磁盘,
    -- 设置你需要挂在磁盘的最大 size 和 最小 size, 9TiB(5368709120000) and 9TiB(9684354560000)
    local disk_min_size = 5368709120000 
    local disk_max_size = 9684354560000
    
    -- raid0 挂载路径
    local disk_mount_path = "/yuanyu"
    -- 磁盘扫描策略,默认是使用 qark 来收集磁盘信息的,
    -- 但是如果你想要在 raid 的基础上再组 raid, 则建议你使用另外一个可选值:fdisk
    local disk_scan_policy = "qark"
    
  5. 点击 更多操作 下来菜单,选择 运行.

  6. 选择节点分发方式.

  7. 选择你需要推送脚本运行的节点,点击 确定 按钮.

  8. 最后,输入服务密码之后即可执行.

  9. 脚本执行成功之后,右上角会弹出提示框.

  10. 可以导出脚本执行日志,查看执行结果.

    看到日志里面有类似:/dev/md0 19T 30G 19T 1% /yuanyu 的结果,就说明磁盘挂载成功了。

# 05-配置 qark-client http 服务器 新功能

我们在 qark-client 内部实现了一个轻量级且极为安全的 http 服务器。所有的 Lotus 相关软件和 API, Token 文件都直接通过该服务器下载即可,使用和配置都极为方便。

  1. 服务器的根目录在 /var/www/html
  2. http 服务监听的端口是 17181(来过我们公司的朋友应该对这个数字有点熟悉O(∩_∩)O~)。
  3. lotus 可执行程序的下载根目录是 http://<ip>:17181/lotus/ 而不是 http://<ip>:17181/ <ip> 为内网 IP

注意

虽然我们的 http 服务器在下载敏感信息的时候需要权限验证,比如在下载 JSON-RPC 的 API 和 Token 文件的时候会做权限认证,只有 qark-client 内部才能访问,但是我们还是建议您不要把 17181 端口暴露到外网。

上次更新: 2022/4/23 09:43:32