第五章 X Window 系统5.1. 介绍5.2. 图形驱动5.2.1. 英特尔® 图形5.2.2. AMD® 图形5.2.3. NVIDIA® 图形5.3. X Window系统概述5.4. 安装 X.org 服务器5.5. X.org配置5.5.1. X.org配置文件5.5.2. 图形设置5.5.3. 监视器配置5.5.3.1. 使用RandR(调整大小和旋转)5.5.3.2. 使用X.org配置文件5.5.4. 输入配置5.5.4.1. 使用原子输入配置5.5.4.2. 使用X.org配置文件5.6. 在X Window系统中使用字体5.6.1. TrueType® 字体5.6.2. Type1字体5.6.3. 抗锯齿字体
使用 bsdinstall(8) 安装FreeBSD不会自动安装图形用户界面。本章介绍如何安装和配置 Xorg(1) 服务器,该服务器提供用于提供图形环境的开源X Window系统(俗称X11)。
在阅读本章之前,您应该:
阅读本章后,你会知道:
【摘要】 :识别您的GPU,即为其提供驱动程序的port,安装它,然后使用 sysrc(8) 使其在后续启动时运行。
在FreeBSD能够渲染图形环境之前,它需要一个内核模块来驱动图形处理器。图形驱动程序是一个快速发展的跨平台目标,这就是为什么它与FreeBSD基础系统分开开发和分发的原因。
下表显示了FreeBSD支持的不同图形处理器、其相应的模块以及提供该模块的ports:
表8. 支持的图形设备
| 类型 | 许可证 | 模块 | Port |
|---|---|---|---|
| Intel® | Open Source | i915kms | graphics/drm-kmod |
| AMD® | Open Source | amdgpu 或 radeonkms | graphics/drm-kmod |
| NVIDIA® | Proprietary | nvidia-drm, nvidiamodeset,或nvidia | graphics/nvidia-drmkmod 或 x11/nvidia-driver |
| 系统控制台帧缓冲区 | Open Source | scfb | x11-drivers/xf86-videoscfb |
| VESA BIOS扩展 | Open Source | vesa | x11-drivers/xf86-videovesa |
| VirtualBox® | Open Source | vboxvideo | emulators/virtualbox-ose-additions |
| VMware® | Open Source | vmwgfx | x11-drivers/xf86-videov-mware |
支持几代驱动程序技术。
vt(4) 控制台驱动程序时支持挂起和恢复所必需的。sc(4) 控制台和旧版本的 Xorg(1) 图形环境一起使用。以下命令可用于识别系统中安装的图形处理器:
xxxxxxxxxx% pciconf -lv | grep -B3 displayvgapci1@pci0:0:2:0: class=0x030000 rev=0x0c hdr=0x00 vendor=0x8086 device=0x46a6 subvendor=0x1028 subdevice=0x0b29 vendor = 'Intel Corporation' device = 'Alder Lake-P GT2 [Iris Xe Graphics]' class = display有关安装和启用这些驱动程序的详细说明,请参阅后续小节。
如果Intel®、AMD®或NVIDIA®驱动程序不支持图形处理器,则应使用SCFB或VESA模块。在UEFI模式下启动时,必须使用SCFB模块。在BIOS模式下启动时必须使用VESA模块。
此命令可用于检查启动模式:
xxxxxxxxxx% sysctl machdep.bootmethodmachdep.bootmethod: UEFIgraphics/drm-kmod 软件包间接提供了一系列与Intel® Graphics配合使用的内核模块。这些模块的最新版本可以与PRIME中的其他图形处理器结合使用,无需特殊配置。
可以通过执行以下命令安装英特尔®图形驱动程序:
xxxxxxxxxx# pkg install drm-kmod然后通过执行以下命令将模块添加到 /etc/rc.conf 文件中:
xxxxxxxxxx# sysrc kld_list+=i915kmsgraphics/drm-kmod 包间接为一系列AMD®图形处理器提供内核模块。根据硬件的生成,可以使用 amdgpu 或 radeonkms 模块。FreeBSD项目维护一个 AMD图形支持矩阵 ,显示支持级别并确定必须使用哪个驱动程序。
可以通过执行以下命令安装AMD® Graphics驱动程序:
xxxxxxxxxx# pkg install drm-kmod通过将当前模块添加到 /etc/rc.conf 文件并执行以下命令来启用它:
xxxxxxxxxx# sysrc kld_list+=amdgpu对于较旧的图形(HD7000/Tahiti之前),请通过将旧模块添加到 /etc/rc.conf 文件中并执行以下命令来启用它:
xxxxxxxxxx# sysrc kld_list+=radeonkmsNVIDIA®生产独立(standalone)或离散(discrete)图形处理器,并为FreeBSD提供专有驱动程序。FreeBSD Ports Collection提供了十多年的驱动程序,用于支持几代NVIDIA图形。
管理员应安装其硬件支持的最新驱动程序。
下表显示了包含驱动程序的端口、建议加载的内核模块以及该驱动程序支持的硬件列表的链接:
表9. 支持的NVIDIA®Graphics驱动程序版本
| Port | 模块 | 支持的硬件 |
|---|---|---|
graphics/nvidia-drm-kmod | nvidia-drm 或nvidia-modeset | supported hardware |
x11/nvidia-driver-470 | nvidia-modeset | supported hardware |
x11/nvidia-driver-390 或x11/nvidia-secondary-driver-390 | nvidia-modeset | supported hardware |
x11/nvidia-driver-340 | nvidia | supported hardware |
x11/nvidia-driver-304 | nvidia | supported hardware |
通过运行以下命令可以安装最新的NVIDIA®Graphics驱动程序:
xxxxxxxxxx# pkg install nvidia-drm-kmod要启用驱动程序,请通过执行以下命令将模块添加到 /etc/rc.conf 文件中:
xxxxxxxxxx# sysrc kld_list+=nvidia-drm这是直接渲染KMS驱动程序。
内核模式设置是在内核中设置图形模式的选项。使用以下 loader.conf(5) 可调参数为后续引导启用它:
xxxxxxxxxxhw.nvidiadrm.modeset="1"PRIME和 【6.1. Wayland】都需要内核模式设置。
早期版本的驱动程序不支持直接渲染。请通过执行以下命令使用modesetting模块:
xxxxxxxxxx# sysrc kld_list+=nvidia-modeset如果需要390之前的Nvidia驱动程序,请注意它们不支持内核模式设置,因此必须与旧版 sc(4) 控制台驱动程序和1.20之前的 x11/xorg-server 版本一起使用。
使用以下命令在 /etc/rc.conf 中启用它们:
xxxxxxxxxx# sysrc kld_list+=nvidiaX Window系统是UNIX®平台的传统图形堆栈,支持最新技术,同时保持对几代应用程序的支持。应用程序,包括桌面组件,由 Xorg(1) 服务器托管。该系统具有网络感知能力,其各个组件可以跨网络进行互操作。
X.org 服务器【摘要】:必须安装 X.org 服务器才能承载 desktop 。必须将用户添加到 video 组才能使用它。
安装并启用图形驱动程序后,X.org服务器可以作为元包安装,也可以使用端口树在本地编译。
完整的元包可以快速安装,但定制选项较少:
xxxxxxxxxx# pkg install xorg此安装导致安装了完整的X Window系统,包括传统的窗口管理器 twm(1) 和周围的传统桌面套件。大多数用户都希望安装和配置他们选择的现代桌面。
当前用户必须是 video 组的成员才能运行图形环境。要将用户添加到 video 组,请执行以下命令:
xxxxxxxxxx# pw groupmod video -m username要运行X Window系统,请使用 x11/xinit 中的 startx(1) ,或安装并配置显示管理器,以便在启动时启动图形登录。
xxxxxxxxxx适用于有经验的用户的X Window系统的较小版本有 x11/xorg-minimal 版本。大多数文档、库和应用程序将不会安装。一些应用程序需要这些附加组件才能运行。【摘要】:如果您的显示器或输入设备的默认设置不令人满意,desktops 将包含用于配置它们的GUI,或者可以手动配置。
X.org服务器支持最常见的图形处理器、显示器和输入设备。首先,尝试默认设置。本小节概述了它们的配置。
从历史上看,X.org服务器是用 /usr/local/etc/X11/ 中的文件配置的。这仍然支持边缘(edge)情况,但与动态自动配置冲突。
除非自动配置失败,否则不要在 xorg.conf 中为X.org服务器创建配置或运行 Xorg -configure 。
X.org服务器在多个目录中查找配置文件。/usr/local/etc/X11/ 是FreeBSD上这些文件的推荐目录。使用此目录有助于将应用程序文件与操作系统文件分开。
使用多个文件,每个文件配置一个特定的设置比传统的单个 xorg.conf 更容易。这些文件存储在 /usr/local/etc/X11/xorg.conf.d/ 子目录中。
直接渲染(Direct rendering)提供了无缝使用 离散图形处理器(discrete graphics processor,dGPU)和 集成图形处理器(integrated graphics processor,iGPU)(称为PRIME)的能力。驱动程序将在需要时自动将密集任务卸载(offload)到dGPU,并在可能的情况下关闭电源。
要在PRIME中更强大的GPU上启动应用程序,请使用 DRI_PRIME=1 环境变量。
如果多个图形驱动程序冲突,可以在 /usr/local/etc/X11/xorg.conf.d/ 目录中指定图形处理器的驱动程序。
要在配置文件中配置Intel®驱动程序,请执行以下操作:
示例14. 在文件中选择英特尔® 图形驱动程序
/usr/local/etc/X11/xorg.conf.d/20-intel.conf
xxxxxxxxxxSection "Device" Identifier "Card0" Driver "intel"EndSection要在配置文件中配置AMD®驱动程序,请执行以下操作:
示例15。在文件中选择AMD®图形驱动程序
/usr/local/etc/X11/xorg.conf.d/20-radeon.conf
xxxxxxxxxxSection "Device" Identifier "Card0" Driver "radeon"EndSection要在配置文件中配置NVIDIA®驱动程序,请执行以下操作:
示例16. 在文件中选择NVIDIA®图形驱动程序
/usr/local/etc/X11/xorg.conf.d/20-nvidia.conf
xxxxxxxxxxSection "Device" Identifier "Card0" Driver "nvidia-modeset"EndSectionxxxxxxxxxxx11/nvidia-xconfig也可用于对NVIDIA驱动程序中可用的配置选项进行基本控制。要在配置文件中配置SCFB驱动程序,请执行以下操作:
示例17. 在文件中选择SCFB图形驱动程序
/usr/local/etc/X11/xorg.conf.d/20-scfb.conf
xxxxxxxxxxSection "Device" Identifier "Card0" Driver "scfb"EndSection要在配置文件中配置VESA驱动程序,请执行以下操作:
例18. 在文件中选择VESA图形驱动程序
xxxxxxxxxxSection "Device" Identifier "Card0" Driver "vesa"EndSection要配置多个图形处理器,可以添加 BusID 。通过执行以下操作可以显示图形处理器总线ID列表:
xxxxxxxxxx% pciconf -lv | grep -B3 displayvgapci0@pci0:0:2:0: class=0x030000 rev=0x0c hdr=0x00 vendor=0x8086 device=0x46a6 subvendor=0x1028 subdevice=0x0b29vendor = 'Intel Corporation'device = 'Alder Lake-P GT2 [Iris Xe Graphics]'class = display--vgapci0@pci0:1:0:0: class=0x030200 rev=0xa1 hdr=0x00 vendor=0x10de device=0x25b9 subvendor=0x1028 subdevice=0x0b29vendor = 'NVIDIA Corporation'device = 'GA107GLM [RTX A1000 Laptop GPU]'class = display例19. 在文件中选择Intel®图形驱动程序和NVIDIA®图形驱动
/usr/local/etc/X11/xorg.conf.d/20-drivers.conf
xxxxxxxxxxSection "Device" Identifier "Card0" Driver "intel" BusID "pci0:0:2:0"EndSection Section "Device" Identifier "Card1" Driver "nvidia-modeset" BusID "pci0:0:2:1"EndSection几乎所有的显示器都支持 扩展显示标识数据标准(Extended Display Identification Data standard,EDID)。X.org使用 EDID 与监视器通信,并检测支持的分辨率和刷新率。然后,它会选择与该显示器一起使用的最合适的设置组合。
在使用 xrandr(1) 启动X服务器后,或者在X.org服务器配置文件中,可以原子地(atomically)选择监视器支持的其他分辨率。
在不带任何参数的X会话中运行 xrandr(1) ,查看视频输出和检测到的监视器模式列表:
xxxxxxxxxx% xrandrScreen 0: minimum 320 x 200, current 2560 x 960, maximum 8192 x 8192LVDS-1 connected 1280x800+0+0 (normal left inverted right x axis y axis) 261mm x 163mm 1280x800 59.99*+ 59.81 59.91 50.00 1280x720 59.86 59.74 1024x768 60.00 1024x576 59.90 59.82 960x540 59.63 59.82 800x600 60.32 56.25 864x486 59.92 59.57 640x480 59.94 720x405 59.51 58.99 640x360 59.84 59.32VGA-1 connected primary 1280x960+1280+0 (normal left inverted right x axis y axis) 410mm x 257mm 1280x1024 75.02 60.02 1440x900 74.98 60.07 1280x960 60.00* 1280x800 74.93 59.81 1152x864 75.00 1024x768 75.03 70.07 60.00 832x624 74.55 800x600 72.19 75.00 60.32 56.25 640x480 75.00 72.81 66.67 59.94 720x400 70.08HDMI-1 disconnected (normal left inverted right x axis y axis)DP-1 disconnected (normal left inverted right x axis y axis)HDMI-2 disconnected (normal left inverted right x axis y axis)DP-2 disconnected (normal left inverted right x axis y axis)DP-3 disconnected (normal left inverted right x axis y axis)这表明 VGA-1 输出用于以约60Hz的刷新率显示1280x960像素的屏幕分辨率。LVDS-1 被用作辅助监视器,以约60Hz的刷新率显示1280x800像素的屏幕分辨率。监视器未连接到 HDMI-1 、 HDMI-2 、 DP-1 、 DP-2 和 DP-3 连接器。
使用 xrandr(1) 可以选择任何其他显示模式。例如,要切换到60 Hz的1280x1024:
xxxxxxxxxx% xrandr --output LVDS-1 --mode 1280x720 --rate 60xxxxxxxxxx通常,启动X时的黑屏可以通过在初始化过程中添加xrandr-auto步骤来修复。监视器配置也可以在配置文件中设置。
要在配置文件中设置1024x768的屏幕分辨率,请执行以下操作:
示例20. 在文件中设置屏幕分辨率
/usr/local/etc/X11/xorg.conf.d/10-monitor.conf
xxxxxxxxxxSection "Screen" Identifier "Screen0" Device "Card0" SubSection "Display" Modes "1024x768" EndSubSectionEndSectionX.org 服务器提供 x11/libinput 库,这是一个跨平台的工作,在统一的库下支持所有触摸、指向和键盘设备。除非另有说明,否则将自动加载。
libinput(4) 的单个设备设置可以在桌面的GUI中调整,也可以使用 xinput 和 setxkbmap 手动调整。
或者,在名为 x11/xf86-input-[foo] 的 x11-drivers 类别中,有针对特定输入设备的较旧、轻量级的单独驱动程序。这种方法需要手动配置X.org服务器。本小节对两者进行了描述。
libinput(4) 支持的设备可以使用所选桌面附带的图形实用程序进行配置,也可以在运行时使用 x11/xinput 和 x11/setxkbmap 手动和原子地进行配置。
要询问 libinput(4) 它当前连接到哪些设备,请运行无参数的 xinput(1) :
xxxxxxxxxx$ xinput⎡ Virtual core pointer id=2 [master pointer (3)]⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]⎜ ↳ System mouse id=7 [slave pointer (2)]⎜ ↳ VEN_0488:00 0488:1031 Mouse id=11 [slave pointer (2)]⎜ ↳ VEN_0488:00 0488:1031 TouchPad id=12 [slave pointer (2)]⎣ Virtual core keyboard id=3 [master keyboard (2)] ↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)] ↳ System keyboard multiplexer id=6 [slave keyboard (3)] ↳ Power Button id=8 [slave keyboard (3)] ↳ Sleep Button id=9 [slave keyboard (3)] ↳ AT keyboard id=10 [slave keyboard (3)]这些设备支持的所有设置都作为属性提供,可以原子地列出和设置。指向设备有许多可配置的属性,键盘通常不需要。
要自定义键盘,请查看 setxkbmap(1) 。
一旦对配置满意,只需将这些行添加到X初始化脚本中,如 ~/.Xsession 或 ~/.xinitrc 。
xxxxxxxxxx一些桌面环境(如KDE Plasma)提供了一个图形用户界面来设置这些参数。在诉诸手动配置编辑之前,请检查是否是这种情况。例如,要手动配置X.org服务器的键盘布局:
示例21. 设置键盘布局
/usr/local/etc/X11/xorg.conf.d/00-keyboard.conf
xxxxxxxxxxSection "InputClass" Identifier "Keyboard1" MatchIsKeyboard "on" Option "XkbLayout" "es, fr" Option "XkbModel" "pc104" Option "XkbVariant" ",qwerty" Option "XkbOptions" "grp:win_space_toggle"EndSection【摘要】:其他字体可以从 x11-fonts 类别安装,也可以放置在 ~/.fonts 中。它们可立即用于现代应用程序。旧应用程序的配置可用,也有描述。
X Window系统提供X FreeType接口库(Xft(3))来渲染矢量或轮廓字体,以及传统的X逻辑字体描述系统,保持与几代应用程序和字体的兼容性。
用户感兴趣的字体主要有两种:
这些都是矢量或轮廓字体,也有位图字体。
FreeBSD Ports Collection包括一个广泛且不断增长的免费高质量字体目录,可用于安装 x11-fonts 类别。
从ports集合安装的全系统字体包位于 /usr/local/share/fonts/ 中。单个用户的字体可以放置在 ~/.fonts/ 或 ~/.local/share/fonts/ 中。
重建字体信息缓存时,目录或子目录中的字体将可立即使用。要手动触发此操作,请发出:
xxxxxxxxxx% fc-cacheports树中提供了大量免费、高质量的两种字体,可以很容易地与X Window系统一起使用。本章简要概述了这两者,以及配置X FreeType接口。
有关如何在FreeBSD上安装和配置字体的更多信息,请阅读文章 字体和FreeBSD 。
X.org内置了对渲染TrueType®字体的支持。有两个不同的模块可以启用此功能。本例中使用 freetype 模块是因为它与其他字体渲染后端更一致。要启用 freetype 模块,只需将以下行添加到 /usr/local/etc/X11/xorg.conf.d/90-fonts.conf 的 Module 部分。
xxxxxxxxxxLoad "freetype"现在为TrueType®字体创建一个目录(例如,/usr/local/share/fonts/TrueType),并将所有TrueType®字型复制到此目录中。请记住,TrueType®字体不能直接从Apple®Mac®中提取;它们必须是UNIX®/MoS-DOS®/Windows®格式,以便X.org使用。将文件复制到此目录后,使用 mkfontscale 创建 fonts.dir ,以便X字体渲染器知道这些新文件已安装。 mkfontscale 可以作为软件包安装:
xxxxxxxxxx# pkg install mkfontscale然后在目录中创建X字体文件的索引:
xxxxxxxxxx# cd /usr/local/share/fonts/TrueType# mkfontscale现在将TrueType®目录添加到字体路径中。这与 【5.6.2. Type1字体】中描述的相同:
xxxxxxxxxx% xset fp+ /usr/local/share/fonts/TrueType% xset fp rehash或者在 xorg.conf 中添加 FontPath 行。
现在,Gimp、LibreOffice和所有其他X应用程序现在都应该能够识别已安装的TrueType®字体。极小的字体(如网页上高分辨率显示的文本)和极大的字体(在LibreOffice中)现在看起来要好得多。
URW字体集合(x11-fonts/urwfonts)包括高质量版本的标准type1字体(Times Roman™、Helvetica™、Palatino™等)。Freefonts集合(x11-fonts/freefonts)包括更多的字体,但它们中的大多数都是用于Gimp等图形软件的,还不够完整,无法用作屏幕字体。
要从二进制软件包安装上述Type1字体集合,请运行以下命令:
xxxxxxxxxx# pkg install urwfonts对于freefont或其他系列也是如此。要让手动配置的X服务器检测这些字体,请在X服务器配置文件(/usr/local/etc/X11/xorg.conf.d/90-fonts.conf)中添加一行,内容如下:
xxxxxxxxxxSection "Files" FontPath "/usr/local/share/fonts/urwfonts/"EndSection或者,在X会话的命令行中运行:
xxxxxxxxxx% xset fp+ /usr/local/share/fonts/urwfonts% xset fp rehash这将起作用,但在X会话关闭时会丢失,除非将其添加到启动文件中(正常 startx 会话为 ~/.xinitrc ,通过XDM等图形登录管理器登录时为 ~/.xsession )。第三种方法是使用新的 /usr/local/etc/fonts/local.conf ,如【5.6.3. 抗锯齿字体】中所示。
X.org中位于 /usr/local/share/fonts/ 和 ~/.fonts/ 中的所有字体都会自动提供给支持Xft-ware 的应用程序进行抗锯齿处理。最新的应用程序都支持Xft-aware,包括KDE、GNOME和Firefox。
要控制哪些字体需要抗锯齿,或配置抗锯齿属性,请创建(或编辑,如果已经存在)文件 /usr/local/etc/fonts/local.conf 。可以使用此文件调整Xft字体系统的几个高级功能;本节仅介绍一些简单的可能性。有关更多详细信息,请参阅 fonts-conf(5) 。
此文件必须为XML格式。小心箱子,确保所有标签都正确关闭。该文件以通常的XML标头开头,后面是DOCTYPE定义,然后是 <fontconfig> 标签:
xxxxxxxxxx <fontconfig>如前所述, /usr/local/share/fonts/ 以及 ~/.fonts/ 中的所有字体都已提供给支持Xft的应用程序。要在这两个目录树之外添加另一个目录,请在 /usr/local/etc/fonts/local.conf 中添加这样一行:
xxxxxxxxxx<dir>/path/to/my/fonts</dir>添加新字体,特别是新字体目录后,重建字体缓存:
xxxxxxxxxx# fc-cache -f抗锯齿使边框略微模糊,这使得非常小的文本更具可读性,并从大文本中删除了“阶梯”,但如果应用于普通文本,可能会导致眼睛疲劳。要从抗锯齿中排除小于14号的字体大小,请包含以下行:
xxxxxxxxxx<match target="font"> <test name="size" compare="less"> <double>14</double> </test> <edit name="antialias" mode="assign"> <bool>false</bool> </edit></match><match target="font"> <test name="pixelsize" compare="less" qual="any"> <double>14</double> </test> <edit mode="assign" name="antialias"> <bool>false</bool> </edit></match>某些等宽字体的间距也可能不适合抗锯齿。这似乎是KDE的一个问题。一种可能的解决方案是强制此类字体的间距为100。添加以下行:
xxxxxxxxxx<match target="pattern" name="family"> <test qual="any" name="family"> <string>fixed</string> </test> <edit name="family" mode="assign"> <string>mono</string> </edit></match><match target="pattern" name="family"> <test qual="any" name="family"> <string>console</string> </test> <edit name="family" mode="assign"> <string>mono</string> </edit></match>(这将固定字体的其他常用名称别名为 mono ),然后添加:
xxxxxxxxxx<match target="pattern" name="family"> <test qual="any" name="family"> <string>mono</string> </test> <edit name="spacing" mode="assign"> <int>100</int> </edit></match>某些字体,如Helvetica,在抗锯齿时可能会出现问题。通常,这表现为一种似乎垂直切成两半的字体。在最坏的情况下,它可能会导致应用程序崩溃。为了避免这种情况,请考虑在 local.conf 中添加以下内容:
xxxxxxxxxx<match target="pattern" name="family"> <test qual="any" name="family"> <string>Helvetica</string> </test> <edit name="family" mode="assign"> <string>sans-serif</string> </edit></match>编辑 local.conf 后,确保以 </fontconfig> 标记结束文件。不这样做将导致更改被忽略。
用户可以通过创建自己的 ~/.config/fontconfig/fonts.conf 来添加个性化设置。此文件使用与上述相同的 XML 格式。
最后一点:对于LCD屏幕,可能需要亚像素采样。这基本上是将(水平分离的)红色、绿色和蓝色分量分开处理,以提高水平分辨率;结果可能是戏剧性的。要启用此功能,请在 local.conf 中的某个位置添加以下行:
xxxxxxxxxx<match target="font"> <test qual="all" name="rgba"> <const>unknown</const> </test> <edit name="rgba" mode="assign"> <const>rgb</const> </edit></match>根据显示器的类型,rgb可能需要更改为 bgr 、vrgb 或 vbgr :实验看看哪种效果最好。