要将屏幕分辨率设置为 800×600 24位色,可以通过以下脚本实现。这个版本针对 Docker 环境做了优化,同时避免依赖 cvt
工具:
最终解决方案脚本 (800×600@24bit)
#!/bin/bash
# 配置参数
WIDTH=800
HEIGHT=600
BPP=24 # 24位色深
REFRESH=60
# 硬编码的Modeline参数(通过cvt生成)
MODE_NAME="${WIDTH}x${HEIGHT}_${REFRESH}"
MODE_PARAMS="38.25 $WIDTH 832 912 1024 $HEIGHT 603 607 624 -hsync +vsync"
# 获取当前显示接口
OUTPUT=$(xrandr | grep -m 1 " connected" | awk '{print $1}')
[ -z "$OUTPUT" ] && OUTPUT="VIRTUAL1"
# 清理旧模式
xrandr --rmmode "$MODE_NAME" 2>/dev/null
# 创建新模式
if ! xrandr --newmode "$MODE_NAME" $MODE_PARAMS; then
echo "[错误] 模式创建失败!请检查参数:"
echo "xrandr --newmode \"$MODE_NAME\" $MODE_PARAMS"
exit 1
fi
# 添加并应用模式
xrandr --addmode "$OUTPUT" "$MODE_NAME"
if xrandr --output "$OUTPUT" --mode "$MODE_NAME"; then
echo "[成功] 分辨率已设置为 ${WIDTH}x${HEIGHT} ${BPP}位色"
else
echo "[警告] 直接设置失败,尝试强制帧缓冲大小..."
xrandr --output "$OUTPUT" --set "scaling mode" "Full" --panning ${WIDTH}x${HEIGHT} --fb ${WIDTH}x${HEIGHT}
fi
关键说明
- 参数来源
Modeline 参数是通过以下命令生成的(如果在宿主机有cvt
工具):
cvt 800 600 60
输出:
# 800x600 59.86 Hz (CVT 0.48M3) hsync: 37.35 kHz; pclk: 38.25 MHz
Modeline "800x600_60.00" 38.25 800 832 912 1024 600 603 607 624 -hsync +vsync
- Docker 特殊处理
- 自动回退到虚拟显示接口(
VIRTUAL1
) - 提供备用强制设置方案(
--fb
参数)
- 24位色深实现
X11 默认使用 24位色深,无需特殊设置。如需验证:
xdpyinfo | grep -P 'depth|planes'
使用方式
物理机直接运行:
chmod +x set_resolution.sh
./set_resolution.sh
Docker 容器内运行:
# 必须挂载X11套接字和显示设备
docker run -it \
--privileged \
-e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix \
--device /dev/dri \
your_image /script/set_resolution.sh
错误处理指南
错误现象 | 解决方案 |
---|---|
BadName 错误 | 检查Modeline参数格式是否正确 |
Can't open display | 确保正确挂载了/tmp/.X11-unix |
分辨率不生效 | 尝试--fb 强制模式或改用虚拟显示器 |
效果验证
# 检查当前分辨率
xrandr | grep '*'
# 检查色深
xdpyinfo | grep 'depth'
如果遇到问题,可以尝试更兼容的标准分辨率(如1024x768
)或降低刷新率(如50Hz
)。