起因
- 1C1G升级4C24G
重建VPS实例
- 创建实例
- ARM服务器只能用 Oracle-Linux-9,命令几乎兼容centos7的
- 有初始化脚本 cloud-init 最小化
#cloud-config runcmd: - echo "opc:********" | chpasswd - sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config - systemctl restart sshd- 按操作步骤,opc不加ssh密钥
- 引导卷50G(实例终止后,引导卷会残留,需要终止掉)
- 提交创建成功
- 管理实例
- 修改网络VNIC的IP管理为预留的公网IP
- 开放ping:实例-网络-点开一个vcn-安全-Security List-安全规则列表-添加ICMP 8类型 0.0.0.0/0的规则即可
- 从附加卷操作,创建块卷150G,附加到实例CID,单对单挂载即可
用cloud shell连接维护
- 打开右上角的cloud shell
- 这是一个独立的小型机终端,不是你的实例
- 查看你的实例:oci compute instance list --compartment-id 你的租户OCID --query "data [*].{Name:\"display-name\", State:\"lifecycle-state\", IP:\"public-ip\"}" --output table
- 实例详情页-操作系统管理-启动cloud shell连接
- 这是直接连接你的实例终端
- 默认到trilium-20251227 login: 提示符,输入用户名密码即可,密码输入时光标不动,实际有效
- 进行用户一些管理操作
ssh权限
实例安装完成,第一次物理连接(cloud shell),完成ssh权限初始化
# 使用实例详情页-操作系统管理-启动cloud shell连接登录opc trilium-20251227 login: opc Password: # 查看之前init脚本的结果 [opc@trilium-20251227 ~]$ tail -n 20 /var/log/cloud-init-output.log # 生成ssh证书(一路回车即可,不要输密码) ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa # 授权:把刚生成的公钥加入授权(可以复用已有的) cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys # 私钥保存到本地,复制内容: 选中屏幕上从 -----BEGIN RSA PRIVATE KEY----- 开始,到 -----END RSA PRIVATE KEY----- 结束的所有文字。保存本地文件名为 opc_rsa.key cat ~/.ssh/id_rsa # 重启ssh服务,生效 sudo systemctl restart sshd- 用这个私钥在本地开ssh连接
- xshell使用无密码的key,有时候反复提示输入密码
- 用moba则很顺利登录
服务器设置
切换 root用户运行sh脚本:sudo -i
#!/bin/bash # ================================================================= # Oracle Linux 9 (ARM) 自动化初始化脚本 - 生产环境版 # ================================================================= # 确保以 root 权限运行 if [ "$EUID" -ne 0 ]; then echo -e "\033[31m[ERROR]\033[0m 请使用 root 用户运行此脚本 (或使用 sudo -i 切换后运行)" exit 1 fi # 遇到错误立即退出 set -e # 定义彩色打印函数 log_step() { echo -e "\n\033[1;34m==== $1 ====\033[0m" } log_success() { echo -e "\033[32m[OK]\033[0m $1" } log_step "1. 更新系统软件包与 DNF 缓存" # Oracle Linux 9 默认使用 dnf (yum 是软链接) dnf clean all rm -rf /var/cache/dnf/* log_success "清理旧缓存完成" dnf makecache log_info "正在更新系统软件 (yum update)..." dnf update -y log_success "系统更新完毕" log_step "2. 解除系统限制 (防火墙 & SELinux)" # 关闭防火墙 systemctl stop firewalld || true systemctl disable firewalld || true systemctl mask firewalld || true log_success "Firewalld 已彻底关闭并屏蔽" # 关闭 SELinux setenforce 0 || true sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config log_success "SELINUX 已设为 disabled (重启后永久生效)" echo "当前 SELinux 状态: $(sestatus | grep 'Current mode' || echo 'Disabled')" log_step "3. 安装基础工具与 EPEL 扩展源" dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm dnf install -y git htop curl yum-utils log_success "基础工具安装完成" log_step "4. 配置时区与环境" timedatectl set-timezone Asia/Shanghai log_success "时区已设置为: Asia/Shanghai" log_step "5. 创建生产用户 ghost (UID:1001)" if id "ghost" &>/dev/null; then log_success "用户 ghost 已存在,正在检查组权限..." else # 固定 UID 1001 以匹配旧实例权限 useradd -m -u 1001 -s /bin/bash ghost echo "ghost:xxxxxxxxx1111" | chpasswd log_success "用户 ghost (UID:1001) 创建成功" fi usermod -aG wheel ghost # 创建业务目录 mkdir -p /www chown -R ghost:ghost /www chmod 755 /www log_success "目录 /www 权限配置完成" log_step "6. 针对 4C24G 配置进行内核优化" # 使用 heredoc 一次性清空并重写相关参数,防止重复追加 cat >> /etc/sysctl.conf <<EOF # --- 内存与缓存优化 --- vm.swappiness=10 vm.vfs_cache_pressure=100 # --- 文件句柄与网络优化 --- fs.file-max=1000000 net.core.somaxconn=65535 net.ipv4.tcp_tw_reuse=1 net.ipv4.tcp_fin_timeout=30 EOF sysctl -p log_success "内核参数已加载:" sysctl vm.swappiness vm.vfs_cache_pressure log_step "7. 安装 Docker Engine (ARM64)" # 添加 Docker 官方 RHEL 源 (OL9 与 RHEL9 完全兼容) yum-config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo log_info "正在安装 Docker 组件..." dnf install -y docker-ce docker-ce-cli containerd.io log_info "正在下载 Docker Compose v2 (aarch64)..." DOCKER_PLUGINS=/usr/local/lib/docker/cli-plugins mkdir -p $DOCKER_PLUGINS curl -SL "https://github.com/docker/compose/releases/latest/download/docker-compose-linux-aarch64" -o $DOCKER_PLUGINS/docker-compose chmod +x $DOCKER_PLUGINS/docker-compose ln -sf $DOCKER_PLUGINS/docker-compose /usr/bin/docker-compose # 启动服务 systemctl enable --now docker usermod -aG docker ghost log_success "Docker 安装并启动完成" log_step "8. 网络配置与环境验证" # 创建网络 if docker network inspect ghost_net >/dev/null 2>&1; then log_success "网络 ghost_net 已存在" else docker network create ghost_net log_success "网络 ghost_net 创建完毕" fi echo -e "\n\033[1;32m====================================================\033[0m" echo -e " Oracle Linux 9 (ARM) 初始化完成!" echo -e "====================================================" echo "Docker 版本: $(docker --version)" echo "Compose 版本: $(docker compose version)" echo "ghost 用户 UID: $(id -u ghost)" echo "当前内存状态: $(free -h | grep Mem)" echo -e "====================================================" log_success "建议操作:由于修改了 SELinux,可以执行 'reboot' 确保环境完全洁净。"- 给新用户增加ssh
# 服务器进ghost用户,直接修改写入公钥 交互时记得复制公钥内容并粘贴 mkdir -p ~/.ssh && vi ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
挂载存储卷
存储卷在新实例复用为/www
# iSCSI - 注册,这组命令是获取存储卷设备的前提,只有登录 iSCSI 后,才能看到 /dev/sdb。 [root@instance-20260324-0911 ~]# systemctl enable --now iscsid iscsi Created symlink /etc/systemd/system/multi-user.target.wants/iscsid.service → /usr/lib/systemd/system/iscsid.service. [root@instance-20260324-0911 ~]# iscsiadm -m discovery -t st -p 169.254.2.2:3260 169.254.2.2:3260,1 iqn.2015-12.com.oracleiaas:06448145-768e-4b6e-86fc-959b5d566b55 [root@instance-20260324-0911 ~]# iscsiadm -m node 169.254.0.2:3260,1 iqn.2015-02.oracle.boot:uefi 169.254.2.2:3260,1 iqn.2015-12.com.oracleiaas:06448145-768e-4b6e-86fc-959b5d566b55 [root@instance-20260324-0911 ~]# iscsiadm -m node -T iqn.2015-12.com.oracleiaas:06448145-768e-4b6e-86fc-959b5d566b55 -p 169.254.2.2:3260 -l Login to [iface: default, target: iqn.2015-12.com.oracleiaas:06448145-768e-4b6e-86fc-959b5d566b55, portal: 169.254.2.2,3260] successful. [root@instance-20260324-0911 ~]# iscsiadm -m session tcp: [1] 169.254.2.2:3260,1 iqn.2015-12.com.oracleiaas:06448145-768e-4b6e-86fc-959b5d566b55 (non-flash) # ------------------- 步骤4:最后挂载存储卷 ------------------- # 1. 获取存储卷 UUID(新实例执行 blkid /dev/sdb) [root@instance-20260324-0911 ~]# blkid | grep -E 'sda|sdb|nvme|oracleoci|www' /dev/sdb: UUID="7dcd0595-c6bd-45e9-8f27-ca16e6cd729e" TYPE="ext4" /dev/sda2: UUID="e92cbce5-d8b8-456e-942e-25eb67631fce" TYPE="xfs" PARTUUID="38728efc-9583-4597-a954-10a4ac106302" /dev/sda3: UUID="qw1AOQ-EOH8-Mkbo-FiGp-WpEY-viwm-xmRzgr" TYPE="LVM2_member" PARTUUID="7adbca67-6935-4709-a1ea-72ff371cc224" /dev/sda1: SEC_TYPE="msdos" UUID="BBF7-A736" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="32e67351-51cd-40b2-bc40-edbe69760d78" # 2. 写入 /etc/fstab 永久挂载 echo "UUID=7dcd0595-c6bd-45e9-8f27-ca16e6cd729e /www ext4 defaults,_netdev,nofail 0 2" >> /etc/fstab # 3. 挂载生效 systemctl daemon-reload # 挂载附加卷 - 查看挂载设备号 lsblk # 挂载附加卷 - 挂载后的效果 df -lh
应用恢复
恢复docker应用
docker compose -f /www/trilium/docker-compose.yml up -d docker compose -f /www/ghost/docker-compose.yml up -d docker compose -f /www/nginx/docker-compose.yml up -d (crontab -l 2>/dev/null; echo '0 3 * * 0 cd /www/certbot && echo "$(date '\''+%Y-%m-%d %H:%M:%S'\'') - [Start]" && docker-compose up certbot && echo "$(date '\''+%Y-%m-%d %H:%M:%S'\'') - [Nginx Reloading]" && docker exec nginx nginx -s reload && echo "$(date '\''+%Y-%m-%d %H:%M:%S'\'') - [Done]" >> /home/ghost/cron_certbot.log 2>&1') | crontab -修复ghost_net
[ghost@instance-20260324-0911 ~]$ docker network ls NETWORK ID NAME DRIVER SCOPE 78ae321bcf47 bridge bridge local fea7d122caab ghost_net bridge local 5fab0c9de63c host host local 867e32ac9202 none null local [ghost@instance-20260324-0911 ~]$docker network inspect ghost_net- oracle预留公网IP切换给新实例
- 终止掉旧实例,预留IP资源会自动空闲
- 新实例网络-主要IP网卡>编辑>先选择没有公共IP确认后,再编辑进来选预留IP(单外网IP状态)
- ping 预留IP通
- OCI 实例的安全组(Security List)放行端口
- 因为复用的公网ip和虚拟网络,所以旧实例的端口也生效了
- renew证书 Certbot https SSL证书维护
- 验证 https://ghost.atibm.com 访问正常
- 客户端笔记
- windows客户端trilium,点击同步,测试同步握手成功,但是同步处理一会儿提示失败