什么是Linux console(控制台)
Linux 控制台是Linux 内核的一个内部系统控制台,它为内核和进程提供了一个方式去发送并输出文本到用户以及从用户处接收文本。用户通常使用计算机键盘输入文本并在计算机屏幕读取输出文本。在这里探究的,是命令行界面(framebuffer暂不讨论)。更详细介绍可看:
https://en.wikipedia.org/wiki/Linux_console
禁用console(控制台)的目的
目的有3个,分别是:
1、禁止显示命令行界面
2、取消串口打印,防止设备被他人读取到系统打印信息
3、防止u-boot的启动参数被修改,保证设备能正常启动
如何找到跟console(控制台)相关的kernel参数
一切关于Linux系统的资料,都可以在Linux官网找到。因此,我们可以在
https://www.kernel.org/doc/html/v4.17/admin-guide/kernel-parameters.html找到我们需要的东西。搜索“console”关键词,可找到以下内容:
所以,我们可以通过设定 “console”这个参数的值,来命令行界面、串口打印信息输出到哪一个设备。现在我们不需要命令行界面和串口打印信息,可以将 console的值设为 NULL。
如何直接在Linux系统通过u-boot传递参数给kernel
在u-boot下,我们可以通过命令访问和修改环境变量。我们也可以通过 fw_printenv工具直接在Linux系统中访问和设置以上的参数。我这里就不阐述如何安装 fw_printenv工具,可参考以下链接内容:
https://blog.csdn.net/gl1987807/article/details/18045743
成功安装 fw_printenv 工具后,要实现通过u-boot传递参数给kernel,该修改哪个参数呢?答案是 bootargs。
在这里,简单介绍一下,什么是 bootargs。
bootargs 是传递给kernel的启动参数,这个参数决定了根文件系统的位置、根文件系统的类型等等,以及我们这里最关心的console。其传递过程如下,里面涉及到u-boot和kernel 源码的函数:
实现步骤:
1、通过ssh接上板子;
chile@chile-mach:/mnt/hgfs/linuxshare/firmware$ ssh -i ssh.txt root@192.168.8.118
2、验证是否已经成功安装fw_printenv工具,输入fw,然后按两次tab,看看是否出现“fw_printenv fw_setenv”回复,若有,即说明已经安装fw_printenv工具成功,若无,则需要重新安装;
# fw_
fw_printenv fw_setenv
3、输入命令 fw_printenv,查看目前环境,bootargs 到下一个分号(;),就是当前的bootargs参数的值;
# fw_printenv
ethprime=FEC
fdt_addr=0x18000000
loadaddr=0x12000000
bootcmd=ext4load mmc 2:1 ${loadaddr} zImage;ext4load mmc 2:1 ${fdt_addr} imx6q-sabresd.dtb;setenv bootargs root=PARTUUID=8cb74943-02 vt.global_cursor_default=0 rootwait rw;bootz ${loadaddr} - ${fdt_addr};
4、添加 console = null 。首先,将原来 bootcmd 到结尾的内容复制;然后,开始使用 fw_setenv 命令来设置环境,将 console = null 加入到刚刚复制的内容中,具体如下:
# fw_setenv bootcmd "ext4load mmc 2:1 ${loadaddr} zImage;ext4load mmc 2:1 ${fdt_addr} imx6q-sabresd.dtb;setenv bootargs root=PARTUUID=8cb749
43-02 vt.global_cursor_default=0 console=null rootwait rw;bootz ${loadaddr} - ${fdt_addr};"
5、最后,重新查看当前环境,可以发现,console = null 已经添加进去;
# fw_printenv
ethprime=FEC
fdt_addr=0x18000000
loadaddr=0x12000000
bootcmd=ext4load mmc 2:1 ${loadaddr} zImage;ext4load mmc 2:1 ${fdt_addr} imx6q-sabresd.dtb;setenv bootargs root=PARTUUID=8cb74943-02 vt.global_cursor_default=0 console=null rootwait rw;bootz ${loadaddr} - ${fdt_addr};
完。