请输入图片描述

适用于: J1900 / 工控机 / OEM 嵌入式小主机做 Linux 服务器(如 Debian / Ubuntu)时的经典痛点 —— 拔掉显示器后无头启动(Headless)失败,出现无法开机、自检卡死或无限重启的问题。

一、核心原因分析

该现象通常发生在系统启动的两个不同阶段:

  1. BIOS / UEFI 硬件自检(POST)限制
    许多较老或特定定制的 BIOS 固件在开机加电自检阶段,会硬性检测显示输出接口(HDMI / VGA)。若未检测到有效的 EDID(显示器识别)信号或设备,主板会认为显卡自检不通过,从而触发保护机制导致程序挂起或循环重启。
  2. Linux 内核与显卡驱动冲突
    进入操作系统加载阶段后,Intel 显卡驱动(如 i915)在无显示器环境下若拿不到正确的显示参数,极易导致驱动初始化失败、系统挂起,并伴随 ACPI 或 Watchdog 超时报错。

二、解决与优化方案

1. 修改 GRUB 引导参数(软件优化,推荐首试)

通过调整系统的 GRUB 引导参数,禁用显卡驱动的动态模式设置(KMS)并规范控制台输出,即可在不插 HDMI 视频线的情况下正常开机:

  1. 编辑 GRUB 配置文件:

    sudo nano /etc/default/grub
  2. 修改/合并内核默认引导参数:

    GRUB_CMDLINE_LINUX_DEFAULT="quiet reboot=bios nomodeset text"
  3. 确保清空备用参数行:

    GRUB_CMDLINE_LINUX=""
  4. 强制开启文本模式终端(不依赖图形终端):

    GRUB_TERMINAL=console
  5. 保存并更新 GRUB 配置使之生效:

    sudo update-grub

核心参数作用解析:

  • reboot=bios:解决部分老主板关机或重启时触发 Watchdog 导致卡死的问题。
  • nomodeset text:强制内核采用基础文本模式,避免因无显示器导致显卡驱动初始化崩溃。
  • GRUB_TERMINAL=console:确保引导与系统输出不依赖图形终端。

2. 硬件兜底方案:HDMI 虚拟显示器插头(Dummy Plug)

若主板 BIOS 固件存在无法通过软件绕过的硬件级 POST 检测,可使用物理兜底方案:

购买一个几块钱的 HDMI 虚拟显示器(欺骗器/插头) 插在主板 HDMI 口上。它会持续向主板发送伪造的 EDID 信号,欺骗 BIOS 完成正常开机自检。


三、SSH 远程管理注意事项

小主机实现无头启动后,通过 SSH 远程管理时,若执行关机或重启命令提示 command not found,请注意命令规范:

错误做法 / 现象正确操作命令原因说明
直接输入 reboot 或 poweroff
提示 command not found
sudo reboot
或
sudo poweroff
普通用户通过 SSH 登录时,默认环境变量 PATH 不包含系统管理路径 /sbin 或 /usr/sbin,需通过 sudo 提权调用。

总结: 先试 GRUB 参数调优(reboot=bios nomodeset text + GRUB_TERMINAL=console),绝大多数老平台即可顺利实现无头启动;若仍被主板 BIOS 拦截,使用 HDMI Dummy Plug 插头兜底即可。

请输入图片描述

AWS Lightsail Root 登录教程 · 实测修订整理

2026-10-23 在一台 Lightsail Debian 镜像(默认用户 admin)上按原文实测的结果。核心结论:三道防线的原理没问题,但第一步的 sed 在这台机器上静默失败,需要换一种不依赖正则的写法;另外建议补一个 chattr 固化步骤和一张按症状排查的表。

1. 实测发现的问题

按原文脚本跑完后,用密钥登录 root 仍然被拦截:闪一句 "Please login as the user ..."、停顿约 10 秒、然后断开。

检查 /root/.ssh/authorized_keys,拦截前缀原样还在:

no-port-forwarding,no-agent-forwarding,no-X11-forwarding,command="echo 'Please login as the user \"admin\" rather than the user \"root\".';echo;sleep 10;exit 142" ssh-rsa AAAA...

2. 根因:前缀格式和文中 sed 对不上

原文两条 sed 写死了结尾格式 ;exit 1",而这台机器的前缀是 ';echo;sleep 10;exit 142"(中间多一段 echo;sleep 10;,退出码是 142 不是 1)。正则匹配不上时 sed 不会报错,命令看似跑完了、实际什么都没删——这是全文最容易踩的坑:不同时期/不同发行版的镜像,前缀格式不一样(至少有 exit 1 和 exit 142 两个变体),凡是按固定格式写的清理正则都有静默失败的可能。

3. 修正:第一步改成「覆盖法」,不跟正则较劲

默认用户(admin/ubuntu)的 authorized_keys 里就是同一把干净的公钥、没有拦截前缀,直接覆盖 root 的:

# 默认用户是 admin 就用 admin,是 ubuntu 就换成 ubuntu
cat /home/admin/.ssh/authorized_keys > /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys

验证(输出应直接以 ssh-rsa / ssh-ed25519 开头,不带任何前缀):

head -c 60 /root/.ssh/authorized_keys

authorized_keys 是登录时现读的,改完不用重启 sshd,直接开新窗口测试。

4. cloud-init 部分:原文 sed 有效,但建议加一步验证

本次实测 /etc/cloud/cloud.cfg 里的 disable_root 确实被改成了 false,原文这步没问题。但吸取第一步的教训,改完建议验证一次,而不是默认 sed 一定成功:

grep -Rn 'disable_root' /etc/cloud/cloud.cfg /etc/cloud/cloud.cfg.d/ 2>/dev/null

所有出现的地方都应为 disable_root: false(注意 cloud.cfg.d/ 分片文件里如果有,也要一并处理)。

5. 新增固化:chattr +i(建议补进原文)

就算哪天 cloud-init 又跑起来想恢复拦截,文件层面直接锁死:

chattr +i /root/.ssh/authorized_keys
lsattr /root/.ssh/authorized_keys   # 输出带 i 即生效

副作用要写明:加了 i 之后自己也改不了这个文件,日后要换密钥先 chattr -i /root/.ssh/authorized_keys 解开,改完再锁回去。

最后 reboot 一次,再用密钥登 root,能正常进即固化成功。

6. 建议补进原文的排查表(按症状定位)

症状原因处理
密钥登 root,闪 "Please login..." 后断开(可能还卡 10 秒)authorized_keys 拦截前缀没清掉(sed 静默失败)用第 3 节覆盖法重做,head -c 60 验证
密码登 root,一直 Permission denied密码占位符没替换(原文里「你的新密码」原样跑了,密码就真是这五个字);或 root 账户还锁着passwd root 重新设;grep ^root /etc/shadow 看是否以 !/* 开头,passwd -S root 状态应为 P
不确定配置到底生效没有看文件不准,sshd 有自己的生效优先级`sshd -T \grep -iE 'permitrootlogin\passwordauthentication' 看实际生效值;再 ls /etc/ssh/sshd_config.d/` 确认没有又生成的 .conf
在 Lightsail 网页控制台里怎么都登不上 root网页版 SSH 只能以默认用户登录,没有 root 入口用本地 SSH 客户端测 root

7. 其余部分

原文的第二步原理解析、第三步安全验证(先保留旧窗口、再开新窗口测、最后 reboot 复测)都成立,不用改。密码步骤的占位符提醒原文已有 ⚠️,保留即可。

本教程适用于将 Microsoft 365 E5 开发者订阅(MSDN)的 5TB OneDrive 空间挂载为 Linux 本地磁盘。当然也适用其他版本的空间挂载,但是需要自己根据实际情况做出修改。

请输入图片描述

一、 基础准备在开始之前,请确保你拥有 MSDN 管理员账号,并在 Linux 服务器上安装 fuse3(挂载必需依赖)。

# 1. 安装 Rclone
curl https://rclone.org/install.sh | sudo bash
# 2. 安装 FUSE 依赖
# Ubuntu / Debian:
apt update && apt install -y fuse3
# CentOS / AlmaLinux:
yum install -y fuse3
# 3. 修正 FUSE 权限配置(允许非 root 用户访问)
sed -i 's/#user_allow_other/user_allow_other/g' /etc/fuse.conf

二、 Rclone 配置步骤

执行 rclone config,
按照以下逻辑操作:n) New remote: 输入名称 onedrive
Storage Type: 输入 42 (Microsoft OneDrive)
client_id/client_secret: 直接回车跳过
region: 输入 1 (global)
Edit advanced config: 输入 n
Use auto config: 输入 n (因为是远程服务器)获取
Token:在你的本地电脑

  • (Windows/Mac)下载 Rclone。
  • 在本地终端运行:rclone authorize "onedrive"。
  • 浏览器弹出授权,登录 MSDN 账号并确认。
  • 将本地终端生成的 {"access_token":...} 整个 JSON 字符串复制。回到服务器粘贴。

config_type: 输入 1 (OneDrive Personal or Business)
Drive Selection: 搜索到 5TB 盘后,输入序号 0。
Confirm: 输入 y 确认,最后输入 q 退出。

三、 手动挂载测试创建挂载点并尝试手动挂载,确认没有报错:

# 创建挂载点
mkdir -p /mnt/onedrive

# 手动挂载命令(测试用)
rclone mount onedrive:/ /mnt/onedrive \
  --vfs-cache-mode writes \
  --vfs-cache-max-size 50G \
  --allow-other \
  --header "Referer:https://onedrive.live.com/" \
  --vfs-read-chunk-size 16M \
  --vfs-read-chunk-size-limit 1G \
  --buffer-size 64M \
  --daemon

使用 df -h 查看是否出现了 5TB 的磁盘。

四、 配置开机自动挂载 (Systemd)为了保证服务器重启后自动挂载,建议配置系统服务。

1. 创建服务文件

nano /etc/systemd/system/rclone.service

2. 粘贴以下内容(请确保 /usr/bin/rclone 路径正确,可用 which rclone 查看)

[Unit]
Description=Rclone OneDrive Mount
After=network-online.target

[Service]
Type=simple
# 核心挂载命令
ExecStart=/usr/bin/rclone mount onedrive:/ /mnt/onedrive \
    --vfs-cache-mode writes \
    --vfs-cache-max-size 50G \
    --vfs-cache-max-age 24h \
    --allow-other \
    --header "Referer:https://onedrive.live.com/" \
    --vfs-read-chunk-size 16M \
    --vfs-read-chunk-size-limit 1G \
    --buffer-size 64M \
    --dir-cache-time 5m \
    --low-level-retries 10
# 停止时卸载
ExecStop=/bin/fusermount3 -qzu /mnt/onedrive
Restart=on-failure
RestartSec=10
User=root

[Install]
WantedBy=multi-user.target

3. 启用服务

//先卸载之前手动挂载的路径
fusermount3 -qzu /mnt/onedrive
//启用并启动服务
systemctl daemon-reload
systemctl enable rclone
systemctl start rclone
//检查状态
systemctl status rclone

五、 常用维护指令汇总

目的                        命令

验证 5TB 容量 rclone about onedrive:
查看实时挂载日志 journalctl -u rclone -f
重启挂载服务 systemctl restart rclone
强制卸载挂载点 fusermount3 -qzu /mnt/onedrive
清空 OneDrive 回收站 建议去网页端操作,可释放 Trashed 占用的配额