本文记录了在一款国产的平板上折腾ubuntu的过程,其中方法对于大多数同时期国产平板基本适用。
由于购置了新的平板,之前的平板就闲置了下来,正好将它改造成无线抓包工具。不过这个很简单的设想在实践过程中遇到了大量的问题。
硬件信息:
CPU Intel Atom Z3770 1.46GHZ(代号baytail)
RAM 2*2GB LPDDR3
存储 64GB EMMC 4.51
网络 BCM4330 SDIO Aapter
1*USB 2.0接口 1*USB3.0接口
电池容量约为30whr
电容式触控屏
首先考虑到各Linux桌面发行版糟糕的硬件适应性能,在这个CPU、GPU、存储和操控方式都奇葩的设备上直接使用Kali/BT之类的肯定得面对一大堆驱动问题而且很可能最终无法解决。所以只能选择适应性稍好的Ubuntu。在
之前的帖子中通过手动配置grub2引导器已经成功使用了原本不支持32位efi的ubuntu14.10 32位版,而这是运行Ubuntu安装环境的第一步。
一、特殊的baytail
伴随着Intel在移动设备市场的战略扩张,平板市场成为了其发展的重中之重。2014年下半年Intel拿出了代号为bay-tail的atom z37xx处理器,并且对于中国南方的低价平板生产商,提供了非常丰富的设计支持和补贴,以至于市场上出现了大量售价不足RMB 1,000的运行Windows的平板设备。
但是出于对廉价设备反噬低端笔电市场的警惕(之前的上网本已经发生过了一次),Intel显然有意地采取了限制措施,这些设备的处理器基本都只有2GB RAM的寻址能力,并且大量用户反应无法部署64位版本的系统。
在早期,网上的舆论普遍认为Intel通过某些手段限制了处理器进入64位模式的能力,或者压根不支持64位扩展,但是15年上市的Thinkpad10平板(使用atom z3795)证明了这些都是谣言,该设备自带64位系统并可以正常使用。Intel在发布baytail之初也说明了这是64位处理器。处理器的CPUID信息也显示该处理器支持IA-32E模式(64位)。
经过了一些简单的测试,可以发现当试图部署和使用64位系统时,问题最先发生在引导的时候。对于廉价平板,固件中普遍只提供了efi模式而没有提供legacy模式,所以只能使用efi方式引导,而在试图将引导权交给64位efi引导器的时候,固件会对其毫无反应直接返回,对于32位的引导器则毫无问题。
基于上述分析,可以得出问题出现在系统引导的最初阶段的结论,于是就采取替换法,使用可以正常工作的32位efi引导器替换64位引导器。
在U盘上做好了Ubuntu 15.04 64bit Live CD之后,手动部署了grub2-efi32并重新编写了XXXXXXXg后,系统可以正常启动。因此可以确定,baytail处理器是可以工作在IA-32E(64位)模式下的。而之前出现的问题的原因在于,固件中缺乏对64位efi的支持。
二、蛋碎的ubuntu和linux
既然live cd已经成功启动,那么直接尝试用它安装ubuntu。由于之前已经在本地存储器上分出了16GB的空间,于是直接在live cd中完成分区并开始安装。不过在分区和安装的过程中,已经发现了不太好的现象:系统经常提示mmc i/o错误。
继续安装,前面一段似乎顺利,但是到最后要么在部署grub的时候,要么在处理交换分区的时候,总是会提示和mmc有关的失败(致命错误),并且根据网上所说在cmos setup中调整emmc设置无效,而出现错误的时间点还有随机性。
Google了一番之后发现是linux内核对emmc4.5存储器的支持有一些问题,而android的版本提供了一个patch过的内核分支能解决这个问题,linux4.x上这个问题也得到了解决。看来系统的开发者认为用户也需要精通系统内核什么的。考虑到换内核的代价不小,遂放弃解决这个问题的想法。既然emmc上不行就曲线救国嘛,再插入一个U盘并按要求分区,装U盘上,结果是USB控制器报错……
这看上去比之前ubuntu竟然认为efi只有64位于是其32位系统不支持efi还蛋疼。
三、曲线救国
这时由于受够了脑残设计和Atom Z37xx糟糕的性能,突发奇想如果在PC的虚拟机上先把ubuntu装进U盘里并且修改好grub,直接在平板上用不就完事了。
于是配置一个VMWare虚拟机,再删掉虚拟的磁盘,并且修改配置文件使其使用efi而非bios,最后开机并且连接上U盘。
修改的方法是找到虚拟机的配置文件(xxx.vmx),在里面添加一行:
<code class="lang-text">firmware="efi"</code>
不过要注意的是,这种方案对U盘有一定的要求,由于使用了U盘直接作为本地存储器,U盘的读写速度会影响系统效能,并且对U盘的写入寿命也有较高要求,如果试图在TLC U盘上部署系统很可能严重缩短其寿命并且有丢失数据的风险。本文中使用的U盘均为34nm Intel SLC FLASH + IS916控制器,读写速度均超过70MB/S
安装完之后,开始重新部署grub2。如果对grub2比较了解的话可以直接重新安装grub2,在参数中指定使用32位EFI。如果不了解或者怕敲一堆命令,可以采取手动部署的方法。
首先下载好grub2的32位efi.
grub2_efi_ia32.zip
261.50KB
ZIP
39次下载
然后找到之前在u盘上分配的efi分区,之后将其放在该分区的/efi/boot/目录下。
这样grub2就部署好了,不过要能直接正常启动,还需要修改其配置文件(不然只能敲命令手工启动……)。
接下来修改grub2的配置文件,同样在该分区下,在/boot/grub/下放好XXXXXXXg
这个文件可以从安装在u盘上的系统中找,也可以自己编一个简单的,可以去掉别的逻辑,只要保证有ubuntu的启动项:
<code class="lang-text">menuentry 'Ubuntu' {
set root='hd0,msdos3'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos3 --hint-efi=hd1,msdos3 --hint-baremetal=ahci1,msdos3 1e724c9a-9699-40de-8aca-57fd65383ecd
else
search --no-floppy --fs-uuid --set=root 1e724c9a-9699-40de-8aca-57fd65383ecd
fi
linux /boot/vmlinuz-3.19.0-30-generic.efi.signed root=UUID=1e724c9a-9699-40de-8aca-57fd65383ecd ro quiet splash $vt_handoff
initrd /boot/initrd.img-3.19.0-30-generic
boot
}</code>
(set root要根据实际情况处理)
访问efi分区的方法也很简单,首先sudo fdisk -l,会输出和图中差不多的信息
这里就可以看到u盘上efi分区是/dev/sdb5
然后 sudo mount挂载上,再以root权限启动文件管理器就可以很方便地操作
最后插好U盘,开机,设置引导,正常进入系统:
四、依旧蛋疼
进入系统后,非常万幸的是触屏和GPU和USB控制器工作正常,基本操作不存在问题,但是无线网卡没有驱动。
bcm4330似乎很少用在PC上,而且使用SDIO通信,使用bcm的b43开源驱动不太可行……
正好手里有个360随身WIFI,可以当无线网卡使用,于是自己下载了MTK MT7601的驱动并修改ID+编译,安装上之后可以正常搜索并连上无线,但是似乎只要有什么程序试图建立连接,整个系统就会假死。而且可以确认,在32位的ubuntu上用同样的源码编译出的驱动正常。
同时还存在的问题是系统有很高概率突然失去响应几秒。
和Windows 10 32位相比,ubuntu15.04的耗电速度明显要快,CPU发热量也明显要大一些(很可能CPU一直工作者高频率)。
另外系统启动和退出的阶段都有一定概率挂掉,只能强制重启。
可以说,整个过程中遇到了相当多的问题(很多和系统本身相关),并且最终的体验比较糟糕。ubuntu作为一个比较流行的linux发行版的硬件适应能力糟糕,这方面的思路也存在问题。如果它们的开发者希望有人用它们的系统的话,或许应该把主要精力放在解决对硬件的适配问题上。
200字以内,仅用于支线交流,主线讨论请采用回复功能。