这几天拿到一款预装ubuntu12.04系统的PC单板,遇到的问题是切换到console(Ctrl+Alt+F1)时没有显示,一片黑。
现象:
1 linux启动过程中没有任何信息输出,也是“黑屏”,修改/boot/grub/grub.cfg文件,去掉启动参数quiet,依然如此。
2 仔细观察切换后,发现屏幕虽然也是黑的,但还是能感觉屏幕亮度有少许变化,并不是全黑,并且显示器灯一直正常亮,说明是有显示信号输出的。为了证实该想法,切换后,虽然黑屏,但盲打输入用户名密码,并且在当前目录创建一个新目录mkdir xxx,再切换回图形界面(Ctrl+Alt+F7),查看主目录下果然存在一个xxx的目录,说明我们遇到的只是一个显示问题。
因为linux图形化系统启动后,其中的terminal工作正常,那么结合现象1,说明是启动时配置的显示参数有问题,尝试修改显示参数,经过验证如下设置是OK的:
1 首先确认系统可以设置的启动参数:
#hwinfo --framebuffer
02: None 00.0: 11001 VESA Framebuffer
[Created at bios.464]
Unique ID: rdCR.QstqgPARaQB
Hardware Class: framebuffer
Model: ""
Vendor: ""
Device: ""
SubVendor: "!"
SubDevice:
Revision: ""
Memory Size: 7 MB + 704 kB
Memory Range: 0x3f800000-0x3ffaffff (rw) 800*600*16
Mode 0x0301: 640x480 (+640), 8 bits
Mode 0x0303: 800x600 (+832), 8 bits
Mode 0x0305: 1024x768 (+1024), 8 bits
Mode 0x0307: 1280x1024 (+1280), 8 bits
Mode 0x0311: 640x480 (+1280), 16 bits
Mode 0x0314: 800x600 (+1600), 16 bits
Mode 0x0317: 1024x768 (+2048), 16 bits
Mode 0x031a: 1280x1024 (+2560), 16 bits
Mode 0x0312: 640x480 (+2560), 24 bits
Mode 0x0315: 800x600 (+3200), 24 bits
Mode 0x0318: 1024x768 (+4096), 24 bits
Mode 0x031b: 1280x1024 (+5120), 24 bits
Mode 0x0320: 1400x1050 (+1408), 8 bits
Mode 0x0321: 1400x1050 (+2816), 16 bits
Mode 0x0323: 1400x1050 (+5632), 24 bits
Mode 0x0324: 1600x1200 (+1600), 8 bits
Mode 0x0325: 1600x1200 (+3200), 16 bits
Mode 0x0327: 1600x1200 (+6400), 24 bits
Config Status: cfg=new, avail=yes, need=no, active=unknown
说明BIOS是支持VESA的,并且我的显卡支持800*600*16的分辨率。
2 因为console需要vesa的支持,因此查看/etc/modprobe.d/blacklist-framebuffer.conf ,将vesafb从黑名单中去掉:
#blacklist vesafb
3 接下来就需要修改grub引导参数了:
涉及到grub的文件有以下几个,
/etc/default/grub 1
/etc/grub.d/10_linux 2
/etc/grub.d/30_os-prober 3
/boot/grub/grub.cfg 4
当执行update-grub2时,会根据1,2,3来生成grub的配置文件4(grub.cfg)。
在ubuntu系统中update-grub 和update-grub2是相同的,最终运行的命令都是:
mkconfig -o /boot/grub/grub.cfg
如果不通过上面几个配置文件修改grub的话,我们可以直接修改grub.cfg也是一样的。
vi /boot/grub/grub.cfg
1 找到启动linux的相应entry段:
menuentry "Ubuntu, Linux 3.2. ...... "
2 去掉其后面的 gfxmode $linux_fgx_mode *
3 linux /boot/vmlinuz-3.2.0.29-generic ...... ro $vt_handoff 修改为
linux /boot/vmlinuz-3.2.0.29-generic ...... ro vga=0x317 $vt_handoff (注意这个VGA参数需要 vesafb的支持,因此上一步确认vesa)
4 在该entry段之前增加模块gfxterm
insmod gfxterm
set gfxpayload=800*600 (这里我尝试设置1024*768但不起作用) *
保存配置并重启就可以看到console启动界面了,并且Ctrl+Alt+F1切换后也有console界面哦。
显示参数vga配置表如下,可以根据自己的显示器来进行设置:
vesa配置参数如下所示,我们这里实际需要设置的值需要 + 0x200 ,即0x117 + 0x200 = 0x317.
| 640x480 800x600 1024x768 1280x1024
44 ----+-------------------------------------
45 256 | 0x101 0x103 0x105 0x107
46 32k | 0x110 0x113 0x116 0x119
47 64k | 0x111 0x114 0x117 0x11A
48 16M | 0x112 0x115 0x118 0x11B
linux_kernel_mode_number = VESA_mode_number + 0x200
| 640x480 800x600 1024x768 1280x1024
58 ----+-------------------------------------
59 256 | 0x301 0x303 0x305 0x307
60 32k | 0x310 0x313 0x316 0x319
61 64k | 0x311 0x314 0x317 0x31A
62 16M | 0x312 0x315 0x318 0x31B
/*****************************************************************************************/
遇到的另一个问题是这个系统启动过程中不显示grub界面,启动过程中不能人为手动选择启动项,其原因是我这个系统的默认等待时间是0,因此只需要修改默认等待时间就可以了:
sudo vim /boot/grub/grub.cfg
在set default="0"后面增加一行
set timeout=5
并在搜索后面所有设置timeout=0的地方都该成"timeout=5"后,保存重启就OK了。
/*****************************************************************************************/
现在系统可以切换到console了,但我们实际应用的情况是不需要图形界面,只需要文本界面,难道还需要将图形界面删除掉么?因为我们的应用对硬盘空间不敏感,只对运行的性能不敏感,因此,只需要启动就运行在文本界面,不进入图形界面,然后再将一系列不需要的service停掉就OK了,在需要的时候只需要运行命令startx就可以顺利进入图形界面了。
文本模式启动的设置很简单,修改 /boot/grub/grub.cfg :
linux /boot/vmlinuz-3.2.0.29-generic ...... ro quiet splash vga=0x317 $vt_handoff 修改为
linux /boot/vmlinuz-3.2.0.29-generic ...... ro vga=0x317 text $vt_handoff
其中参数 quiet 表示启动过程中不输出启动系统。
splash 表示是否有启动画面。
这两项我们都不需要,直接去掉,另外增加text 表示文本启动。
/*****************************************************************************************/
一切都设置OK了,可以去喝茶了,呵呵,查看一下当前目录, My God,中文显示都是方块,诶多灾多难啊,这个板子原始装的是中文版,气死我了,为什么不装英文版呢?google之后发现可以用fbterm解决:
sudo apt-get install fbterm
系统启动后运行 sudo fbterm -s 16,ok可以看到中文了,至此系统总算初步能用了。喝茶了!
参考资料:
fbcon: http://www.mjmwired.net/kernel/Documentation/fb/fbcon.txt
vesafb: http://www.mjmwired.net/kernel/Documentation/fb/vesafb.txt
console显示中文
/************************************************************************/
另外一种方法是:
在一次尝试编译内核时,在ubuntu的论坛上发现有关这个问题的解决方法,没有具体尝试,不知道是否可行:
Install the new kernelIf you want to see the ubuntu splash screen (or use text mode) before you get to X instead of just a black screen, you'll want to make sure the framebuffer driver loads:
echo vesafb | sudo tee -a /etc/initramfs-tools/modules echo fbcon | sudo tee -a /etc/initramfs-tools/modules
Now that you've told initramfs-tools what modules it should include and the build is complete.
上面实际上只是在 /etc/initramfs-tools/modules文件的末尾增加了两行:
vesafb
fbcon
最后需要更新initramfs,将vesafb,fbcon加入新的initramfs: sudo update-initramfs -u