你的位置:首页 > 操作系统

[操作系统]在树莓派2代B型/3代 上安装Fedora23


本文主要用于记录安装过程,以便日后查阅回顾。

之前在自己的树莓派上运行的一直是通过NOOB安装的Raspbian,但是本人平时更喜欢用Fedora作为开发和使用环境,而且Raspbian上的软件包通常更新比较缓慢。因为树莓派2代B型上市前,树莓派的芯片都是armv6或者更早的架构,只能运行ARM架构的Raspbian或者Fedora 18及更早版本。树莓派2代B型搭载的芯片架构是armv7,树莓派3代搭载的芯片架构是armv8,这两种芯片都能够运行ARM架构的Fedora 23,而仅运行Raspbian也难以充分发挥硬件性能,因此通过查找资料,最终找到了Fedora官方的文档说明。首先在16G的存储卡上验证成功,今天就在64G的SD卡上再来一遍,顺便把每个步骤记录下来,以备自己和其他人参考。

 

0. 准备工作
下载Fedora 23 ARM镜像和raspberry专用固件(Boot和Kernel):
a. Fedora 23 ARM 官方下载地址 [https://arm.fedoraproject.org/]
b. Raspberry Pi专用固件下载地址 [https://github.com/raspberrypi/firmware/archive/master.zip]
下载完后解压到方便的目录备用即可。

 

1. 创建磁盘分区结构
因为官方的文档中只介绍了fdisk的使用,因此就偷懒,只参考了官方文档的步骤,至于其他工具是否可行,暂时就不研究了。有兴趣的话可以试试。
由于大部分操作都是需要根用户权限的,如果觉得经常sudo麻烦,可以直接su切换到根用户。
首先需要确定磁盘的设备路径,使用USB读卡器有可能路径是/dev/sdb,而使用计算机内置的读卡器,SD卡的路径可能是/dev/mmcblk0,自己根据情况确定。
确定设备路径后运行# fdisk /dev/sdb (这是我电脑上的路径)
回车后进入交互模式,p打印当前操作磁盘的分区信息,d删除,删除现存的分区。
接着说说我打算创建的分区:根据官方文档,boot分区128Mb就足够了,因为2代B型的内存是1G,所以swap分区干脆给1G;这时还剩大约58G可用空间,给系统16G以上的可用空间差不多了,如果打算作为开发工作站,装很多软件包,可以适当留多一些,剩下的空间作为用户分区。
然后输入n创建新的分区,回车后出现提示,输入p可以创建主分区,输入e可以创建扩展分区,我们要创建的是主分区,之后根据提示输入1表示要创建的是第一个分区,然后输入两次回车,跳过First sector选项,在Last sector选项中输入+128M,表示划分给分区的大小。屏幕上的提示信息可以参考如下:

fdisk> Command (m for help): n
       Partition type
          p   primary (0 primary, 0 extended, 4 free)
          e   extended (container for logical partitions)
       Select (default p): p
       Partition number (1-4, default 1): 1
       First sector (32-31422463, default 32): 
       Last sector, +sectors or +size{K,M,G,T,P} (32-31422463, default 31422463): +128M        

       Created a new partition 1 of type 'Linux' and of size 128 MiB.

当看到Created a new partition 1 of type 'Linux' and of size 128 MiB.信息时就表示分区创建成功了。
根据刚才的提示我们可以知道,刚才创建的分区类型是“Linux”的,而树莓派要求Boot分区必须是FAT32,因此还需要输入t命令转换分区类型。输入L查询所有类型代码,可以查到W95 FAT32的代码是b,因此输入b,此时会显示类似下面的信息:

fdisk> Command (m for help): t
       Selected partition 1
       Partition type (type L to list all types): b
       Changed type of partition 'Linux' to 'W95 FAT32'.


接着重复上面的步骤,创建swap分区和系统分区。注意新建分区和修改分区类型时选择分区的编号需要增长。根据官方文档,swap分区的分区类型应该是“Linux swap / Solaris”类型,对应的编号是82。而系统分区和用户分区则不需要修改分区类型。
于是,创建磁盘分区结构的工作就基本完成了,执行p命令查看结果,确认无误后执行w命令写入存储卡。如果系统提示需要重启或者重新连接读卡器的,先重启或者重新连接后再执行下一步。

 

2. 格式化刚才新建的SD卡分区
如果分区已经成功,这时在/dev/目录下应该能看到sdb和新建的4个分区:sdb1,sdb2,sdb3,sdb4。如果是用内置读卡器,则可能是mmcblk0和对应的4个分区:mmcblk0p1,mmcblk0p2,mmcblk0p3,mmcblk0p4。
通过mkfs.vfat+分区设备路径,将指定分区格式化为FAT32格式。通过mkswap+分区设备路径,将指定分区格式化为swap格式。通过mkfs.ext4+分区设备路径,将指定分区格式化为ext4格式。

 

3. 挂载Fedora ARM 23系统镜像和SD卡分区,拷贝镜像文件
如果镜像还没解压,可以通过# unxz Fedora-Server-armhfp-23-10-sda.raw.xz命令解压。
创建临时挂载点:# mkdir /tmp/img/
创建loop device:# losetup --partscan --find --show Fedora-Server-armhfp-23-10-sda.raw /dev/loop0
挂载loop device的根分区到临时挂载点:# mount -r /dev/loop0p3 /tmp/img/
这里说明一下,通常Linux系统镜像中第一个分区是boot分区,对应/boot/路径。第二个分区是swap分区,可以忽略,第三个分区才是根分区,对应/。因为我们不打算使用原生的boot和kernal,因此不挂载第一个分区。官方的说明是,随Fedora一起发布的kernal暂时没有支持树莓派芯片的所有特性,因此最好使用树莓派的专用内核固件。
接着挂载我们的SD卡系统根分区:
# mkdir /tmp/rpi/
# mount /dev/mmcblk0p3 /tmp/rpi/
挂载SD卡boot分区:
# mkdir /tmp/rpi/boot/
# mount /dev/mmcblk0p1 /tmp/rpi/boot/
挂载SD卡home分区:
# mkdir /tmp/rpi/home/
# mount /dev/mmcblk0p4 /tmp/rpi/home/
然后,将镜像根分区中的文件拷贝到SD的根分区中:# cp -rpv /tmp/img/* /tmp/rpi/
可以执行sync确认缓存同步。
最后解除镜像文件的挂载:
# umount /tmp/img
# losetup -d /dev/loop0


4. 拷贝树莓派专用固件
如果固件还没解压,可以通过# unzip raspberry-firmware.zip命令解压。
然后通过以下命令拷贝需要用到的文件:
# cp -r firmware-master/boot/* /tmp/rpi/boot/
# cp -r firmware-master/modules/* /tmp/rpi/lib/modules/
然后在SD卡boot分区下创建一个名为cmdline.txt的文件,用来向内核传递参数。该文件内容如下:
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p3 rootfstype=ext4 elevator=deadline rootwait
这里需要注意,因为这个文件是给树莓派机器用的,SD卡插入树莓派后,SD卡的设备路径应该是/dev/mmcblk0,根分区设备路径就是/dev/mmcblk0p3,所以应该固定写这个内容,而不再是准备SD卡时在电脑上的设备路径。
接着在/boot分区下创建一个名为config.txt的文件,这一步是可选的,我第一尝试没有建立这个文件,系统可以正常启动。如果想建立这个文件,文件内容如下:

hdmi_force_hotplug=1
config_hdmi_boost=4
overscan_left=24
overscan_right=24
overscan_top=16
overscan_bottom=16
disable_overscan=0
core_freq=250
sdram_freq=400
over_voltage=0

 

5. 设置fstab文件内容
这里需要注意,修改的是SD卡上的fstab文件,而不是自己电脑上的,如果改错了,自己的电脑就没法启动了,所以需要特别小心。
首先执行# blkid | grep sdb命令查询sdb磁盘每个分区的UUID,如果是内置读卡器,磁盘名可能替换为mmcblk0
然后使用常用的编辑器打开/tmp/rpi/etc/fstab文件,这个文件是在引导的时候用的,修改的时候需要比较严谨。首先,swap分区放在最后一行,行数不够可以拷贝一行。第一行一定是根分区,也就是我们分的第三个系统分区。往下必须是一棵树型结构,我们把boot分区放在第二行,把用户分区放在第三行,分别更新UUID、路径和分区格式信息。确认无误后保存。

 

6. 解除SD卡挂载

# umount /tmp/rpi/boot/
# umount /tmp/rpi/home/
# umount /tmp/rpi/

最后可以执行sync确认缓存同步。

 

7. 将SD卡插入树莓派并进行初始化
上电后正常情况应该会显示初始化向导,可以选择1~4进行指定的操作,如设定时区、语言、设置root密码、新建管理员账号等。完成后重启即可。
重启后执行以下命令移除没用使用到的Fedora官方内核并更新系统:

# dnf remove kernel kernel-core kernel-modules
# dnf update

 

8. 安装树莓派固件更新包
首先执行# dnf install binutils git安装依赖组件。
然后执行以下命令安装rpi-update:

# curl -L -o /usr/bin/rpi-update https://raw.githubusercontent.com/Hexxeh/rpi-update/master/rpi-update
# chmod +x /usr/bin/rpi-update

最后执行# rpi-update即可进行专用固件升级。

 

参考资料:

1.  Raspberry Pi document on Fedora official wiki [http://fedoraproject.org/wiki/Raspberry_Pi]