您当前的位置:首页 > 计算机 > 系统应用 > Linux

linux 命令行下各种分辨率字体显示问题小记录

时间:07-21来源:作者:点击数:

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)之类的一系列热键来切换到不同的虚拟控制台,其实大多数管理员和维护人员绝大多数时候都是在命令行下工作,除了网络就是这个系统显示器的几个虚拟终端了。

  • chvt 3 切换到虚拟控制台3,是不是顿时感觉操作猛如虎牛叉了不少,不用再按Ctrl + Alt +F3切过去了,6个控制台任意驰骋!
  • showconsolefont -iv 查看当前虚拟控制台的字体信息,终端下所有能显示的字符都给你打出来了。
  • fgconsole 显示当前的console编号,切来切去记不住当前在第一个的时候可以查看一下
  • open/openvt -s bash 新开一个虚拟终端,-s切换过去。如果目前6个终端不够用,就再开吧。
  • setfont 设置虚拟控制台字体,参考archlinux的相关连接linux内核控制的控制台,内部虽然是utf-8编码格式的,但默认就支持256个或者最高到512个字符,所以咱们中文博大精深,是包含不下的。如果要考虑纯控制台显示中文,要么使用另外的虚拟终端诸如fbterm之类,要么有大佬专门做了补丁,貌似叫zhcon一类的吧参考1或者给内核打补丁还有如果只需要显示其中几个字为中文也有大佬研究了,直接替换字体文件里面的字体为汉字就好了,简单粗暴,参考具体的字体都在kbd这个包里面rpm -ql 查一下就知道路径了。后面的明天继续研究。另外一篇比较古老的文章,关于console字体的console字体
    关于kdb这个包的一些备忘记录:他包含了console字体(如/lib/kbd/consolefonts/lat4-10.psfu.gz这个带psfu,表示字体自带字体映射);字体映射(如/lib/kbd/unimaps/lat1.uni),编码映射(如/lib/kbd/consoletrans/cp850_to_uni.trans)这几类,字体文件好理解,就是showconsolefont 出来的那些字体文件,实际上就是一些位图,字体映射将unicode编码映射到字体文件的具体位置,编码映射是用于在console未使用unicode编码的情况下,程序给出的字符映射到unicode编码的字符集。显示的时候就再通过字体映射在具体的字体文件中查出字体(位图)并显示出来。这里理解的感觉不是很透彻,有空再来研究。
    setfont 的参数,-m 编码映射,这个用于将单字节编码的程序输出映射为unicode编码;内核如果工作在utf8模式,,那么所有用户程序的输出被内核看做为utf8编码(utf-8和unicode是2种不同的编码,虽然他们可以一对一的对应转换),并且将其转换为unicode2(UCS2,因为Unicode是4字节编码,unicode2是其16位编码的子集,16位其实很大了2的16次方6万多个位置可以装的下中日韩CJK字体了),但如果内核没工作在utf-8模式(例如iso8859-1,cp437等单字节编码),则内核会加载一个叫cmap的东西做单字节到16位unicode的转换,这个转换表在内核中自带3个,-m可以指定第四个。
    字体文件大多都自带unicode-to-font映射表(即U+2502或者0x2502的unicode ID到字体位图的映射),这些字体名字后缀一般都是什么psfu而不是psf,PSF为console字体。setfont -u参数也可以单独来之指定一个映射表。psfgettable psfaddtable psfstriptable 用于添加或者分立映射表。

关于psf 格式,参考PSF说明,有一些转换工具当然更直接的就是bdf2psf,从X下的等宽字体创建psf,zhcon的作者还写了一个工具用于编辑psf字体。

  • resizecons 一般来说,在grub里面添加了vga=xxx 或者gfxpayload=keep,内核的虚拟控制台分辨率就固定了,这个命令可以用来在使用的过程中修改分辨率。
    在这之前记录点小技巧,在服务器面前或者台式机面前诊断故障的时候,由于分辨率低,打印出来的日志一个屏幕装不下,很痛苦是不?以前我也很痛苦,自从公司大拿那学到了shift + pageup 向上翻页, shift + pagedown 向下翻页,的技巧后,我再也不痛苦了,绝大部分时候都是够用和令人满意的。但是还有少量的情况即便就是用这个热键,也会有一部分日志被冲掉。这里说明了原因和如何处理,默认这个缓冲区只有32k,如果要加大,得添加内核参数 fbcon=scrollback:Nk , N就是你要设置的容量,单位是k。这个archlinux的wiki上面还有点小技巧,就是日志 使劲打印到屏幕的时候,可以按Ctrl + s来阻塞write()函数输出,这样程序也停住了,日志也停住了,慢慢看完再Ctrl +q恢复。这样就可以不慌不忙的诊断故障了。
    还有就是在这个虚拟终端下,按键盘的Scroll Lock 键,屏幕就不再继续输出了,哪怕程序在不停的输出,但这时候键盘和程序是在继续输入输出的。再按一下Scroll Lock就可以看到了。
  • 前面说到fbcon=scrollback这个参数,就涉及到fbconsole这个问题,可以参考参考地址 1参考地址2这两篇文章,如果开机启动,想加载fbconsole,那么是需要在内核编译选项里同时开启显卡帧缓冲驱动以及fbconsole两个选项的。当然一般内核都会开启的,不至于要重新编译内核,但如果你的显卡帧缓冲没有开启,系统启用的是默认的console,这个console分辨率很低的,可以在系统的开机日志查到系统会报告
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个虚拟机上执行的时候,都报错了,并未成功。确实,这个和硬件相关性太大,不具有通用性。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门