最近要在Linux做基于frame Buffer的图形显示,不论我在独立分区的Linux FC6系统中,还是在装有Red hat9的VPC中,都无法打开/dev/fb0。从网上找了很多资料,都没能解决。经过几天的的郁闷之后,终于解决了这个问题。先记录如下:
1、首先确认对Frame Buffer的支持是否编译到Linux的内核中。在安装的Linux中,默认都会把这个支持打开编译到内核中。但是如果自己重新编译了内核,或者升级内核,得确认把Frame Buffer的支持编入内核,并且还要把Console display driver support编译到内核中,还要把Logo configuration编译到内核中。这些选项都在Device drivers下的graphics support选项下。
2、在启动项中打开对Frame Buffer的支持。由于虽然把对Frame Buffer的支持编译到内核中了,但是默认下是没有打开的。故要修改/boot/grub/menu.lst文件。在该文件的kernel那一行后面加上vga=0xXXX,0xXXX表示的是屏幕的分辨率和色彩数。
其中vga=0x后面的数值可以从下表中查出。
色彩数 | 640 X 480 | 800X600 | 1024X768 | 1280X1024 |
256 | 0x301 | 0x303 | 0x305 | 0x307 |
32k | 0x310 | 0x313 | 0x316 | 0x319 |
64k | 0x311 | 0x314 | 0x317 | 0x31A |
16M | 0x312 | 0x315 | 0x318 | 0x31B |
我原先的/boot/grub/menu.lst文件如下:
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to
this file
# NOTICE: You have a /boot
partition. This means that
#
all kernel and initrd paths are relative to /boot/, eg.
#
root (hd0,0)
#
kernel /vmlinuz-version ro root=/dev/hda3
#
initrd /initrd-version.img
#boot=/dev/hda
default=0
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
title Red Hat Linux (2.6.18)
root (hd0,0)
kernel /vmlinuz-2.6.18 ro
root=LABEL=/
initrd /initrd-2.6.18.img
title Red Hat Linux (2.4.20-8)
root (hd0,0)
kernel /vmlinuz-2.4.20-8 ro
root=LABEL=/
initrd /initrd-2.4.20-8.img
#
# Note that you do not have to rerun grub after making changes to
this file
# NOTICE: You have a /boot
partition. This means that
#
all kernel and initrd paths are relative to /boot/, eg.
#
root (hd0,0)
#
kernel /vmlinuz-version ro root=/dev/hda3
#
initrd /initrd-version.img
#boot=/dev/hda
default=0
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
title Red Hat Linux (2.6.18)
root (hd0,0)
kernel /vmlinuz-2.6.18 ro
root=LABEL=/
initrd /initrd-2.6.18.img
title Red Hat Linux (2.4.20-8)
root (hd0,0)
kernel /vmlinuz-2.4.20-8 ro
root=LABEL=/
initrd /initrd-2.4.20-8.img
因为我对red
hat9升级了一个2.6.18的内核,故有两个启动项。修改后,如下:
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to
this file
# NOTICE: You have a /boot
partition. This means that
#
all kernel and initrd paths are relative to /boot/, eg.
#
root (hd0,0)
#
kernel /vmlinuz-version ro root=/dev/hda3
#
initrd /initrd-version.img
#boot=/dev/hda
default=0
#
# Note that you do not have to rerun grub after making changes to
this file
# NOTICE: You have a /boot
partition. This means that
#
all kernel and initrd paths are relative to /boot/, eg.
#
root (hd0,0)
#
kernel /vmlinuz-version ro root=/dev/hda3
#
initrd /initrd-version.img
#boot=/dev/hda
default=0
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
title Red Hat Linux (2.6.18)
root (hd0,0)
kernel /vmlinuz-2.6.18 ro
root=LABEL=/ vga=0x311
initrd /initrd-2.6.18.img
title Red Hat Linux (2.4.20-8)
root (hd0,0)
kernel /vmlinuz-2.4.20-8
ro root=LABEL=/ vga=0x311
initrd /initrd-2.4.20-8.img
splashimage=(hd0,0)/grub/splash.xpm.gz
title Red Hat Linux (2.6.18)
root (hd0,0)
kernel /vmlinuz-2.6.18 ro
root=LABEL=/ vga=0x311
initrd /initrd-2.6.18.img
title Red Hat Linux (2.4.20-8)
root (hd0,0)
kernel /vmlinuz-2.4.20-8
ro root=LABEL=/ vga=0x311
initrd /initrd-2.4.20-8.img
3、重启系统。然后运行cat
/dev/fb0,如果发现有一堆乱码输出在屏幕上,则表示找到了/dev/fb0这个设备。如果没有,则可能是你的显卡不支持。
通过上述操作以后,我的虚拟机中的Linux和独立分区装的Linux都可以打开/dev/fb0了。最后还说一句,打开/dev/fb0是在控制台下打开,在XWindow界面下能打开,但是操作屏幕缓存区画图的时候,会不正确。
解决方法:
解决方法如下:
目前可得到的绝大多数linux版本所发行的内核中,已经预编译了FrameBuffer支持,通常不需要重新编译内核就可以使用,但要进行一些配置才能使用.
具体如下:
如果你是安装了grub,那就进入boot\grub里面, 在一个启动选项里面加入vga = xxx,这样就可以应用framebuffer了。
例如:
title Debian (2.4.20 Framebuffer + RUwireless)
kernel (hd0,0)/bzImage-2.4.20fbruwireless root=/dev/hda7 hdc=ide-scsi vga=791 console=tty1
设置vga的值要注意了,这个值是要与分辨率对应的,具体对应值看后面.当你配置成功之后,重启之后就可以看到屏幕出现了一个小企鹅.
------------------------------------------------------------------------
colour depth ¦ 640x480 800x600 1024x768 1280x1024
256 (8bit) ¦ 769 771 773 775
32000 (15bit) ¦ 784 787 790 793
65000 (16bit) ¦ 785 788 791 794
16.7 Mill. (24bit) ¦ 786 789 792 795
------------------------------------------------------------------------
目前可得到的绝大多数linux版本所发行的内核中,已经预编译了FrameBuffer支持,通常不需要重新编译内核就可以使用,但要进行一些配置才能使用.
具体如下:
如果你是安装了grub,那就进入boot\grub里面, 在一个启动选项里面加入vga = xxx,这样就可以应用framebuffer了。
例如:
title Debian (2.4.20 Framebuffer + RUwireless)
kernel (hd0,0)/bzImage-2.4.20fbruwireless root=/dev/hda7 hdc=ide-scsi vga=791 console=tty1
设置vga的值要注意了,这个值是要与分辨率对应的,具体对应值看后面.当你配置成功之后,重启之后就可以看到屏幕出现了一个小企鹅.
------------------------------------------------------------------------
colour depth ¦ 640x480 800x600 1024x768 1280x1024
256 (8bit) ¦ 769 771 773 775
32000 (15bit) ¦ 784 787 790 793
65000 (16bit) ¦ 785 788 791 794
16.7 Mill. (24bit) ¦ 786 789 792 795
------------------------------------------------------------------------
注意:当你设置得系统不支持的分辨率或色深时,会造成不能显示图形界面的,那怎么办呢?所以要配置时,最好就新建一个启动选项title,这样在设置失败之后,重启都可以利用以前的配置进入系统,重新配置.
以上是别人的解决方案,下面是我的:
我用的是debian,参照上面的方法,我修改了 /boot/grub/grub.cfg文件,修改如下内容:
然后重新启动系统即可在/dev下看到fb0这个设备结点。