Biake Chou

  • 首页

  • 标签

  • 分类

  • 归档

  • 搜索

LangChain_Chatchat+ChatGLM3环境搭建(Windows),打造自己的GPT和知识库

发表于 2024-03-07

系统环境准备

  • 安装git和lfs,https://git-scm.com/downloads
  • Anaconda环境安装,https://www.anaconda.com/download
    • 系统环境变量Path添加配置
      • D:\Projects_Test\Anaconda\Scripts
      • D:\Projects_Test\Anaconda
  • 安装N卡驱动和CUDA Toolkit安装 https://developer.nvidia.com/cuda-downloads,并查看cuda版本,确保和项目环境匹配
    $ nvidia-smi
    $ nvcc --version

软件虚拟环境准备

  • 新建conda虚拟环境

    # 配置清华镜像源
    $ pip config set global.index-url https://mirrors.cloud.tencent.com/pypi/simple/
    # 拉取项目
    $ git clone https://github.com/chatchat-space/Langchain-Chatchat.git
    $ cd Langchain-Chatchat
    # 新建虚拟环境并激活
    $ conda create -n LangChain_ChatGLM python=3.11
    $ conda activate LangChain_ChatGLM
    # 安装依赖
    $ pip install -r requirements.txt
    $ pip install -r requirements_api.txt
    $ pip install -r requirements_webui.txt
  • 配置

    • 生成配置文件

      $ python copy_config_example.py
    • 修改配置 /configs/model_config.py

      # 离线模型路径
      MODEL_ROOT_PATH = "D:\Projects_Test\ChatGLM\Langchain-Chatchat"
      # 选用的 Embedding 名称
      EMBEDDING_MODEL = "bge-large-zh"

      MODEL_PATH = {
      "embed_model": {
      ...
      "bge-large-zh": "my_models/bge-large-zh",
      ...
      },
      "llm_model": {
      ...
      "chatglm3-6b": "my_models/chatglm3-6b",
      ...
      }
      }
    • 如想外部能访问,可修改/configs/server_config.py

      # webui.py server
      WEBUI_SERVER = {
      "host": "0.0.0.0",
      "port": 8501,
      }
      # api.py server
      API_SERVER = {
      "host": "0.0.0.0",
      "port": 7861,
      }

运行

  • 初始化知识库

    $ python init_database.py --recreate-vs

    # 如果报错 no module named “pwd” ,需要降低`langchain-community`版本
    $ pip install langchain-community==0.0.19
  • 启动

    $ python startup.py -a

    # 报错 Torch not compiled with CUDA enabled 查看 https://pytorch.org/get-started/previous-versions/
    $ conda install pytorch==2.2.0 torchvision==0.17.0 torchaudio==2.2.0 pytorch-cuda=12.1 -c pytorch -c nvidia
  • 效果
    DEMO

离线模型下载地址

  • https://huggingface.co/THUDM/chatglm3-6b
  • https://modelscope.cn/models/ZhipuAI/chatglm3-6b/summary

WSL2 运行慢的问题

发表于 2021-09-05 | 更新于 2021-09-17

问题描述 官方issue (https://github.com/microsoft/WSL/issues/4197)

  • 项目放在挂载的/mnt目录会有I/O 慢的问题

解决

  • 项目文件不要放在/mnt目录即可

迁移Docker Desktop 镜像文件 (WSL2)

发表于 2021-08-17 | 更新于 2021-09-17

迁移目录,到 D:\WSL2

  • 删除所有容器。
  • 退出 Docker Desktop
  • 迁移命令
    # 关闭所有
    wsl --shutdown

    # 查看是否都是 stop 状态
    wsl --list --verbose

    # 备份已有image数据
    wsl --export docker-desktop-data D:\WSL2\docker-desktop-data.tar

    # 注销当前的docker-desktop-data发行版, 该命令执行完成之后,再次使用wsl --list --verbose命令查看,docker-desktop-data就已经不在了。
    wsl --unregister docker-desktop-data

    # 重新导入备份的docker-desktop-data
    wsl --import docker-desktop-data D:\WSL2\docker-desktop-data D:\WSL2\docker-desktop-data.tar --version 2

    # 同上迁移 docker-desktop
    wsl --export docker-desktop D:\WSL2\docker-desktop.tar
    wsl --unregister docker-desktop
    wsl --import docker-desktop D:\WSL2\docker-desktop D:\WSL2\docker-desktop.tar --version 2

    # 查看状态
    wsl --list --verbose

WSL2 安装 Ubuntu 18.04

发表于 2021-07-16 | 更新于 2021-09-17

官方教程网址

  • 可以在控制面板–> 程序 –> 启动和关闭功能处开启,也可以使用以下命令开启

    # 启用适用于 Linux 的 Windows 子系统
    dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
    # 启用虚拟机功能
    dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
  • 重启电脑(重要)

  • 下载 Linux 内核更新包,并安装。见官网链接

  • 已管理员身份开启PowerShell

    wsl --set-default-version 2
  • 到 Microsoft Store 选择 Ubuntu 18.04 安装

默认使用root

  • 管理员身份打开PowerShell
    # 到ubuntu应用目录,`CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc`目录名可能不一样
    cd "C:\Users\<用户目录>\AppData\Local\Microsoft\WindowsApps\CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc"
    ubuntu1804.exe config --default-user root

启动命令(包括固定ip,启动ssh,启动docker),需管理员运行

:: 设置固定IP
wsl -d Ubuntu-18.04 -u root ip addr add 192.168.50.2/24 broadcast 192.168.50.255 dev eth0 label eth0:1
netsh interface ip add address "vEthernet (WSL)" 192.168.50.1 255.255.255.0

:: 启动 ssh
:: 或者 wsl -d Ubuntu-18.04 -u root -e /etc/init.d/ssh restart
wsl -d Ubuntu-18.04 -u root service ssh restart

:: 启动docker
:: wsl -d Ubuntu-18.04 -u root service docker restart

pause

## 重启命令,需管理员运行

net stop LxssManager
net start LxssManager
pause

更换源 /etc/apt/sources.list 清华镜像站

# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse

使用windows的代理,打开当前用户的.bashrc , 添加以下内容

hostip=$(cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }')
wslip=$(hostname -I | awk '{print $1}')
port=7890 # 根据代理端口更改

poff(){
unset http_proxy
unset https_proxy
echo -e "已关闭代理"
}
pon() {
export no_proxy="localhost,127.0.0.1,localaddress,.localdomain.com"
export http_proxy="http://${hostip}:${port}"
export https_proxy=$http_proxy
echo -e "已开启代理"
}

test_setting(){
echo "Host ip:" ${hostip}
echo "WSL ip:" ${wslip}
echo "Current proxy:" $https_proxy
}

问题记录

  • SSH访问失败问题

    • 缺少 ssh_host_rsa_key ssh_host_ecdsa_key ssh_host_ed25519_key
      $ service ssh restart
      # 重启ssh服务提示
      Could not load host key: /etc/ssh/ssh_host_rsa_key
      Could not load host key: /etc/ssh/ssh_host_ecdsa_key
      Could not load host key: /etc/ssh/ssh_host_ed25519_key

      # 重新生成 key
      $ ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
      $ ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
      $ ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key

      $ service ssh restart
  • 局域网访问 需端口映射

    :: 列出所有映射
    netsh interface portproxy show all
    :: 增加端口 也可以用 listenaddress=*
    netsh interface portproxy add v4tov4 listenport=9898 listenaddress=0.0.0.0 connectport=9898 connectaddress=192.168.50.2 protocol=tcp
    :: 删除端口
    netsh interface portproxy delete v4tov4 listenport=9898 listenaddress=0.0.0.0
  • windows无法被ubuntu访问, 见官方issue

    • 打开高级防火墙
    • 添加入站规则 ==》 自定义 ==》协议类型选择ICMPV4

NodeJs调用DLL记录(含Electron)

发表于 2020-10-02 | 更新于 2020-10-15

最近涉及到华视身份证读卡器CVR-100U使用,官方有webservice方式使用更简单,这里记录下调用DLL方式实现

NodeJs示例 https://github.com/waptak/DLL-Reader

Electron示例 https://github.com/waptak/Electron-DLL-Reader

window需要编译环境

# npm i 报错内容
gyp ERR! find VS msvs_version not set from command line or npm config
gyp ERR! find VS VCINSTALLDIR not set, not running in VS Command Prompt
gyp ERR! find VS could not use PowerShell to find Visual Studio 2017 or newer
gyp ERR! find VS looking for Visual Studio 2015
gyp ERR! find VS - not found
gyp ERR! find VS not looking for VS2013 as it is only supported up to Node.js 8
gyp ERR! find VS
gyp ERR! find VS **************************************************************
gyp ERR! find VS You need to install the latest version of Visual Studio
gyp ERR! find VS including the “Desktop development with C++” workload.
gyp ERR! find VS For more information consult the documentation at:
gyp ERR! find VS https://github.com/nodejs/node-gyp#on-windows
gyp ERR! find VS **************************************************************
gyp ERR! find VS
gyp ERR! configure error
gyp ERR! stack Error: Could not find any Visual Studio installation to use


# 需要安装 python 2.7,以下命令已包含 使用PowerShell 管理员模式执行此命令
$ npm install --global --production windows-build-tools

本来使用的ffi包,因为在Electron高版本下编译失败,故改为ffi-napi

//package.json
{
...
"dependencies" :{
...
"ffi-napi": "^3.0.1",
"iconv-lite": "^0.6.2",
"ref-napi": "^3.0.1",
"ref-array-napi": "^1.2.1"
}
}

代码示例

var ffi = require('ffi-napi');
var path = require('path');
const ref = require('ref-napi')
const refArray = require('ref-array-napi')
var iconv = require('iconv-lite');
var dllPath = path.resolve('Termb.dll');
// 根据dll中的api方法配置
var lib = ffi.Library(dllPath, {
'CVR_InitComm': ['int', ['int']],
'CVR_CloseComm': ['int',[]],
'CVR_Authenticate': ['int',[]],
'CVR_Read_FPContent': ['int', []],
'GetPeopleName':['int' ,[ref.refType('char') , ref.refType('int')]]
})

var iRetUSB = lib.CVR_InitComm(1001)
if (iRetUSB != 1) return;

var authenticate = lib.CVR_Authenticate();
if (authenticate != 1) {
lib.CVR_CloseComm();
return;
}

var readContent = lib.CVR_Read_FPContent();
if (readContent != 1) {
lib.CVR_CloseComm();
return;
}

var handleRef = ref.alloc('int');
var lt = Buffer.alloc(128);
lib.GetPeopleName(lt , handleRef);
var name = iconv.decode(lt, 'GBK');
console.log('GetPeopleName',name)

Electron中打包需要注意的

  • NodeJS版本建议10+以上,
  • 使用electron-builder打包时需要配置dll相关文件和目录为extraResources

    {
    ...
    "build": {
    ...
    "extraResources": [
    "./dll" //放dll的目录,也可以用通配符匹配dll
    ],
    }
  • 获取dll路径需要判断 , 打包后路径和在调试时路径不一致,可自己根据路径中.asar判断

    var dllPath = path.join((__dirname.includes(".asar") ? process.resourcesPath : __dirname) , 'dll/Termb.dll')

WebRTC信令服务器Coturn搭建(ubuntu)

发表于 2020-08-15 | 更新于 2020-10-15

Coturn服务器搭建(turn stun)

防火墙开放3478端口

安装依赖

# 
$ apt-get install openssl libssl-dev make

# libevent 下载编译
$ wget https://github.com/libevent/libevent/releases/download/release-2.1.10-stable/libevent-2.1.10-stable.tar.gz
$ tar -zxvf libevent-2.1.10-stable.tar.gz
$ cd libevent-2.1.10-stable
$ ./configure
$ make & make install

## 用户信息默认保存在sqlite ,也可以使用mysql
$ apt-get install sqlite libsqlite3-dev

下载coturn源码并编译

# 编译
$ wget https://github.com/coturn/coturn/archive/4.5.1.1.tar.gz
$ tar -zxvf 4.5.1.1.tar.gz
$ cd coturn-4.5.1.1
$ ./configure
$ make & make install
# 查看
$ which turnserver
# 签名证书
openssl req -x509 -newkey rsa:2048 -keyout /etc/turn_server_pkey.pem -out /etc/turn_server_cert.pem -days 99999 -nodes

修改配置 /usr/local/etc/turnserver.conf

# 复制默认版本
$ cp /usr/local/etc/turnserver.conf.default /usr/local/etc/turnserver.conf

relay-device=eth0 # 网卡
listening-ip=x.x.x.x # 内网地址
listening-port=3478
tls-listening-port=5349
relay-ip=x.x.x.x # 内网地址
external-ip=x.x.x.x # 外网地址
relay-threads=50
lt-cred-mech
cert=/etc/turn_server_cert.pem # 上面生成的证书
pkey=/etc/turn_server_pkey.pem # 上面生成的证书
pidfile="/var/run/turnserver.pid"
min-port=49152
max-port=65535
user=xxxx:123456 # 用户名和密码
cli-password=123456 # 不指定会抛错

启动服务

$ turnserver -o -a -f -user=xxxx:123456 -r jiangsu
# 验证端口
$ lsof -i:3478

穿透监测网址 https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/

let iceServer = {
iceServers: [
{
url: "stun:xxx:3478"
},
{
urls: "turn:xxxx:3478",
username: "xxxx",
credential: "123456",
},
],
};

redis 5.0 + docker 集群部署

发表于 2020-03-11 | 分类于 docker

redis 5.0 + docker集群配置

踩坑说明

  • docker容器network_mode没有使用host模式,最初不想改变内部端口,只改对外端口,没用host模式。虽然组建集群成功,但有如下情况

    • redis内部redirect时会自动内部分配的ip,导致和外部网络不在同一网段
    • 出现的结果:用redis-cli进入容器操作都正常,但外部项目使用或者redis工具查看操作时就卡住
    • nodejs项目中使用ioredis测试,写入和读取都没有反应,也不报错
  • 防火墙端口相关,被自己的mac坑了半天,建议不要在mac上测试了,服务器上的话也关了防火墙试,测试成功再开放端口测试

综上改回host模式测试成功,以下记录部署流程,多台其实一样

  • 新建6个目录redis_<端口>

  • 准备redis.conf文件,放在新建的目录中,根据不同端口修改以下参数

    # 考虑安全起见,可以配置成被访问的网卡ip
    bind 0.0.0.0
    # 自己定义端口
    port 6375
    # 建议和端口一致
    pidfile /var/run/redis_6375.pid
    # 集群时访问密码,和requirepass设置成一致相对方便
    masterauth 123456
    requirepass 123456
    # 开启集群
    cluster-enabled yes
    # 建议和端口一致,不要与其他容器的重名,看到有人重名后有问题
    cluster-config-file nodes-6375.conf
    # 持久化,根据自己需求修改,不是必须的
    appendonly yes
  • docker-compose.yml 配置文件

    version: '3.4'
    # 共用配置项
    x-image:
    &default-image
    redis:5.0
    x-command:
    &default-command
    ["redis-server", "/etc/redis/redis.conf"]
    x-netmode:
    &default-netmode
    host

    # 容器配置
    services:
    redis_slave_1:
    image: *default-image
    restart: always
    container_name: redis_slave_1
    volumes:
    - ./redis_6371/redis.conf:/etc/redis/redis.conf
    - ./redis_6371/data:/data
    environment:
    - TZ=Asia/Shanghai
    command: *default-command
    network_mode: *default-netmode

    redis_slave_2:
    image: *default-image
    restart: always
    container_name: redis_slave_2
    volumes:
    - ./redis_6372/redis.conf:/etc/redis/redis.conf
    - ./redis_6372/data:/data
    environment:
    - TZ=Asia/Shanghai
    command: *default-command
    network_mode: *default-netmode

    redis_slave_3:
    image: *default-image
    restart: always
    container_name: redis_slave_3
    volumes:
    - ./redis_6373/redis.conf:/etc/redis/redis.conf
    - ./redis_6373/data:/data
    environment:
    - TZ=Asia/Shanghai
    command: *default-command
    network_mode: *default-netmode

    redis_slave_4:
    image: *default-image
    restart: always
    container_name: redis_slave_4
    volumes:
    - ./redis_6374/redis.conf:/etc/redis/redis.conf
    - ./redis_6374/data:/data
    environment:
    - TZ=Asia/Shanghai
    command: *default-command
    network_mode: *default-netmode
    redis_slave_5:
    image: *default-image
    restart: always
    container_name: redis_slave_5
    volumes:
    - ./redis_6375/redis.conf:/etc/redis/redis.conf
    - ./redis_6375/data:/data
    environment:
    - TZ=Asia/Shanghai
    command: *default-command
    network_mode: *default-netmode

    redis_slave_6:
    image: *default-image
    restart: always
    container_name: redis_slave_6
    volumes:
    - ./redis_6376/redis.conf:/etc/redis/redis.conf
    - ./redis_6376/data:/data
    environment:
    - TZ=Asia/Shanghai
    command: *default-command
    network_mode: *default-netmode
  • 启动容器

    $ docker-compose up -d
  • 使用镜像goodsmileduck/redis-cli:v5.0.3 创建集群,多台服务器就根据ip修改

    # -a 表示连接密码
    # --cluster-replicas 1 表示 一主一从
    # --cluster create 后面表示需要集群的redis主机和端口
    $ docker run --rm -it goodsmileduck/redis-cli:v5.0.3 redis-cli -a 123456 --cluster-replicas 1 --cluster create 192.168.30.111:6371 192.168.30.111:6372 192.168.30.111:6373 192.168.30.111:6374 192.168.30.111:6375 192.168.30.111:6376
  • 连接一台测试,也可以用可视化工具

    $ docker run --rm -it goodsmileduck/redis-cli:v5.0.3 redis-cli -c -h 192.168.30.111 -p 6371 -a 123456

顺便写下nodejs中ioredis使用

var Redis = require("ioredis");
var cluster = new Redis.Cluster([{
port: 6371,
host: '192.168.30.111',
}, {
port: 6372,
host: '192.168.30.111',
}], {
redisOptions: {
password: "123456",
// scaleReads:'slave'
}
});
cluster.set("foo", "bar");
cluster.get("foo", function(err, res) {

});

docker compose 部署mongodb相关记录

发表于 2019-07-11

docker-compose 发布mongodb

version: '3'
services:
mongo:
image: mongo:4.1.13
restart: always
volumes:
# 数据挂载
- ./mongodb/data/db:/data/db
# 备份目录挂载
- ./mongodb/backup:/data/backup:rw
ports:
- 27017:27017
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: root

进入容器 备份命令

$ docker-compose exec mongo /bin/sh
# dump出 publish表 用户 root 密码 root
$ mongodump -d publish -u root -p root --authenticationDatabase admin -o /data/backup
# export出 collection
$ mongoexport -d publish -u root -p root --authenticationDatabase admin -c servers -o /data/backup/json/server.json

恢复命令

# restore导入 --drop为删除原表后还原
mongorestore -d publish -u root --password root --authenticationDatabase admin /data/backup/publish --drop
# import导入
# 使用备份文件/data/mongobackup/servers.json导入数据到publish数据库的servers集合中,--upsert表示更新现有数据,如果不使用--upsert,则导入时已经存在的文档会报_id重复,数据不再插入.也可以使用--drop删除原数据.
mongoimport -d publish -u root --password root --authenticationDatabase admin -c servers /data/backup/json/server.json --upsert

使用docker compose 备份命令,可用于宿主机定时任务

$ docker-compose exec -T <mongo容器名称> mongodump -d publish -u root -p root --authenticationDatabase admin -o /data/backup

Docker Remote Api 配置

发表于 2018-05-31 | 更新于 2018-06-20 | 分类于 docker

Docker Remote Api 相关配置

基于Ubuntu 16.04 , Docker Version 18.05.0-ce , API Version: 1.37

开启API

$ sudo vim /lib/systemd/system/docker.service

#修改
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:1234

#重启
$ sudo systemctl daemon-reload
$ sudo service docker restart

#测试
$ curl http://localhost:1234/version

输出内容

{"Platform":{"Name":""},"Components":[{"Name":"Engine","Version":"18.05.0-ce","Details":{"ApiVersion":"1.37","Arch":"amd64","BuildTime":"2018-05-09T22:14:32.000000000+00:00","Experimental":"false","GitCommit":"f150324","GoVersion":"go1.9.5","KernelVersion":"4.4.0-31-generic","MinAPIVersion":"1.12","Os":"linux"}}],"Version":"18.05.0-ce","ApiVersion":"1.37","MinAPIVersion":"1.12","GitCommit":"f150324","GoVersion":"go1.9.5","Os":"linux","Arch":"amd64","KernelVersion":"4.4.0-31-generic","BuildTime":"2018-05-09T22:14:32.000000000+00:00"}

部分接口

# 获取所有容器信息
GET /containers/json

# 获取指定容器信息
GET /containers/(id)/json

# 获取指定容器信息
GET /containers/(id)/logs

# 导出容器
GET /containers/(id)/export

# 启动容器
POST /containers/(id)/start

# 停止容器
POST /containers/(id)/stop

# 终止容器
POST /containers/(id)/kill

gitlab-runner 配置

发表于 2018-05-20 | 更新于 2018-06-20 | 分类于 gitlab

gitlab runner 安装

  1. 非docker安装

    $ curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash

    $ sudo apt-get install gitlab-runner
    # 注册
    $ sudo gitlab-runner register
  2. docker 安装

    #启动容器
    $ docker run -d --name gitlab-runner --restart always \
    -v /srv/gitlab-runner/config:/etc/gitlab-runner \
    -v /var/run/docker.sock:/var/run/docker.sock \
    gitlab/gitlab-runner:latest

    # 注册
    $ docker exec -it gitlab-runner gitlab-runner register

注册


#Running in system-mode.

#Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://192.168.18.111/
#Please enter the gitlab-ci token for this runner:
#查看gitlab的token
#Please enter the gitlab-ci description for this runner:
[ubuntu]: runner
#Please enter the gitlab-ci tags for this runner (comma separated):
gitlab-runner
#Whether to run untagged builds [true/false]:
[false]: true
#Whether to lock the Runner to current project [true/false]:
[true]: true
#Registering runner... succeeded runner=vmYsE-7g
#Please enter the executor: parallels, ssh, virtualbox, docker+machine, docker-ssh+machine, kubernetes, docker, docker-ssh, shell:
docker
#Please enter the default Docker image (e.g. ruby:2.1):
node:8.9.3 # aspnetcore 使用microsoft/aspnetcore-build:2.0
#Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

问题

# ERROR: Failed to create container volume for /builds/human/demo Failed to import image: Error response from daemon: exec: "xz": executable file not found in $PATH
# ERROR: Preparation failed: Failed to import image: Error response from daemon: exec: "xz": executable file not found in $PATH
$ sudo apt-get install -y xz-utils
123
Biake Chou

Biake Chou

Learning , Sharing

23 日志
8 分类
23 标签
GitHub
Links
  • Jake
  • NeilQ
© 2024 Biake Chou
由 Hexo 强力驱动 v3.6.0
|
主题 — NexT.Pisces v6.3.0