类thinkpad笔记本安装deepinv20后启动黒屏的解决

手上有台旧的thinkpad X220,更新加装了块固态盘,便想安装deepinV20试一下,结果出了许多的问题。安装时挺顺利,一切正常,deepin 的默认安装也没有给人过多的选择。可是一重启,就好象启动不了了,过了grub阶段就暗夜黑屏卡在那不动了,过了好一阵,才又弹出drm:drm_atomic_helper_wait_for_flip_done等类型错误。就是感觉不会向下走的意思,网上查说是会启动但要等上半小时之类,我是没有功服去等的,就重启,结果还是一样,又查了下,说是接上外接显示器可以启动,试了一下还真是这样!不知什么原因。改了一下grub2的参数试了网上几个都不行!
看了很多的解决方法,然后找到了acpi_osi=! acpi_osi=‘Windows 2009’
主要是修改grub文件,在Deepin操作系统终端中输入sudo vi /etc/default/grub,输入密码后修改文件内容:GRUB_CMDLINE_LINUX_DEFAULT="acpi_osi=! acpi_osi=‘Windows 2009’ "。最后,执行一下命令更新,运行sudo update-grub命令即可。
经过这个修改后,不管是开机还是重启都非常的顺利。但是搞不清为什么这样改。
找到一个观点觉得有点道理:

引导参数acpi_osi的文档告诉:
acpi_osi= [HW,ACPI] Modify list of supported OS interface strings
acpi_osi=“string1” # add string1
acpi_osi="!string2" # remove string2
acpi_osi=!* # remove all strings
acpi_osi=! # disable all built-in OS vendor
strings
acpi_osi=!! # enable all built-in OS vendor
strings
acpi_osi= # disable all strings

                    'acpi_osi=!' can be used in combination with single or
                    multiple 'acpi_osi="string1"' to support specific OS
                    vendor string(s).  Note that such command can only
                    affect the default state of the OS vendor strings, thus
                    it cannot affect the default state of the feature group
                    strings and the current state of the OS vendor strings,
                    specifying it multiple times through kernel command line
                    is meaningless.  This command is useful when one do not
                    care about the state of the feature group strings which
                    should be controlled by the OSPM.
                    Examples:
                      1. 'acpi_osi=! acpi_osi="Windows 2000"' is equivalent
                         to 'acpi_osi="Windows 2000" acpi_osi=!', they all
                         can make '_OSI("Windows 2000")' TRUE.

                    'acpi_osi=' cannot be used in combination with other
                    'acpi_osi=' command lines, the _OSI method will not
                    exist in the ACPI namespace.  NOTE that such command can
                    only affect the OSI support state, thus specifying it
                    multiple times through kernel command line is also
                    meaningless.
                    Examples:
                      1. 'acpiosi=' can make 'CondRefOf(_OSI, Local1)'
                         FALSE.

                    'acpi_osi=!' can be used in combination with single or
                    multiple 'acpi_osi="string1"' to support specific
                    string(s).  Note that such command can affect the
                    current state of both the OS vendor strings and the
                    feature group strings, thus specifying it multiple times
                    through kernel command line is meaningful.  But it may
                    still not able to affect the final state of a string if
                    there are quirks related to this string.  This command
                    is useful when one want to control the state of the
                    feature group strings to debug BIOS issues related to
                    the OSPM features.
                    Examples:
                      1. 'acpi_osi="Module Device" acpi_osi=!' can make
                         'OSI("Module Device")' FALSE.
                      2. 'acpiosi=! acpi_osi="Module Device"' can make
                         'OSI("Module Device")' TRUE.
                      3. 'acpiosi=! acpi_osi=! acpi_osi="Windows 2000"' is
                         equivalent to
                         'acpi_osi=! acpi_osi=! acpi_osi="Windows 2000"'
                         and
                         'acpi_osi=! acpi_osi="Windows 2000" acpi_osi=!',
                         they all will make '_OSI("Windows 2000")' TRUE.

— http://redsymbol.net/linux_boot_parameters/

该参数将”Linux”添加到内核在询问BIOS“嘿,你支持什么”时将获得的受支持操作系统列表。通过添加该字符串以后,使用ACPI的东西会说“嘿,我有一个需要ACPI的功能,我正在运行Linux – 支持哪些平台?”他们会找回一个包含Linux的列表。

通过将此设置为Linux,您基本上禁用任何检查以查看BIOS是否表示某些ACPI功能将适用于某些操作系统
告诉内核欺骗ACPI BIOS并告诉它它不是Linux(这就是为什么指定Linux是愚蠢的)。已知某些BIOS会检查它们是在Windows或特定版本的Windows下运行,如果不是,则禁用它们。这个参数让你解决这个愚蠢的问题。

附:卡在log时的参考方法:我们也可用这种方法测试效果!
开机进入引导Deepin界面时,按e键,进入grup编辑页面,在倒数第二行代码的最后【splash quiet】后边空一格添加以下代码:
acpi_osi=Linux nomodeset
备注:如果【splash quiet】后边原本有代码的也删除掉。
然后按F10自动保存重启,然后深度的显卡驱动管理器会自动启动并更新驱动,待更新完成后根据提示重启即可,此时显卡方案也切换了方案。

附加:
在grub阶段可以传递内核的启动参数(内核的参数包括3类:编译内核时参数,启动时参数和运行时参数),可以传递的启动参数非常非常多,完整的启动参数列表见:http://redsymbol.net/linux-kernel-boot-parameters。这里只列出几个常用的:

init= :指定Linux启动的第一个进程init的替代程序。
root= :指定根文件系统所在分区,在grub中,该选项必须给定。
ro,rw :启动时,根分区以只读还是可读写方式挂载。不指定时默认为ro。
initrd :指定init ramdisk的路径。在grub中因为使用了initrd或initrd16命令,所以不需要指定该启动参数。
rhgb :以图形界面方式启动系统。
quiet :以文本方式启动系统,且禁止输出大多数的log message。
net.ifnames=0:用于CentOS 7,禁止网络设备使用一致性命名方式。
biosdevname=0:用于CentOS 7,也是禁止网络设备采用一致性命名方式。
:只有net.ifnames和biosdevname同时设置为0时,才能完全禁止一致性命名,得到eth0-N的设备名。

另外,root启动参数有多种定义方式,可以使用UUID的方式指定,也可以直接指定根文件系统所在分区,如"root=/dev/sda2",
1.4.6 initrd和initrd16命令
initrd file
只能紧跟在linux或linux16命令之后使用,用于为即将启动的内核传递init ramdisk路径。
同样,基于根分区,可以使用绝对路径,也可以使用相对路径。路径的表示方法和linux或linux16命令相同。例如:
linux16 /vmlinuz-0-rescue-d13bce5e247540a5b5886f2bf8aabb35 root=UUID=b2a70faf-aea4-4d8e-8be8-c7109ac9c8b8 ro crashkernel=auto quiet
initrd16 /initramfs-0-rescue-d13bce5e247540a5b5886f2bf8aabb35.img
详细可参考:https://www.cnblogs.com/f-ck-need-u/archive/2017/06/29/7094693.html

内核参数:
http://redsymbol.net/linux-kernel-boot-parameters/

上一篇:Core Python | 2 - Core Python: Getting Started | 2.4 - Introducing Strings, Collections, and Iterati


下一篇:【JUC】008-Stream流式计算