一、简介
Ubuntu作为通用化的桌面系统,平易近人。我比较喜欢在Windows系统上安装个ubuntu虚拟机,用来做一些嵌入式linux应用的开发。之前用到嵌入式开发套件时,其配带光盘里都会给出对应的linux系统,一般版本过时,功能简陋。这里自己构建安装系统,可以在不改变原有linux内核的情况下,搭建一个自己想要的开发环境,系统版本、桌面环境啥的,自由更换,方便定制。
一个完整的基于Linux的操作系统一般包括三个部分,bios引导、linux内核、根文件系统。这里简单谈一下它们。
1. arm一般以uboot作为引导固件,也有用UEFI的(aarch64),引导固件烧录在芯片片内或者片外的eeprom,或者是SD卡上,通过设置芯片boot引脚电平来选择启动项,上电后加载启动项中的引导固件,完成一些CPU硬件初始化、硬件检测、内存映射等工作,之后便从启动分区中读出linux内核,配置启动参数cmdline,加载进内存,启动内核。
2. Linux内核文件位于启动分区中,启动分区一般是fat或者ext格式,据配置的启动参数,linux内核运行时会选择加载dtb文件(device tree),等到linu硬件初始化完成后会选择加载ramdisk或者直接到指定的root分区中运行/sbin/init程序,完成Linux内核启动过程。
3. init是PID为1的进程,它是系统的第一个进程,在系统关闭前会一直运行。它通过运行一系列的脚本来引导操作系统的其余部分,这些脚本通常位于 /etc/rc.d/init.d 或 /etc/init.d 中,它们执行一些服务,比如设置系统的主机名、检查文件系统错误、装载其他文件系统、启用网络、启动打印服务,等等。这些脚本执行完后,init 启动一个名为 getty 的程序,在控制台上显示登录提示。图形登录屏幕通过一个图形显示管理器处理,比如 lightdm、GDM 。
这篇文档只讲一下根文件系统的构建,至于引导固件和linux内核,大家都有的吧,自己编译就可以了。引导分区的配置,在另外一篇文章中再写。
构建系统时需要你已经有一个能够运行的系统,可以通过命令行来敲些命令,同时你运行的系统所在的存储介质不能和你所要构建安装的系统存储介质一样,这个应该好理解,总不能自己装个系统把自己给覆盖了,那安装失败可就呵呵。这个就跟用U盘或者光盘把系统安装到硬盘上是一样的道理。
二、安装系统准备
1. debootstrap最小化系统
首先进入原有系统后,安装debootstrap包,然后通过debootstrap命令下载ubuntu系统的最小化系统包。
~$ sudo apt-get install debootstrap
~$ sudo debootstrap --arch=arm64 xenial /media/ubuntu/ http://mirrors.ustc.edu.cn/ubuntu-ports
其中arch=arm64表示安装的是arm64版本的系统,如果需要安装arm32的,则应该是arch=arm。xenial是ubuntu系统的版本号,对应16.04,如果安装其它版本则可以更换版本号(trusty:14.04、precise:12.04)。/media/ubuntu/ 这里是存放系统安装包目录,这个位置可以随便更改。
2. 基本软件安装
安装基本软件是为了首次进入系统后,减少不必要的手动配置的麻烦。
首先绑定系统资源,然后chroot进入ubuntu最小系统
~$ sudo mount -o bind /dev /media/ubuntu/dev
~$ sudo mount -o bind /proc /media/ubuntu/proc
~$ sudo mount -o bind /sys /media/ubuntu/sys
~$ sudo chroot /media/ubuntu /bin/bash -l
注意这里chroot命令执行后,就进入ubuntu最小化系统环境了。
①sudo安装与passwd(安装sudo后,通过passwd命令配置root用户密码)
~# apt-get update
~# apt-get install sudo
~# passwd
②网络工具安装(包含ifconfig命令、dhcp服务)
~# apt-get install net-tools dhcpcd5
③locales配置(字符编码配置–可选)
~# apt-get install locales
~# dpkg-reconfigure locales
安装完毕后退出chroot环境,直接输入 exit 命令即可,退出后解绑系统资源。
~# exit
~$ sudo umount /media/ubuntu/dev
~$ sudo umount /media/ubuntu/proc
~$ sudo umount /media/ubuntu/sys
/dev/sda1 /boot ext4 defaults 0 2
/dev/sda2 / ext4 errors=remount-ro 0 1
/dev/sda3 none swap sw 0 0
其中/dev/sda这种需要根据实际情况填写,有可能是/dev/sdb或者是/dev/mmcblk,或者可以通过UUID指定,直接将/dev/sdan替换成 UUID=xxxx-xxxx。
4. 其它配置(可选)
配置主机名,假设设置为 uuu
~$ sudo echo 'uuu' > /media/ubuntu/etc/hostname
~$ sudo echo '127.0.1.1 uuu' >> /media/ubuntu/etc/hosts
DNS配置,修改 /etc/resolv.conf 如下
search domain
nameserver 127.0.0.1
nameserver 114.114.114.114
添加一个普通用户,假设新建用户名为zzz,密码123(注意:第一条命令,用于获取加密字符串’zzpru5Cch2iTk’)
~$ perl -e 'print crypt("123",q(zzz)),"\n"'
zzpru5Cch2iTk
~$ sudo chroot /media/ubuntu/ /bin/bash -c "useradd -m -d /home/zzz -s /bin/bash -p zzpru5Cch2iTk zzz"
~$ sudo chroot /media/ubuntu/ /bin/bash -c "addgroup zzz adm"
~$ sudo chroot /media/ubuntu/ /bin/bash -c "addgroup zzz sudo"
三、安装系统
好了,经过前面几步操作,终于开始系统烧录了,前面复杂的配置才会带来后续的一番风顺。首先连接上需要烧录系统的磁盘设备(可以是emmc,SD,硬盘),’ls /dev/’ 能发现其设备名。这里假设其为 /dev/sdb。首先通过’sudo fdisk /dev/sdb’命令对磁盘进行分区。建议配置:msdos分区表,创建三个分区,boot分区500M,root分区2G以上,swap分区随便。分完区后,开始烧录系统。
1. boot分区:一般需要Image/uImage内核文件、dtb、ramdisk文件,在另外一篇文章再讲,这里可以保持跟原有系统一致即可(从/boot中拷贝)。
~$ sudo mkfs.ext4 /dev/sdb1 #如果是fat分区: mkfs.vfat
~$ sudo mount /dev/sdb1 /mnt
~$ sudo rsync -a /boot/* /mnt
~$ sudo umount /mnt
~$ sudo mkfs.ext4 /dev/sdb2
~$ sudo mount /dev/sdb2 /mnt
~$ sudo rsync -a /media/ubuntu/* /mnt
~$ sudo umount /mnt
四、完善系统
配置硬件或者配置引导固件,来设置从上面安装的系统盘中启动。通过串口或者tty登录系统,用户名为上面建立的或者直接用root,通过下面步骤,完善安装的系统。
1. 更新
~$ sudo apt-get update
~$ sudo apt-get upgrade
~$ sudo apt-get install xfce4
~$ sudo apt-get install xfce4-goodies
~$ sudo apt-get install ttf-wqy-zenhei #中文字体
~$ sudo apt-get install slim #登录管理
~$ sudo apt-get install xscreensaver #屏保
~$ sudo apt-get install firefox #火狐浏览器
文章中如有错误请指正。