diff --git a/.gitignore b/.gitignore index 2525c2f..0e09771 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -nerdctl-full-2.0.0-linux-amd64.tar.gz \ No newline at end of file +nerdctl-full-2.0.0-linux-amd64.tar.gz +nerdctl-full-1.7.6-linux-amd64.tar.gz \ No newline at end of file diff --git a/nerdctl/install_nerdctl_full_alluser.sh b/nerdctl/install_nerdctl_full_alluser.sh index 609f368..4ce0d3a 100755 --- a/nerdctl/install_nerdctl_full_alluser.sh +++ b/nerdctl/install_nerdctl_full_alluser.sh @@ -1,6 +1,6 @@ #!/bin/bash -VERSION="2.0.0" +VERSION="1.7.6" FILENAME="nerdctl-full-${VERSION}-linux-amd64.tar.gz" # https://github.com/containerd/nerdctl/releases/download/v2.0.0/nerdctl-full-2.0.0-linux-amd64.tar.gz DOWNLOAD_URL="https://ghproxy.dockless.eu.org/https://github.com/containerd/nerdctl/releases/download/v${VERSION}/${FILENAME}" @@ -17,27 +17,26 @@ install_nerdctl() { sudo apt-get update sudo apt-get install -y wget tar jq curl gnupg lsb-release uidmap - echo "下载 nerdctl-full..." - wget ${DOWNLOAD_URL} + # 检查文件是否已经下载 + if [ -f "${FILENAME}" ]; then + echo "${FILENAME} 已存在,跳过下载。" + else + echo "下载 nerdctl-full..." + wget ${DOWNLOAD_URL} + fi echo "解压并移动到 /usr/local..." sudo tar -C /usr/local -xzf ${FILENAME} - echo "启动并启用 containerd 服务..." - sudo systemctl enable --now containerd - - echo "验证安装..." - nerdctl --version - # echo "清理下载文件..." # rm ${FILENAME} echo "安装 nerdctl bash 自动补全..." sudo apt install bash-completion -y - nerdctl completion bash > /etc/bash_completion.d/nerdctl - nerdctl completion bash > /etc/bash_completion.d/docker - source /etc/bash_completion.d/nerdctl - source /etc/bash_completion.d/docker + sudo nerdctl completion bash | sudo tee /etc/bash_completion.d/nerdctl > /dev/null + sudo nerdctl completion bash | sudo tee /etc/bash_completion.d/docker > /dev/null + sudo bash -c "source /etc/bash_completion.d/nerdctl" + sudo bash -c "source /etc/bash_completion.d/docker" echo "创建 docker 兼容命令..." sudo tee /usr/local/bin/docker > /dev/null < /dev/null < /dev/null < /etc/containerd/config.toml containerd config default | sudo tee /etc/containerd/config.toml # 使用 sed 命令在特定位置添加配置项 @@ -127,7 +184,12 @@ configure_containerd() { # 配置 NVIDIA runtime sudo nvidia-ctk runtime configure --runtime=containerd + # 配置镜像源 + echo "配置镜像源....." + bash ./setup_containerd_mirror_addall.sh + # 重启 containerd 服务 + sudo systemctl daemon-reload sudo systemctl restart containerd } @@ -144,65 +206,30 @@ start_containerd() { configure_buildkitd() { echo "配置 buildkitd 服务..." - # 创建 buildkitd 配置文件目录 - sudo mkdir -p /etc/buildkit - # https://github.com/moby/buildkit/blob/master/docs/buildkitd.toml.md - sudo tee /etc/buildkit/buildkit.toml > /dev/null < /dev/null < /dev/null < /dev/null - -# 配置路径 -CONFIG_PATH="/etc/containerd/certs.d" -NEW_STORAGE_PATH="/data/containerd" -OLD_STORAGE_PATH="/var/lib/containerd" -OLD_STATE_PATH="/run/containerd" # 旧的 state 目录 - -# 修改 root 和 state 路径 -echo "更新 containerd 存储路径配置..." -sudo sed -i "s|^\s*root\s*=.*|root = \"$NEW_STORAGE_PATH\"|" /etc/containerd/config.toml -sudo sed -i "s|^\s*state\s*=.*|state = \"$NEW_STORAGE_PATH/state\"|" /etc/containerd/config.toml - -# 创建新的存储目录和状态目录 -echo "创建新的存储目录 $NEW_STORAGE_PATH 和状态目录..." -sudo mkdir -p "$NEW_STORAGE_PATH" -sudo mkdir -p "$NEW_STORAGE_PATH/state" -sudo chown -R root:root "$NEW_STORAGE_PATH" -sudo chmod -R 700 "$NEW_STORAGE_PATH" - -# 迁移旧的存储数据到新的存储路径 -if [ -d "$OLD_STORAGE_PATH" ]; then - echo "迁移旧存储数据到新路径..." - sudo rsync -a "$OLD_STORAGE_PATH/" "$NEW_STORAGE_PATH/" - - if [ $? -eq 0 ]; then - echo "存储数据迁移完成,删除旧的存储路径..." - sudo rm -rf "$OLD_STORAGE_PATH" - echo "旧的存储路径已删除。" - else - echo "存储数据迁移失败,保留旧的存储路径。" - fi -else - echo "旧的存储路径 $OLD_STORAGE_PATH 不存在,无需迁移。" -fi - -# 迁移旧的状态数据到新的状态路径 -if [ -d "$OLD_STATE_PATH" ]; then - echo "迁移旧状态数据到新状态路径..." - sudo rsync -a "$OLD_STATE_PATH/" "$NEW_STORAGE_PATH/state/" - - if [ $? -eq 0 ]; then - echo "状态数据迁移完成,删除旧的状态路径..." - sudo rm -rf "$OLD_STATE_PATH" - echo "旧的状态路径已删除。" - else - echo "状态数据迁移失败,保留旧的状态路径。" - fi -else - echo "旧的状态路径 $OLD_STATE_PATH 不存在,无需迁移。" -fi - -# 获取迁移后的新目录大小 -initial_size=$(sudo du -sb "$NEW_STORAGE_PATH" | awk '{print $1}') - -# 配置加速镜像的主机和路径 -declare -A mirrors -mirrors=( - ["docker.io"]="https://docker.io https://docker.unsee.tech https://dockerhub.icu" - ["registry.k8s.io"]="https://registry.k8s.io https://k8s.m.daocloud.io" - ["docker.elastic.co"]="https://docker.elastic.co https://elastic.m.daocloud.io" - ["gcr.io"]="https://gcr.io https://gcr.m.daocloud.io" - ["ghcr.io"]="https://ghcr.io https://ghcr.m.daocloud.io" - ["k8s.gcr.io"]="https://k8s.gcr.io https://k8s-gcr.m.daocloud.io" - ["mcr.microsoft.com"]="https://mcr.microsoft.com https://mcr.m.daocloud.io" - ["nvcr.io"]="https://nvcr.io https://nvcr.m.daocloud.io" - ["quay.io"]="https://quay.io https://quay.m.daocloud.io" - ["registry.jujucharms.com"]="https://registry.jujucharms.com https://jujucharms.m.daocloud.io" - ["rocks.canonical.com"]="https://rocks.canonical.com https://rocks-canonical.m.daocloud.io" -) - -# 创建 hosts.toml 配置文件 -echo '正在配置镜像加速...' -for registry in "${!mirrors[@]}"; do - IFS=' ' read -r server host1 host2 host3 <<<"${mirrors[$registry]}" - DIR="$CONFIG_PATH/$registry" - sudo mkdir -p "$DIR" - sudo tee "$DIR/hosts.toml" > /dev/null < /dev/null +# echo "生成默认的 config.toml 配置..." +# sudo containerd config default | sudo tee /etc/containerd/config.toml > /dev/null +# sudo containerd config default | sed 's/version = "3"/version = "2"/' | sudo tee /etc/containerd/config.toml > /dev/null -# 配置路径 +# CONFIG_PATH="/etc/containerd/certs.d" NEW_STORAGE_PATH="/data/containerd" OLD_STORAGE_PATH="/var/lib/containerd" OLD_STATE_PATH="/run/containerd" # 旧的 state 目录 +# 查找 [plugins.'io.containerd.grpc.v1.cri'.registry] 的位置并修改或添加 config_path 配置 +echo '配置 containerd 的 config.toml...' + +line_number=$(grep -n -E '^\s*\[plugins.(\"|\x27)io.containerd.grpc.v1.cri(\"|\x27).registry\]' /etc/containerd/config.toml | cut -d':' -f1) + +if [ -n "$line_number" ]; then + # 检查下一行是否包含 `config_path` + next_line=$((line_number + 1)) + if grep -q "^\s*config_path\s*=" /etc/containerd/config.toml; then + # 若找到 `config_path`,则直接替换为新的值 + sudo sed -i "${next_line}s|config_path\s*=.*|config_path = '$CONFIG_PATH'|" /etc/containerd/config.toml + echo "已修改 config_path 为 $CONFIG_PATH。" + else + echo "未找到 config_path,未执行任何修改。" + fi +else + echo "未找到 [plugins.'io.containerd.grpc.v1.cri'.registry] 段落,请检查 config.toml 文件格式。" +fi + +# 检查配置文件 +sudo containerd config dump + # 修改 root 和 state 路径 echo "更新 containerd 存储路径配置..." sudo sed -i "s|^\s*root\s*=.*|root = \"$NEW_STORAGE_PATH\"|" /etc/containerd/config.toml @@ -57,6 +80,10 @@ else echo "旧的状态路径 $OLD_STATE_PATH 不存在,无需迁移。" fi +# 删除所有的旧的镜像 +sudo nerdctl --namespace k8s.io image prune -a --force +sudo nerdctl --namespace default image prune -a --force + # 获取迁移后的新目录大小 initial_size=$(sudo du -sb "$NEW_STORAGE_PATH" | awk '{print $1}') @@ -103,6 +130,8 @@ sudo systemctl restart containerd # 设置 containerd.sock 的权限 echo "设置 containerd.sock 的访问权限..." +# sudo mkdir -p /run/containerd +# sudo touch /run/containerd/containerd.sock sudo chown root:containerd /run/containerd/containerd.sock sudo chmod 660 /run/containerd/containerd.sock