1、grub2 修改启动控制台分辨率
先说第一步吧,grub2里面用于控制分辨率的主要有2个参数,改配置文件什么的估计网上也有一大把文章了。这里说一下命令行直接改,直接就生效。
首先是gfxmode 这个变量的值,具体可以参考grub官方文档
http://www.gnu.org/software/grub/manual/grub/grub.html#gfxmode
这个变量在启动的时候可以设置为:auto,长x宽,以及长x宽x颜色深度,例如:auto,800x600,800x600x8 ,至于这个分辨率和颜色深度怎么来的,可以在grub下用命令vbeinfo查出来。 至于VBE这个可以参考Video bios 扩展这篇文章。这一步其实要在命令行执行,只需要在grub菜单执行setgfxmode=1024x768x8当然这个分辨率需要用vbeinfo先查询一下。
其次,要让gfxmode这个值起作用,那就得设置grub终端的输出类型了,要知道grub终端输出支持哪些类型,可以直接在grub命令提示符下执行 terminal_output,会列出支持的类型(官网手册甚至说支持Morse码!),要支持gfxmode里面设置的高分辨率,这个输出类型必须设置为 gfx_term,这一步在grub的命令下输入terminal_output --append gfxterm执行完这个命令分辨率应该就会有变化了。
这时候只需要设置set gfxpayload=keep,然后再用linux initrd两条命令加载内核和Initrdimg,最后输入boot,就可以以高分辨率启动了。或者你想用其他分辨率 ‘set gfxpayload=1024x768’ 之类。
2、内核的console分辨率
先来记录几个有用的小命令吧,当我们系统启动后,可以按Ctrl + Alt +F1(23456)之类的一系列热键来切换到不同的虚拟控制台,其实大多数管理员和维护人员绝大多数时候都是在命令行下工作,除了网络就是这个系统显示器的几个虚拟终端了。
关于psf 格式,参考PSF说明,有一些转换工具当然更直接的就是bdf2psf,从X下的等宽字体创建psf,zhcon的作者还写了一个工具用于编辑psf字体。
Mar 13 19:25:13 vm-linux kernel: Console: colour dummy device 80x25
Mar 13 19:25:13 vm-linux kernel: console [tty0] enabled
这个才80x25个字符,效果可想而知。
同时可以查询系统里面到底启用的是什么虚拟控制台,下面的输出中,S 代表的是系统console。
[root@localhost vtcon0]# pwd
/sys/class/vtconsole/vtcon0
[root@localhost vtcon0]# ls
bind name power subsystem uevent
[root@localhost vtcon0]# cat name
(S) VGA+
[root@localhost vtcon0]#
如果没有加载显卡的fb驱动,那么可以通过传入vga=791这样的参数给内核,来明确的启用通用的vesafb驱动,可以看到启动过程中,分辨率明显提高了。查看/sys/class/vtconsole/目录能看到多了一个vtcon1,cd进去后可以通过写入echo 0 > bind 来卸载fbcon,要确认是基于那些fb驱动,cat name,能显示名称,M代表模块化的,可卸载。
[root@localhost vtcon1]# cat name
(M) frame buffer device
卸载后用dmesg或者看messages,能看到系统console又回到了VGA+ 80X25
#用modprobe vga16fb手工加载的驱动,这个驱动看起来分辨率也很低,但是他的确支持fbcon
vga16fb: initializing
vga16fb: mapped to 0xffff8800000a0000
Console: switching to colour frame buffer device 80x30
fb0: VGA16 VGA frame buffer device
###echo 0 > bind 以后,
Console: switching to colour VGA+ 80x25
虽然vga16这个驱动分辨率低,但是架不住他是高级货了,可以体验一把fbcon的高级特性
[root@localhost fbcon]# echo 1 >rotate
[root@localhost fbcon]# pwd
/sys/class/graphics/fbcon
可以旋转一下,可以看到显示器上的确是旋转了,不过要实用,还是要vesafb(就是通过kernel参数vga=791或者ask这样的,至于vga后面的数字网上一堆,大家自行百度吧)tldp上也有更详细的说明
其实vga=ask这个一加,可以扫描出显卡支持的模式,设置成1920x1080之类的不要太爽啊。
其实加载这个fbcon还有一个作用就是可以显示图像了,虽然没有加载X11,开机的那个小企鹅以及开机的splash动画,都得靠这个。
更好的方式是启用内核的kms modesetting功能,由内核统一来驱动和管理显卡,而不是内核和X分开单独驱动
这个貌似在kernel3.x开始就默认是内核DRM部分来搞定显卡的一切底层了,所以配合grub2的gfxmode可以设置分辨率,但实际上,drm也会初始化一个fb驱动来搞定fbconsole的事情,和之前的fbconsole一样,唯一不同的是在启动的时候能拿到gfxmode的分辨率
[ 1.967430] ehci-pci 0000:02:03.0: irq 17, io mem 0xfd5ef000
[ 1.972087] [drm] Initialized drm 1.1.0 20060810
[ 1.973505] ehci-pci 0000:02:03.0: USB 2.0 started, EHCI 1.00
[ 1.974547] hub 1-0:1.0: USB hub found
[ 1.974897] hub 1-0:1.0: 6 ports detected
[ 1.978983] uhci_hcd: USB Universal Host Controller Interface driver
[ 1.979597] uhci_hcd 0000:02:00.0: UHCI Host Controller
[ 1.979669] uhci_hcd 0000:02:00.0: new USB bus registered, assigned bus number 2
[ 1.979797] uhci_hcd 0000:02:00.0: detected 2 ports
[ 1.980599] uhci_hcd 0000:02:00.0: irq 18, io base 0x00002080
[ 1.981189] hub 2-0:1.0: USB hub found
[ 1.981199] hub 2-0:1.0: 2 ports detected
[ 1.984496] ioc0: LSI53C1030 B0: Capabilities={Initiator}
[ 2.036178] scsi host2: ioc0: LSI53C1030 B0, FwRev=01032920h, Ports=1, MaxQ=128, IRQ=17
[ 2.064937] scsi 2:0:0:0: Direct-Access VMware, VMware Virtual S 1.0 PQ: 0 ANSI: 2
[ 2.064950] scsi target2:0:0: Beginning Domain Validation
[ 2.065180] [drm] DMA map mode: Using physical TTM page addresses.
[ 2.065367] [drm] Capabilities:
[ 2.065369] [drm] Rect copy.
[ 2.065370] [drm] Cursor.
[ 2.065371] [drm] Cursor bypass.
[ 2.065371] [drm] Cursor bypass 2.
[ 2.065372] [drm] 8bit emulation.
[ 2.065373] [drm] Alpha cursor.
[ 2.065374] [drm] Extended Fifo.
[ 2.065374] [drm] Multimon.
[ 2.065375] [drm] Pitchlock.
[ 2.065376] [drm] Irq mask.
[ 2.065376] [drm] Display Topology.
[ 2.065377] [drm] GMR.
[ 2.065378] [drm] Traces.
[ 2.065378] [drm] GMR2.
[ 2.065379] [drm] Screen Object 2.
[ 2.065380] [drm] Command Buffers.
[ 2.065380] [drm] Command Buffers 2.
[ 2.065381] [drm] Guest Backed Resources.
[ 2.065382] [drm] Max GMR ids is 64
[ 2.065383] [drm] Max number of GMR pages is 65536
[ 2.065384] [drm] Max dedicated hypervisor surface memory is 0 kiB
[ 2.065385] [drm] Maximum display memory size is 32768 kiB
[ 2.065386] [drm] VRAM at 0xe8000000 size is 4096 kiB
[ 2.065387] [drm] MMIO at 0xfe000000 size is 256 kiB
[ 2.065389] [drm] global init.
[ 2.065426] [TTM] Zone kernel: Available graphics memory: 1021480 kiB
[ 2.065427] [TTM] Initializing pool allocator
[ 2.065431] [TTM] Initializing DMA pool allocator
[ 2.065470] vmwgfx 0000:00:0f.0: BAR 1: can't reserve [mem 0xe8000000-0xefffffff pref]
[ 2.065471] [drm] It appears like vesafb is loaded. Ignore above error if any.
[ 2.065506] scsi target2:0:0: Domain Validation skipping write tests
[ 2.065508] scsi target2:0:0: Ending Domain Validation
[ 2.065532] scsi target2:0:0: FAST-40 WIDE SCSI 80.0 MB/s ST (25 ns, offset 127)
[ 2.065557] [drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
[ 2.065558] [drm] No driver support for vblank timestamp query.
[ 2.065846] [drm] Screen Target Display device initialized
[ 2.066125] [drm] width 1024
[ 2.066135] [drm] height 768
[ 2.066143] [drm] bpp 32
[ 2.072739] [drm] Fifo max 0x00040000 min 0x00001000 cap 0x0000077f
[ 2.075106] [drm] Using command buffers with DMA pool.
[ 2.075133] [drm] DX: no.
[ 2.100996] fbcon: svgadrmfb (fb0) is primary device
[ 2.102596] Console: switching to colour frame buffer device 128x48
可以看出,fbcon还是那个fbcon,只不过这个fbcon的驱动svgadrmfb是由drm带起来的。所以fbcon部分该怎么玩还是怎么玩,而且分辨率drm也报告了,至于这个怎么从grub2里面拿过来的,还得查查资料,这时候如果继续给内核传一个vga=791之类的参数,由于grub2的关系,已经不支持传这个参数进去了。也没时间去尝试用grub再传一个这个参数看是啥样的。毕竟没能力和精力去看内核源码,就排除法慢慢搞吧。要关闭KMS就一个内核参数nomodeset
下面这两个地址也有很多关于KMS的说明,参看后面这2个地址,基本上能搞清楚
https://nouveau.freedesktop.org/wiki/KernelModeSetting/
https://kernelnewbies.org/Linux_2_6_29
在KMS模式下也支持video= 这个参数,可以实现一些强制设置的模式,诸如 video=DVI-I-1:1024x768@85 video=TV-1:d 这样。具体的可以遇到有需求的时候再去测试。和前面的vidoe=vesa 或者video=vga16这样的还不一样,KMS模式下能针对显卡的某个输出接口做单独的分辨率,刷新率之类的设置。
终端下查看当前终端支持的行列字符信息用stty -a查看,貌似fbcon启动的时候会报一下,然后如果要查看,只能通过这个命令了。
其实我最想折腾的是resizecons这个命令,不过首先他需要svgalib的支持,其次在我的2个虚拟机上执行的时候,都报错了,并未成功。确实,这个和硬件相关性太大,不具有通用性。