萨满教或Olinuxino定制固件的艺术。 内核和Ubuntu第3部分

内核组装


我将解释为什么现有图像不合适。 他们的主要问题是它们建立在旧的3.4内核上,这肯定会限制编译器的最高版本4和ubuntu 12.04,当然,我不记得14.04。 因此,事实证明,如果要使用最新的软件和库,则必须重建最新的内核。 当然,您可以消除在源代码中至少编译gcc版本5的限制并修复代码,以便可以在版本4下进行构建,但这仍然很糟糕。 更不用说在我们的案例中linux的图形部分是多余的。

要开始使用kernel.org,我们要抽出4.14.57内核;那时它是最后一个稳定的版本。

在源文件夹中,创建一个开始配置的脚本:

#!/bin/sh make O=../olimex-kernel-4.14.57 #      -j2 #     ARCH=arm #      CROSS_COMPILE=arm-linux-gnueabihf- #   xconfig #   

我们得到这样的东西:



/linux-4.14.57/arch/arm/configs/的文件菜单中/linux-4.14.57/arch/arm/configs/选择/linux-4.14.57/arch/arm/configs/文件,其中有sunxi系列处理器的基本设置。 然后,您需要添加一些设置。 即 我们在指定的标志下方搜索并配置它们。

我们尽可能将所有内容嵌入内核。

CONFIG_BLK_DEV_INITRD-我们将不使用ramfs,而是启动Aufs(高级多层统一文件系统)。 简而言之,删除该复选框。
CONFIG_MEMCG-像里面的所有东西一样打开
CONFIG_BLK_CGROUP-打开
CONFIG_CGROUP_DEVICE-打开
CONFIG_CGROUP_CPUACCT-打开
CONFIG_CGROUP_PERF-像里面所有东西一样打开
CONFIG_EXPERT-默认情况下,只需选择并保留所有内容即可
CONFIG_BLK_WBT-选择像里面的一切
CONFIG_PARTITION_ADVANCED-在内部选择
CONFIG_SUN_PARTITION-选择
ARCH_SUNXI-在内部仅留下MACH_SUN5I

在总线支持中,选择CONFIG_PCI,因为USB wifi需要PCI总线支持。 显然,启用wifi支持后,内核不需要pci总线,但是,如果没有此wpa,请求者将找不到usb wifi。 为什么会发生这种情况,您可以深入了解历史,但是从所有方面来看,它都是历史发生的,通常,您需要了解并记住这一点。

CONFIG_CPU_FREQ_STAT-查找并选择
在CONFIG_NET内部,我们选择WIRELESS,然后选择CONFIG_CFG80211,然后在其中标记CONFIG_NL80211_TESTMODE和CONFIG_CFG80211_WEXT,后者包括请求方的wifi驱动程序。
CONFIG_MAC80211-打开网络堆栈。
CONFIG_MAC80211_MESH-打开
CONFIG_MAC80211_LED-好,让我们选择
CONFIG_NFC-除了CONFIG_NFC_NCI外,我们还包括其他内容。
CONFIG_PARPORT-打开
CONFIG_LED_TRIGGER_PHY-选择
CONFIG_REALTEK_PHY-选择
CONFIG_WLAN-选择
CONFIG_RTL8XXXU-选择并在CONFIG_RTL8XXXU_UNTESTED内部进行标记。
CONFIG_SERIO_SUN4I_PS2-打开
CONFIG_SERIAL_DEV_BUS-打开它并在里面选择SERIAL_DEV_CTRL_TTYPORT。
CONFIG_USB_WUSB_CBAF-启用
CONFIG_USB_WUSB_CBAF_DEBUG-打开
CONFIG_USB_WDM-打开
CONFIG_USB_SERIAL-选择
CONFIG_UWB-选择并在内部选择CONFIG_UWB_HWA和CONFIG_UWB_I1480U,然后CONFIG_USB_WUSB将出现并选择。
我们选择CONFIG_STAGING,在内部选择驱动程序CONFIG_RTL8192U和CONFIG_RTLLIB,在最后一个内部选择所有内容。 它们用诗歌标记为模块,以后必须分别拧紧。
CONFIG_R8188EU-选择

通常,这是内核设置的最低要求,如果您突然想要启用其他功能,请仔细阅读此参数的依赖项,否则编译时会出错。 接下来,您需要开始编译:

 make O=../olimex-kernel-4.14.57/ -j2 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- uImage #   modules #   LOADADDR=0x40008000 #        

同时,收集和devicetree文件:

 make O=../olimex-kernel-4.14.57 -j2 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs 

这只是为了以防万一,因为即使源文件在内核和uboot中相同,它们也可能出错。 因此,没有一个可以使另一个有效。

下一步是在SD卡的第一部分收集收集的文件:
-/ /olimex-kernel-4.14.57/arch/arm/boot/ - /olimex-kernel-4.14.57/arch/arm/boot/ - /olimex-kernel-4.14.57/arch/arm/boot/从这里我们得到了组装好的内核,它叫做uImage,仅重4.7米。
- /olimex-uboot/arch/arm/dts/从这里我们得到编译的树,文件sun5i-a13-olinuxino.dtb
-/ /u-boot-2018.05/ - /u-boot-2018.05/ - /u-boot-2018.05/从这里我们获得编译后的启动脚本boot.scr。

Ubuntu构建


由于已经准备好用于下载rootfs的所有必需部分,因此仍然需要构建ubuntu,为此,我们采用最新版本18.04。

首先,在根目录中创建一个文件夹:

 sudo mkdir /destrupt 

正是在这里,因为为了以后再应用chroot,您需要具有根目录中的完整权限,或者为其他任何文件夹注册chroot配置。 简而言之,在根目录中创建文件夹更加容易,并且不会摆弄配置文件。

对于组装,我们需要以下软件包,如果没有,则需要提供它们:
-Qemu用户静态
-debootstarp
-schroot

接下来,运行ubuntu构建:

sudo qemu-debootstrap #我们使用qemu是因为qemu将与ubuntu程序集一起安装,这将允许您立即在ubuntu的汇编版本上运行chroot
--arch armhf #处理器体系结构类型
--variant=minbase #最低版本的程序集
bionic #构建版本18.04
/destrup/ #地址在哪里收集
http://ports.ubuntu.com/ubuntu-ports在哪里收集资源

好了,ubuntu 18.04已经组装好了,我们现在将逐步进行配置:

1.在开始之前,我们进入/ destrup / etc / apt /并编辑sources.list,添加以下内容:

 deb http://ports.ubuntu.com/ubuntu-ports bionic main restricted deb http://ports.ubuntu.com/ubuntu-ports bionic universe deb http://ports.ubuntu.com/ubuntu-ports bionic multiverse 

这些只是我们处理器的发行版来源。

2.在新创建的distrib ubuntu上运行change root:

 sudo chroot /destrup 

首先,设置root用户的密码:

 passwd root 

在启动时登录需要此密码。

3.安装以下软件包。

apt update -更新程序包

我们列出了用于网络的软件包: iputils-ping, dhcpcd5, iproute2, iw, networkd-dispatcher, wireless-tools, net-tools.

网络系统软件包: linux-firmware, wpasupplicant, systemd, hostapd, kmod, udev.

好了,剩下的就是为了方便编辑和配置所有这些:nano,mc,usbutils,sudo。
我不会描述所有内容,因为它会涉及更多篇文章,我们将介绍一些设置所需的软件包。

配置wpa请求者。


首先,我们将简要分析什么是USB wifi。

提供wifi的芯片本身(在本例中为rtl8188)是封装的ADC,具有自己的特殊数据表示和对usb的访问。 即 如果在没有加载r8188eu.ko模块的情况下运行lsmod命令,我们只会看到有人占用了USB端口。 加载模块后,设备的名称将已经可见,换句话说,该模块只是用于控制该微电路的程序接口。

第二个最重要的库是lib80211.ko,它是IEEE 802.11标准本身,简单来说,它是将数字以太信号解释为特定的ehternet协议的表示。 但是为了管理所有这些,您需要安装linux-firmware,它将包括-wext-驱动程序,它将完成所有这些操作。 我们将在请求方中进一步将其连接。

让我们开始请求者配置。

我们在此地址爬上一个新组装的ubunte:

 / etc / wpa_supplicant / wpa_supplicant.conf 

如果没有,我们将创建一个配置文件,如果存在,我们会更正此类型:

 ctrl_interface_group=0 #        ctrl_interface=/var/run/wpa_supplicant #       #       usb  #      ap_scan=1 #wpa_supplicant   ,  - network={ ssid="SSID_" psk=" " key_mgmt=WPA-PSK #   proto=WPA2 pairwise=CCMP } 

如果正确配置了所有内容并加载了上述模块,则将在配置中指定的地址(ctrl_interface参数)上创建一个设备文件。

系统设置


我们配置了请求者,但是还没有人可以运行它。 您当然可以安装network-manager并享受自动调整的功能,但是硬核在哪里,垃圾桶在哪里。 通常,无聊。

因此,我们爬到地址:

 / etc / systemd / system/ 

如果没有,我们在这里创建一个名为network-wireless.service的文件,如果有,我们开始编辑:

 [Unit] #       Description=Wireless network connectivity Wants=network.target After=sys-subsystem-net-devices-wlx007005012449.device Before=network.target BindsTo=sys-subsystem-net-devices-wlx007005012449.device [Service] #    Type=oneshot RemainAfterExit=yes ExecStart=/sbin/ifconfig wlx007005012449 up #   ExecStart=/sbin/wpa_supplicant -B -i wlx007005012449 -D wext -c /etc/wpa_supplicant/wpa_supplicant.conf #   ExecStart=/sbin/dhcpcd wlx007005012449 #  dhcp   [Install] WantedBy=multi-user.target 

让我们关注请求者的启动:

ExecStart=/sbin/wpa_supplicant #访问请求者的路径
-B #在后台运行
-i wlx007005012449 #接口运行,相同的设备文件
-D wext #来自Linux固件的哨声驱动程序名称
-c /etc/wpa_supplicant/wpa_supplicant.conf请求方配置文件的地址

好了,一般来说,您所需的一切都已配置完毕,然后转到模块安装。

安装模块。


要安装模块,让我们回到前几步,即回到包含内核源代码的文件夹,然后运行命令以将模块从内核复制到带有ubuntu的文件夹:

 make O=../olimex-kernel-4.14.57 -j2 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules_install #     INSTALL_MOD_PATH=/destrup #    

之后,将所有组装好的模块复制到ubuntu上:

 / lib / modules / 4.14.57 / kernel 

现在最重要的是注册复制模块及其所有依赖项的启动,因此我们爬到该地址:

 / etc / modules 

并运行打开模块文件进行编辑,并添加以下模块:

 michael_mic r8188eu #   r8192e_pci rtllib rtllib_crypt_ccmp rtllib_crypt_tkip rtllib_crypt_wep r8192u_usb # lib80211 #   IEEE 802.11 

现在剩下的工作就是将所有组装好的ubuntu复制到上一篇文章中标记为sunt卡的sd卡部分。

之后,您可以将USB闪存驱动器插入板中,接通电源并坐在其uart上以访问其管理或通过ssh进入。 您可以向systemd添加命令以设置IP地址或其他常规配置,然后其他一切就在您的手中……

文章的第一部分
文章的第二部分

Source: https://habr.com/ru/post/zh-CN435586/


All Articles