Blog

  • 运维随记:备份不是复制完成就结束

    最近重新检查备份目录,发现“文件每天都在生成”很容易带来一种虚假的安心。备份真正有价值的条件,是能在需要时找到、读取并恢复。

    我把检查分成四件事:来源是否完整、文件是否可读、保留周期是否合理、恢复步骤是否实际跑过。数据库最好使用应用支持的导出或一致性快照;只复制正在写入的数据目录,可能得到结构完整但事务不一致的副本。

    sha256sum backup-file
    tar -tf archive.tar | head
    gzip -t database.sql.gz

    校验和能发现传输或存储损坏,但不能证明内容正确。因此还需要定期把备份恢复到隔离目录或测试实例,确认权限、字符集、依赖版本和启动步骤。

    备份也不应一直在线挂载在原机器上。误操作、入侵或磁盘故障可能同时影响源数据和本地备份。至少保留一份不同介质或不同权限域的副本,并限制备份账户只能写入必要位置。

    今天补上的不是更多复制命令,而是一份简短恢复记录:备份在哪里、需要哪些密钥、恢复顺序是什么、最后一次成功演练是什么时候。能回答这些问题,备份才算真正完成。

  • 运维随记:一次证书续期检查

    今天整理小站时顺手检查了证书续期。浏览器显示“安全”并不代表续期链路一定正常;真正容易出问题的是几个月前配置过、后来又改动的验证路径和服务重载。

    先看证书本身的有效期:

    openssl x509 -in fullchain.pem -noout -subject -issuer -dates

    然后确认自动任务确实存在,而不是只记得“以前启用过”:

    systemctl status certbot.timer
    systemctl list-timers certbot.timer

    这次最有价值的步骤仍然是模拟续期:

    certbot renew --dry-run

    模拟成功后,还要关注部署钩子。如果前端服务读取的是证书副本或合并后的 PEM,仅更新 Let’s Encrypt 目录并不会让正在运行的进程自动加载新证书。部署钩子应先生成目标文件、验证配置,再 reload 服务。

    最后从外部访问一次 HTTPS,核对域名、证书链和页面响应。证书管理看起来是低频工作,但越是低频,越应该把步骤写成清单和自动化检查,避免到期当天才重新回忆整条链路。

  • Ubuntu 上配置 Samba 文件共享

    Samba 适合在 Linux 与 Windows 之间共享文件。一个可维护的共享应先明确目录所有者、Linux 权限和允许访问的网络范围,再写 smb.conf。

    安装并准备目录

    apt update
    apt install samba
    install -d -m 2770 -o root -g sambashare /srv/share
    usermod -aG sambashare alice
    smbpasswd -a alice

    目录上的 SGID 位会让新文件继承组,便于多人协作。Samba 密码与 Linux 登录密码是两套凭据,不要因为方便而设置成相同的弱口令。

    一个简单的共享段

    [files]
        path = /srv/share
        browseable = yes
        read only = no
        guest ok = no
        valid users = @sambashare
        force group = sambashare
        create mask = 0660
        directory mask = 2770

    保存后先运行 testparm 检查配置,再执行 systemctl reload smbd。如果启用了 UFW,只应对可信局域网开放 Samba,而不是直接暴露到公网:

    ufw allow from 192.168.1.0/24 to any app Samba

    常见故障顺序

    Windows 无法写入时,同时检查 Samba 用户、valid users、Linux 目录权限和父目录的执行权限。能通过 IP 访问但不能通过名称访问,通常是名称解析问题,不应先改文件权限。

    共享数据仍需独立备份。Samba 提供访问通道,不会自动防止误删除、勒索软件或磁盘损坏。

  • OpenSSH 密钥登录与最小化配置

    SSH 暴露在公网时,最重要的不是换一个看起来不常见的端口,而是使用可靠的密钥认证、限制可登录账户,并在每次修改后保留可恢复路径。

    客户端生成和使用密钥

    ssh-keygen -t ed25519 -a 100
    ssh-copy-id user@server
    ssh -i ~/.ssh/id_ed25519 user@server

    私钥只应保存在可信设备上,并设置合适的文件权限。服务器的 authorized_keys 目录通常为 700,文件通常为 600。

    服务端基线

    PasswordAuthentication no
    KbdInteractiveAuthentication no
    PermitRootLogin prohibit-password
    PubkeyAuthentication yes

    是否允许 root 使用密钥应根据运维方式决定。更严格的方案是使用普通管理员账户配合 sudo。无论选择哪种方式,都应先在新的终端确认密钥可以登录,再关闭现有会话。

    修改后的验证

    sshd -t
    sshd -T | grep -E 'passwordauthentication|permitrootlogin'
    systemctl reload ssh

    sshd -t 只检查语法,sshd -T 可以查看最终生效值。Ubuntu 的配置可能来自 sshd_config.d,而 OpenSSH 对部分指令采用“首次取得的值”,因此只查看主文件可能得出错误结论。

    最后再检查防火墙、失败登录日志和主机密钥指纹。密钥认证降低了口令攻击风险,但私钥泄露仍然是严重事件,备份和撤销机制同样重要。

  • 管道、重定向和文本过滤速查

    Shell 的效率很大一部分来自把简单工具串在一起。理解标准输入、标准输出和标准错误后,很多临时分析都不需要写脚本。

    三种常见重定向

    command > output.txt
    command >> output.txt
    command 2> error.txt
    command > all.txt 2>&1

    > 会覆盖文件,>> 会追加。修改重要文件前,不应把未经检查的命令输出直接重定向过去;先输出到临时文件并校验更可靠。

    管道中的过滤

    journalctl -u ssh --since today | grep -i 'failed'
    ss -lntp | awk 'NR==1 || /:22 /'
    du -xhd1 /var | sort -h
    cut -d: -f1 /etc/passwd | sort

    grep 负责筛选行,cut 适合规则分隔符,awk 更适合按列和条件处理。数据结构复杂时,JSON 应优先交给 jq,而不是用正则硬拆。

    tee:既观察又保存

    command | tee result.txt
    command | tee -a result.txt

    tee 会同时把内容显示在终端并写入文件,适合保留诊断过程。需要管理员权限写系统文件时,应明确最终目标,先做语法检查,再用原子替换,避免一条错误管道直接破坏配置。

    管道很强,但也会隐藏中间步骤的失败。用于自动化时可以启用 set -o pipefail,让管道中任意命令失败都能被检测到。

  • 每天都会用到的一组 Linux 基础命令

    Linux 命令很多,但日常维护真正高频的只有一小组。与其背诵大量选项,不如先熟悉查看状态、定位文件和观察日志的组合方式。

    文件与目录

    pwd
    ls -lah
    cp -a source destination
    mv old-name new-name
    mkdir -p /path/to/dir
    stat filename

    cp -a 会尽量保留权限、时间和链接关系,做配置备份时比普通复制更稳妥。涉及删除前,我习惯先用 statreadlink -f 再确认一次目标。

    查找内容

    find /etc -type f -name '*.conf'
    grep -RIn 'keyword' /etc
    sed -n '20,60p' file
    tail -f /var/log/syslog

    查日志时先限制目录、时间和关键词,可以少读很多无关信息。现代系统还应熟悉 journalctl -u 服务名 --since today

    进程与网络

    ps aux --sort=-%mem | head
    systemctl status nginx
    ss -lntup
    ip -brief address
    ip route

    ss 用于确认谁在监听端口,ip route 则回答流量会从哪里出去。网络故障时只反复 ping 往往信息不足,最好同时检查地址、路由、DNS 和监听状态。

    磁盘与资源

    df -hT
    du -sh /var/*
    free -h
    uptime

    这些命令的价值在于组合。先用概览命令发现异常,再用更具体的过滤条件定位原因,通常比直接修改配置更快也更安全。