分享ubuntu-16.10具体制作过程

本文介绍RK3288平台下Ubuntu系统移植全过程,包括内核镜像制作、文件系统定制、开机服务配置及蓝牙WiFi设置等内容。

原文
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

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

这里写图片描述

<think> 嗯,用户现在想详细了解如何使用EasyBCD在Ubuntu 16.10系统上进行安装配置。虽然之前给的引用提到虚拟机安装更简单,但用户明确要求硬盘安装方案,看来是个喜欢动手实践的技术爱好者。 用户的需求很具体:要涵盖镜像下载、分区设置、EasyBCD操作和代码配置全流程。这个操作其实有风险,我得特别注意提醒备份和数据安全。Ubuntu 16.10本身已停产,但用户坚持要用这个版本,可能是为了特定软件兼容性。 安装流程需要分阶段说明:准备阶段要强调分区工具的使用,Windows自带的磁盘管理压缩卷最安全。镜像下载环节得提醒验证SHA256,毕竟官网停止维护后第三方源有风险。EasyBCD配置是核心难点,需要重点解释neogrub的菜单编辑语法,比如kernel那行末尾的"quiet splash"去掉才能看到调试信息。 突然想到用户可能遗漏的关键点:UEFI和Legacy启动模式区别。EasyBCD只支持Legacy,如果用户电脑是UEFI固件,整个方案就不可行。这个必须放在注意事项首条,避免用户白忙活。 分区方案示例给60GB比较合理,/boot分区200MB是必要的,16.10默认文件系统是ext4。代码部分grub-install命令要强调目标磁盘选择(/dev/sda常见),还有update-grub的依赖问题。 最后考虑延伸问题:用户问的是安装,但后续可能遇到驱动或双系统时间同步问题。Nvidia闭源驱动和UTC时间配置值得提前预警。要不要提SecureBoot规避方案?不过16.10对SecureBoot支持本就一般,还是放在问题扩展里更合适。 相关技术问题设计了三层:基础操作(引导修复)、进阶配置(驱动优化)、替代方案(UEFI方案)。用户如果卡在某个步骤,应该能通过这些问题找到解决路径。 </think> 以下是使用 EasyBCD 在 Windows 系统上配置 Ubuntu 16.10(64位)双启动的**详细步骤及关键注意事项**,结合镜像下载、分区、EasyBCD 操作和终端配置: --- ### **一、前期准备** 1. **镜像下载** - 官方源已停产,需从[Ubuntu旧版本仓库](https://old-releases.ubuntu.com/releases/16.10/)下载: `ubuntu-16.10-desktop-amd64.iso` - **校验SHA256**(防止损坏): ```bash sha256sum ubuntu-16.10-desktop-amd64.iso # 对比官网公布的校验值 ``` 2. **分区设置(Windows环境下操作)** - 按 `Win+X` → 磁盘管理 → 右键C盘 → **压缩卷**: - 建议分配至少 **50GB**(Ubuntu系统+软件) - 新建**未分配空间**(勿格式化为NTFS!) 3. **制作启动U盘** - 工具:Rufus([官网下载](https://rufus.ie/)) - 设置: ``` 分区类型: GPT (UEFI) 或 MBR (Legacy) → 需与后续引导匹配 文件系统: FAT32 ``` --- ### **二、安装Ubuntu 16.10** 1. **启动U盘安装** - 重启按F12(机型不同键位不同)选择U盘启动 - 安装类型:**其他选项**(手动分区) 2. **分区方案(关键!)** | 挂载点 | 大小 | 类型 | 格式 | 说明 | |--------|------------|----------|----------|-----------------------| | `/` | ≥30GB | 主分区 | ext4 | 系统根目录 | | `swap` | =内存大小 | 逻辑分区 | swap | 休眠/内存不足时使用 | | `/boot`| 200MB | 主分区 | ext4 | **必须独立分区!** | | `/home`| 剩余空间 | 逻辑分区 | ext4 | 用户数据 | > ⚠️ 注意:**/boot 必须为独立主分区**,否则 EasyBCD 无法引导。 3. **安装引导器的位置** - 选择 `/boot` 所在磁盘(例如 `/dev/sda3`) - **切勿安装到 Windows 引导分区(如 /dev/sda1)!** --- ### **三、EasyBCD 配置(Windows下操作)** 1. **添加NeoGrub引导项** - 打开 EasyBCD → `添加新条目` → `NeoGrub` → `安装` - 点击 `配置`,在弹出文本末添加: ``` title Ubuntu 16.10 root (hd0,2) # /boot 分区序号,从0开始计数 kernel /vmlinuz-4.8.0-xx-generic root=/dev/sda5 ro quiet splash # 内核路径和根分区 initrd /initrd.img-4.8.0-xx-generic ``` > 💡 分区序号查询: > - `(hd0,0)` 表示第一磁盘第一分区(通常是Windows保留分区) > - `/dev/sda5` 需替换为Ubuntu根分区(`/`)的实际路径 2. **验证引导文件路径** -Ubuntu中查看内核版本: ```bash ls /boot/vmlinuz-* # 记录完整文件名 ls /boot/initrd.img-* ``` - 将文件名替换到NeoGrub配置中 --- ### **四、修复引导(备用方案)** 若启动失败,在Ubuntu LiveCD中修复: ```bash sudo mount /dev/sdaX /mnt # sdaX = Ubuntu根分区 sudo mount /dev/sdaY /mnt/boot # sdaY = /boot分区 sudo mount --bind /dev /mnt/dev sudo chroot /mnt apt install --reinstall grub-efi # UEFI 用 # 或 grub-install /dev/sda # Legacy 用 update-grub ``` --- ### **⚠️ 重要注意事项** 1. **引导模式匹配** - **EasyBCD 仅支持 Legacy BIOS**,若Windows为UEFI启动,需改用`rEFInd`或`GRUB2` 2. **分区安全** - 操作前**备份整个磁盘**!误删Windows分区将导致数据丢失 3. **Ubuntu 16.10 特殊性** - 官方支持已终止(2017年7月停止更新),建议升级到LTS版 4. **时间冲突** - 双系统时间不同步?在Ubuntu中修复: ```bash timedatectl set-local-rtc 1 --adjust-system-clock ``` --- ### **常见问题解决** - **报错 "No such device"** → 检查NeoGrub中的分区编号(hd0,N)是否正确 - **GRUB rescue 模式** → 使用LiveCD重装GRUB(见第四部分) - **安装后直接进入Windows** → 关闭Windows的 **"快速启动"**(电源选项→选择电源按钮功能→更改当前不可用设置) > 参考实践指南:[EasyBCD双系统故障排除手册](https://neosmart.net/wiki/easybcd/dual-boot/) [^1] --- ### 相关问题 1. EasyBCD 在 UEFI 系统下有哪些替代方案? 2. Ubuntu 16.10 终止支持后如何安全升级到新版? 3. 双系统下如何共享 NTFS 磁盘数据而不损坏文件? 4. GRUB 引导菜单损坏如何手动修复? 5. 如何为 Ubuntu 分配更多磁盘空间而不重装系统? [^1]: 综合自 EasyBCD 官方文档及 Linux 双系统部署最佳实践,部分操作需根据硬件差异调整。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值