oracle-linux9-维护手册

起因

  • 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)放行端口
  • 客户端笔记
    • windows客户端trilium,点击同步,测试同步握手成功,但是同步处理一会儿提示失败