分享ubuntu-16.10具体制作过程

原文
Aut. wmy
Dat.2016.11.20
Ver.v1.0

前言:
Board:rk3288,纯净linux内核。不能从android源代码里面把kernel单独抠出来,那样会无法启动ubuntu文件系统。

一、内核镜像制作

1.linux-boot.img。
内核编译会生成zImage和resource.img这两个关键的文件,有两种打包方式,主要和分区文件参数相关:1.zImage和initrd.img打包成linux-boot.img烧到boot分区,resource.img单独烧到一个分区;2.zImage、initrd.img、resource.img合起来打包成linux-boot.img烧到boot分区。
1)第一种方式,zImage由内核编译生成,initrd.img是引导内核的一个分区,是开源的,可以用以下方式获得并编译:

$git clone https://github.com/TeeFirefly/initrd.git        $make -C initrd

编译之后会生成initrd.img,用:
mkbootimg –ramdisk initrd.img –kernel zImage -o linux-boot.img 可以生成目标镜像,mkbootimg可以去百度搜索下载安装。当然还有一种办法获得initrd.img,解包现有的initrd.img:

$unmkbootimg --kernel zImage --ramdisk initrd.img -i linux-boot.img

解包后的文件在当前目录下。
这种方式的分区文件如下图所示:

2)第二种方式,与一不同的就是打包方式多了一个参数:

$mkbootimg --kernel zImage --ramdisk initrd.img --second resource.img -o linux-boot.img

当然对应的解包方式也一样了。
分区如下图所示:

建议用第二种方式。

二、文件系统制作

1、先从官方上获取ubuntu core的tar包:
http://cdimage.ubuntu.com/ubuntu-base/releases/16.10/release/
可以从上面地址中选择合适的镜像包下载,比如适合rk3288的板子:ubuntu-base-16.10-base-armhf.tar.gz 。
也可以用命令下载到本地:

$wget -p  rootfs http://cdimage.ubuntu.com/ubuntu-base/releases/16.10/release/ubuntu-base-16.10-base-armhf.tar.gz

2.开始客制化文件系统
在上面下载的tar包的当前路径下:比如rootfs文件夹

$mkdir ubuntu
$tar -xpzf ubuntu-base-16.10-base-armhf.tar.gz -C ubuntu/

解压完毕后,安装虚拟启动器,模拟启动这个ubuntu文件系统:

$apt-get install qemu-user-static
$cp /usr/bin/qemu-arm-static ubuntu/usr/bin/

拷贝PC主机端的dns配置,因为待会安装程序时要用网络:

sudo cp -b /etc/resolv.conf  ubuntu/etc/resolv.conf

增加软件源:

sudo vim etc/apt/source.list

加入如下两行内容,保存后退出:

deb http://ports.ubuntu.com/ubuntu-ports/ xenial main universe
deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial main universe

经过上述步骤,已经对ubuntu根文件系统做了简单的配置,现在可以用工具切换到此根文件系统了。

为了简化操作过程,这里使用一个切换根文件系统的脚本,如下所示:
#!/bin/bash 
function mnt() {
    echo "MOUNTING"
    sudo mount -t proc /proc ${2}proc
    sudo mount -t sysfs /sys ${2}sys
    sudo mount -o bind /dev ${2}dev

    sudo chroot ${2}
}

function umnt() {
    echo "UNMOUNTING"
    sudo umount ${2}proc
    sudo umount ${2}sys
    sudo umount ${2}dev

}


if [ "$1" == "-m" ] && [ -n "$2" ] ;
then
    mnt $1 $2
elif [ "$1" == "-u" ] && [ -n "$2" ];
then
    umnt $1 $2
else
    echo ""
    echo "Either 1'st,2'nd or both parameters were missing"
    echo ""
    echo "1'st parameter can be one of these: -m(mount) OR -u(umount)"
    echo "2'nd parameter is the full path of rootfs directory(with trailing '/')"
    echo ""
    echo "For example: ch-mount -m /media/sdcard/"
    echo ""
    echo 1st parameter : ${1}
    echo 2nd parameter : ${2}
fi

在rootfs目录下创建mount.sh文件,并将上面内容复制到文件中:

#chmod +x ch-mount.sh
#./mount.sh -m ubuntu/

这个时候会切换到模拟启动的ubuntu文件系统下,如下所示

这个时候就可以对文件系统进行客制化了。
先更新源:

#apt-get update

先装个ipconfig命令:

#apt-get install net-tools

用ifconfig 查看下网络情况,发现ip地址和ubuntu主机地址一样。
开始安装一些常用工具,还有xserver,用来启动ubuntu桌面环境。

#apt-get install git vim openssh-server

需要一段时间,可以去做做其他事。
接着开始安装桌面环境,这里选择安装xubuntu桌面,比较炫酷一点:

#apt-get install ubuntu-session
#apt-get install xubuntu-desktop

需要很长时间。
全部安装完之后,添加一个用户ubuntu,并设置密码:

#useradd -s '/bin/bash' -m -G adm,sudo ubuntu

修改ubuntu用户密码,回车后按提示输入两次密码:

#passwd ubuntu
修改root帐号的密码,回车后按提示输入两次密码:
#passwd root

配置网络使其开机就能联网:

#echo auto eth0 > /etc/network/interfaces.d/eth0     #echo iface eth0 inet dhcp >>    /etc/network/interfaces.d/eth0

选择启动的桌面:xubuntu—startxfce4 lubuntu—-startlxde
update-alternatives –config x-session-manager
配置默认登录界面:

#dpkg-reconfigure lightdm

文件系统安装到此为止。

启动一个开机服务脚本:

touch  /etc/rc.local :
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.


/usr/local/bin/first-boot-recovery.sh
exit 0

/usr/local/bin/first-boot-recovery.sh脚本可以放入你开机要处理的事情。建议所有用户级别添加的脚本都放到这个目录下。
这里执行的是resize2fs命令如下:

#!/bin/bash 
clean_first_boot () {
    rm -f /firstboot 2>/dev/null
    sync
}

if [ -e /firstboot ]; then
    echo "======Expanding the rootfs..."
    resize2fs /dev/block/mtd/by-name/linuxroot
    if [ $? == 1 ]; then
        e2fsck -f -y /dev/block/mtd/by-name/linuxroot
        resize2fs /dev/block/mtd/by-name/linuxroot
    fi

    if [ ! -e /dev/block/mtd/by-name/system ]; then
        rm -f /usr/local/bin/b2android*
    fi
    clean_first_boot
fi

需要在根目录创建一个firstboot文件判断是否第一次升级启动。

ubuntu-16.10 开机启动脚本有所改变,由systemd 来控制,所以现在要激活一个服务:
cd /lib/systemd/system/
vim rc-local.service
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License,or
#  (at your option) any later version.

# This unit gets pulled automatically into multi-user.target by
# systemd-rc-local-generator if /etc/rc.local is executable.
[Unit]
Description=/etc/rc.local Compatibility
ConditionFileIsExecutable=/etc/rc.local
After=network.target

[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no

在文件末尾加上:

[Install]

WantedBy=multi-user.target

表示开机会启动。

然后最关键的一步,将这个文件链接到 /etc/systemd/system/rc-local.service,当然本来是没有这个文件的。

#ln -fs /lib/systemd/system/rc-local.service /etc/systemd/system/rc-local.service

最后进入etc那个目录ls -ln确认一下文件是否链接正确。
最后一定要给rc.local加上可执行权限:

#chmod +x rc.local

如果开机桌面会跳出错误的提示框,下面两句可以屏蔽:

#chown root:messagebus /usr/lib/dbus-1.0/dbus-daemon-launch-helper
#chmod 4754 /usr/lib/dbus-1.0/dbus-daemon-launch-helper

安装java环境:
http://www.oracle.com/technetwork/cn/java/javase/downloads/jdk8-downloads-2133151-zhs.html
下载jdk arm版 32位:
Linux ARM 32 硬浮点 ABI
77.78 MB
[url=]jdk-8u111-linux-arm32-vfp-hflt.tar.gz[/url]

下载之后再windows解压,jdk1.8.0_111 生成这样的文件夹,在/usr/local 创建文件夹java 把jdk1.8.0_111 拷贝进去。并给到权限:chmod 777 /usr/local/java -R
然后开始配置java:
vi ~/.bashrc
在末尾添加:

export JAVA_HOME=/usr/local/java/jdk1.8.0_111
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

:wq退出。执行source ~/.bashrc
javac -version 如果出现1.8等字样表示配置成功。

蓝牙wifi配置:
主要是讲蓝牙wifi的固件拷贝到相关目录下,具体什么目录根据kernel的代码而定,一般wifi是kernel决定为:/system/etc/firmware
蓝牙有文件系统层配置脚本开机加载,位置由脚本确定。
把蓝牙相关的脚本放到开机启动rc.local中:

/usr/local/bin/bluetooth.sh
#!/bin/bash 
echo "start bluetooth ..."
sleep 10
echo "start bluetooth "
echo 1 >/sys/class/rfkill/rfkill0/state

/usr/bin/brcm_patchram_plus --patchram /system/vendor/firmware/bcm43438a0.hcd --baudrate 1500000 --enable_lpm --enable_hci --no2bytes /dev/ttyS0

echo "done"

要是没有/usr/bin/brcm_patchram_plus这个工具可以从网上去下载一个

然后把指定的蓝牙固件放到/system/vendor/firmware下。
加载成功之后,hciconfig命令可以看到设备信息。

安装openGL环境:

#apt-get install freeglut3-dev libusb-1.0-0 libusb-1.0-0-dev
#sudo apt-get install libgl1-mesa-dri
#apt-get install g++

安装播放器:
先卸载原来的mplayer :

#apt-get remove mplayer
#sudo apt-add-repository ppa:rvm/smplayer
#sudo apt-get update
#sudo apt-get install smplayer
smplayer-skins smplayer-themes

文件系统制作完毕,如果想修改桌面或者加入一些其他的开源库sdk,可以继续对其改造。
exit命令推出模拟文件系统。

#./mount.sh -u ubuntu/ 卸载文件系统

接下来开始打包镜像:

$dd if=/dev/zero of=ubuntu.img  bs=1M count=4000sudo $mkfs.ext4 ubuntu.img
$mkdir ubuntu-mount
$sudo mount  ubuntu.img ubuntu-mount
$sudo cp -rfp ubuntu/* ubuntu-mount/
$sudo umount ubuntu-mount
$e2fsck -p -f ubuntu.img
$resize2fs -M ubuntu.img

以上生成ubuntu.img就是16.10的根文件系统,烧录到linuxroot分区后,系统起来。

接下来说明如何打包成一个整包:

先下载:
链接:http://pan.baidu.com/s/1gfNsY4b 密码:1tbs
这里面有rk的打包脚本等,可以看情况修改parameter分区文件,下载之后把之前编译好的 linux-boot.img、 linux-rootfs.img 放到这个文件夹,点击运行mkupdate.bat 批量脚本,稍后就会生成一个update.img

上面是制作镜像过程,至于一整个工程,目前不准备开源,还不稳定。下面是文件结构:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读2.3k次,点赞4次,收藏22次。最近安装了CARLA预编译版,总体过程感觉还是挺简单的,但是由于在网上找的参考资料并没有和自己遇到的情况完全一样的,所以把自己的安装过程记录下来,方便和自己一样的后来人进行安装,同时也自己作个记录留作备忘。其实预编译版的CARLA本身几乎不用什么命令行进行安装,主要步骤只有解压缩和拷贝文件,和极少的命令行安装操作。但是相关依赖以及其它的CARLA所使用的一些工具需要一起安装好,下面一起来看看安装步骤吧。_ubuntu22.04安装carla
文章浏览阅读6.3k次,点赞5次,收藏15次。在清华镜像中下载Ubuntu 20 安装包_ubuntu20下载
文章浏览阅读5k次。linux环境, python3.7.问题描述: 安装rally, pip3 install -r requirements.txt 时提示如下: 说明openssl 已安装。解决:1. pip3 install --upgrade pip , 结果输出如下 ..._error: command '/usr/bin/gcc' failed with exit code 1
文章浏览阅读1.1k次。自己刚踩坑装好的W11 WSL2 miniconda_wsl2 cuda
文章浏览阅读4.2k次,点赞4次,收藏17次。要安装这个 standalone的,会有一点区别(不识别 下面的 -localhost no)上面的命令会在~/.vnc/目录下生成一个 passwd文件。具体端口号,可以查看vncserver -list返回结果中的RFB PROT。作用是vncserver启动的时候运行这些命令,把桌面程序启动起来。如果希望用某个用户比如 demo登录,就用su切换到这个用户。桌面版默认就已安装,服务器版需要手动安装,并启动。关闭某个会话可以用下面的命令。远程地址输入ip:port。查看全部的vnc会话。_ubuntu vncserver
文章浏览阅读894次,点赞51次,收藏31次。在安卓使用vscode主要是连接一个远程的code-server服务,code-server服务安装在什么系统,调用的就是什么系统的环境,如这里使用ubuntu进行安装code-server,那使用的就是ubuntu环境,如需要go,python,java开发,需要在Ubuntu安装相关环境,创建的文件夹和项目也是在Ubuntu里面.这种方式其实在访问vscode的时候利于可以随时随地进行连接使用,且不受设备影响。
安装Ubuntu上超好用的终端Terminator。通过添加软件源、更新源、安装Terminator等步骤完成。
文章浏览阅读1.1k次,点赞83次,收藏74次。不要嫌弃Ubuntu的单调的终端界面啦,快来试试这些有意思的命令_ubuntu系统有趣的玩法
文章浏览阅读2.5k次。在ubuntu系统中,swap空间就是虚拟内存,所以考虑在磁盘空间富余的目录下设置虚拟内存swap文件,用来缓解内存不足的问题。通过上面的信息可以看到,/dev/vda2 目录下还剩余45G,那么就可以把swap文件生成在/dev/vda2目录下。在系统监控中发现,当数据库服务程序启动后,占用了大量内存空间,导致系统的剩余的内存往往只有几十MB。# bs 为块的大小,count 创建多少个块。# 执行命令后,删除创建的swap目录即可。#把生成的文件转换成 Swap 文件。2、创建一个swap文件。_ubuntu20修改swap大小
文章浏览阅读2.9k次,点赞2次,收藏10次。记录RV1126的SDK编译错误,以及解决处理_command exited with non-zero status 1
文章浏览阅读1.1w次,点赞22次,收藏101次。【记录】ubuntu20.04安装nvidia显卡驱动_ubuntu20.04安装nvidia显卡驱动
文章浏览阅读727次,点赞6次,收藏27次。在嵌入式Linux开发过程中,可能遇到uboot无法通过nfs服务从Ubuntu下载系统镜像(TTTTTT)的问题。如果你使用的是较新版本的Ubuntu,那么其**默认内核将不支持nfs2**!而**uboot仅支持到nfs2**,因此我们需要修改系统内核以及nfs配置文件,开启nfs2服务。**此问题非常棘手**,因为问题出现的时间太近,并且使用的人少。由于是2023年后才出现的问题,**chatgpt也无法解答**!本文参考网络上多篇博客资料,是解决此问题的最新办法。
ubuntu系统下安装软件的方法有多种,包括使用apt工具、deb软件包安装、源码编译安装以及通过软件中心安装。还有一种以 .run 后缀的软件包也可以在ubuntu系统下安装。具体的安装方法可以通过百度搜索来获取。
文章浏览阅读814次。本篇目的:Xubuntu如何安装pkg-configpkg-config是一个计算机软件包,用于帮助开发人员查找、定位和使用依赖库。它通常用于构建软件时,开发人员需要指定程序所依赖的外部库的位置和版本信息。使用pkg-config,开发人员可以很容易地查找、检索和导出这些依赖库的信息,从而简化了软件的构建过程。_ubuntu中怎么下载pkg-config
文章浏览阅读2k次。ubuntu创建共享文件夹_ubuntu20.04共享文件夹
文章浏览阅读2.9k次,点赞74次,收藏73次。对于有长期远程桌面需求的用户,建议将cpolar套餐升级到专业套餐,支持配置固定的公网TCP端口,且带宽也会相应的增大,支持更高效便捷的远程桌面连接Ubuntu系统。【cpolar内网穿透支持http/https/tcp协议,支持永久免费使用,不限制流量,无需公网IP,也不用进入路由器设置,操作简单。隧道创建成功后,点击左侧仪表盘的状态——在线隧道列表,查看xrdp隧道的所生成的公网TCP端口地址,复制下来。,使用cpolar内网穿透映射3389端口,生成公网TCP端口地址,实现在公网环境下,_ubuntu 局域网桌面
文章浏览阅读3.2k次。而在linux的ubuntu版本中,又多出两类用户:安装ubuntu系统的源用户xxx,其与root具有相同权限,仅在执行命令时,前面加sudo。在ubuntu中,用命令deluser username可以直接删除用户账号及家目录,而用centos7中的命令userdel -r username才能达到同样目的。在ubuntu中,没有moduser命令,centos7中的usermod修改用户信息的命令,同样可以用在ubuntu中。在系统中,创建新的用户或称为账号,一般需要多步操作。_ubuntu创建一个新用户
文章浏览阅读1.6w次,点赞4次,收藏23次。系统的许多日志文件都存储在 /var/log 目录中。你可以使用 ls /var/log 命令来列出可用的日志文件。/var/log/Xorg.0.log:包含 X 服务器的日志信息(图形界面)。打开DASH,搜索日志或者log,打开app,这个是/var/log的界面版。这将显示系统日志的末尾,并提供有关系统崩溃和错误的信息。/var/log/kern.log:包含内核日志信息。/var/log/dmesg:包含开机时的日志信息。/var/log/syslog:包含系统日志信息。_ubuntu查看系统日志
文章浏览阅读857次。首先将source.list复制为source.list.bak备份,然后将source.list内容改为需要的镜像源列表即可。Ubuntu采用apt作为软件安装工具,其镜像源列表记录在/etc/apt/source.list文件中。本节均为 Ubuntu 20.04 的镜像源列表。若为其他版本,将所有focal更改为其他版本代号即可。_apt 国内源