恩山无线论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1641|回复: 15

AARCH64架构移植CentOS通用教程 | 多系统引导教程 | 贝壳云 我家云 N1 X96MAX+等

  [复制链接]
发表于 2021-8-24 06:57 | 显示全部楼层 |阅读模式
本帖最后由 network007 于 2021-9-17 19:50 编辑

前言:
1、首先感谢参考教程提供相应文件的作者,因为本教程基于这些文件编写
2、因CentOS AARCH64安装镜像大部分采用EFI引导,而EFI引导一般为服务器使用,而一般盒子采用uboot引导,故需制作uboot可引导镜像
3、当然也可用这个镜像CentOS-Userland-7-aarch64-generic-Minimal-2009-sda.raw.xz修改,但官方提供的此类镜像非常少,所以需自行构建
4、本教程以贝壳云作为参考,虽为通用教程,但并非完全小白教程
5、本教程以CentOS-7-aarch64-Everything-2009.iso作为系统镜像,以Armbian_21.02.3_Rock64_focal_current_5.10.21.img.xz作为ubuntu镜像提取内核和firmware和module,以Armbian_21.02.3_Rock64_buster_current_5.10.21.img.xz作为Debian镜像
6、对于仅想在x86设备上模拟运行aarch64的centos系统的可根据步骤四进行构建,即可快速体验
7、多系统采用centos + debian + ubuntu构建,还想其他系统请自行根据教程修改添加即可
8、因步骤和原理基本都写在教程中,故未提供制作好的完整镜像,而是提供制作脚本和命令,只要明白其中原理,便可构建出需要的系统,对于新设备也同样适用
9、最终想构建什么版本组合,请自行选择即可,推荐构建5.X内核版

一、参考教程:
1、我就是我_杨随意 win7(x86)下搭建aarch64架构的centos系统
2、rush 粒子云armbian尝试解决开机偶尔风扇狂转(帖子编号:2)
3、flippy 62+、62+O S905x3、S922x、贝壳云、我家云、微加云等OP固件
4、armbian官方镜像 RK3328固件
5、libgcc 贝壳云P1 刷机指南
6、贝壳云改2G内存

二、基础条件:
1、设备只要可运行armbian,如玩客云 + N1以及其它AARCH64或ARM64理论皆可
2、虚拟机或实体机一台 CentOS 7 X86,虚拟机可采用vm或hyper-v
3、如何构建请自行搜索解决

三、工具和镜像:
1、官网地址:https://download.mobatek.net/212 ... _Portable_v21.2.zip
2、MobaXterm软件使用教程请参考:MobaXterm详细使用教程(一)
3、MobaXterm主要学习怎么登录shell、 如何上传文件和下载文件
4、CentOS镜像,请官网选择aarch64下载:https://www.centos.org/download/

5、下载时请下载完整版安装镜像,此处以CentOS-7-aarch64-Everything-2009.iso作为说明

四、通用镜像构建教程 | 可直接在虚拟机上运行AARCH64
1、解压文件 | 将附件解压后把centos.7z传到/root目录下
  1. yum install -y epel-release
  2. yum install -y p7zip
  3. cd && 7za x centos.7z
复制代码

2、将运行脚本centos.sh和镜像
CentOS-7-aarch64-Everything-2009.iso传入/root目录
  1. chmod +x centos.sh
复制代码
  1. ./centos.sh
复制代码

3、编译安装qemu5.2.0
# 如果执行命令后无法编译,请根据报错提示自行搜索解决缺少依赖
  1. ./centos.sh make
复制代码

4、构建镜像
# CentOS 7 最小化构建4G即可 | CentOS 8 最小化构建6G即可
# 构建命令格式: ./centos.sh build XXX.iso 数据大小(单位: G)
  1. ./centos.sh build CentOS-7-aarch64-Everything-2009.iso 4G
复制代码

5、构建参数
# 系统构建参数如下:仅以CentOS 7 作为说明,CentOS 8请自行修改
# 输入时请根据以下提示依次输入数字或字母,并回车键确认 | 数字后面的字符串为你输入的选项注释
第2项 | 设置时区
2 1 Set timezone 2 Asia → 再次回车键 65

第5项 | 设置分区
5cc1 Standard Partition→c

第5项 具体内容如下 | 默认已选定请按字母键'c'即可
Installation Destination
[x] 1) : 4096 MiB (vda)

Autopartitioning Options
[x] 2) Use All Space

Partition Scheme Options
[x] 1) Standard Partition

第8项 | 密码设置
8123456123456yes

# 最终必须确保没有!项 | 否则无法安装
Installation
1) [x] Language settings                 2) [x] Time settings
        (English (United States))                (Asia/Shanghai timezone)
3) [x] Installation source                4) [x] Software selection
        (Local media)                               (Minimal Install)
5) [x] Installation Destination         6) [x] Kdump
        (Automatic partitioning                  (Kdump is enabled)
        selected)                              8) [x] Root password
7) [ ] Network configuration                  (Password is set.)
        (Not connected)
9) [ ] User creation
        (No user will be created)

安装命令 | 输入字母键'b'
# 安装需经过漫长等待,主要是构建过程中卡选项,大概半小时后构建完毕,一般会重启,无法重启时,回车即可
  1. b
复制代码

6、登录测试 | 用户root | 密码: 第8项设置的密码
  1. root 123456
复制代码
  1. # 修改网卡为开机自启
  2. sed -i "/ONBOOT/ c ONBOOT=yes" /etc/sysconfig/network-scripts/ifcfg-eth0
复制代码
  1. # 关闭镜像
  2. poweroff
复制代码

7、centos.sh中其它命令说明
  1. # 单独运行镜像命令
  2. ./centos.sh run

  3. # 终止镜像命令 | 需另开一窗口
  4. ./centos.sh stop
复制代码

五、可引导镜像说明 |  此处以贝壳云作为参考,其它设备请根据以下方法自行构建
# 通过以上构建方式可以构建出类似CentOS-Userland-7-aarch64-generic-Minimal-2009-sda.raw.xz的镜像
# CentOS-Userland-7-aarch64-generic-Minimal-2009-sda.raw.xz的解压方式直接用7z文件即可提取内部最大镜像3.img即可,同时还需修改网卡自启,以及启动参数为multi-user.target,其它参数修改请参考第六步
# 当然不想构建镜像的可直接下这个镜像修改

1、可引导镜像构建难点:
1.1、必须解决引导问题 | 无法引导将导致构建失败,下方将采用extlinux.conf进行引导,采用其它引导方式的请自行修改
1.2、必须使用uboot可引导的LINUX | INITRD | FDT
1.3、LINUX | INITRD 可去上方flippy或armbian官方镜像提取内核文件,当然也可自行交叉编译内核,内核编译请自行搜索学习,本教程就不单独说明了
1.4、同时必须确保上述内核能在你的设备上正常运行,如果下方构建镜像启动失败后,就需要检查此内核是否能正常启动了,将完整镜像刷入U盘,然后配合后面教程开启U盘引导后,用此镜像测试
1.5、FDT | 低版本可采用 贝壳云P1 刷机指南中提供的rk3328-beikeyun.dtb | 高版本可采用flippy提供的rk3328-beikeyun-1296mhz.dtb

1.6、配置相应的固件和模块/usr/lib/firmware /usr/lib/modules

     
2、最终引导目录/boot内容如下:
  1. [root@bogon boot]# tree
  2. .
  3. ├── boot.bmp
  4. ├── config-5.10.21-rockchip64
  5. ├── dtb
  6. │   └── rockchip
  7. │       ├── rk3328-beikeyun-1296mhz.dtb
  8. │       └── rk3328-beikeyun.dtb
  9. ├── extlinux
  10. │   └── extlinux.conf
  11. ├── Image -> vmlinuz-5.10.21-rockchip64
  12. ├── initrd.img-5.10.21-rockchip64
  13. ├── System.map-5.10.21-rockchip64
  14. ├── uboot.img
  15. ├── uInitrd -> uInitrd-5.10.21-rockchip64
  16. ├── uInitrd-5.10.21-rockchip64
  17. └── vmlinuz-5.10.21-rockchip64
复制代码

3、extlinux.conf中默认开启高版本内核dtb | 如需低版本请注释高版本 | 开启低版本即可

  1. # 低版本内核4.x dtb
  2. FDT /boot/dtb/rockchip/rk3328-beikeyun.dtb

  3. # 高版本内核 5.x dtb
  4. # FDT /boot/dtb/rockchip/rk3328-beikeyun-1296mhz.dtb
复制代码

六、构建可引导镜像
# 从flippy或armbian官方下载镜像,并上传至/root目录下,此处以Armbian_21.02.3_Rock64_focal_current_5.10.21.img.xz镜像为例
# 要使用本脚本必须下载含armbian字符串且以.img.xz结尾的镜像,否则需根据以下命令分步执行
1、脚本内容
  1. cat centos_aarch64.sh
复制代码
  1. #! /bin/bash

  2. #########################################################################

  3. # Name: centos_aarch64.sh
  4. # Date: Sat 24 Aug 2021 15:30:00 PM CST
  5. # Auth: network007
  6. # Vers: V1.0
  7. # Func: Centos Build AARCH64

  8. #########################################################################

  9. # 判断文件
  10. NUM1="$(ls | grep -i armbian.*img.xz$ | wc -l)"
  11. NUM2="$(ls | grep -i boot | wc -l)"
  12. [ ${NUM1} -eq 0 -o ${NUM2} -eq 0 ] && echo "armbian img or boot isn't existed" && exit

  13. # 备份文件
  14. [ ! -f /root/centos.img.bak ] && cp -a /root/centos.img{,.bak}

  15. # 清理镜像
  16. cd
  17. umount armbian centos rootfs &>/dev/null
  18. losetup -D
  19. rm -rf armbian centos rootfs centos_aarch64.img centos.img
  20. find -iname 'armbian*.img' | xargs rm -rf

  21. # 还原镜像
  22. cp -a centos.img{.bak,}

  23. # 创建挂载点
  24. mkdir -p armbian centos rootfs

  25. # 解压镜像 | 非*.img.xz镜像请自行解压
  26. xz -dk *.img.xz

  27. # 挂载镜像 | armbian镜像非单分区结构,请自行查找挂载其它分区
  28. losetup -Pf Armbian*.img && lsblk
  29. mount /dev/loop0p1 armbian

  30. losetup -Pf centos.img && lsblk
  31. mount /dev/loop1p4 centos

  32. # 创建空白镜像 | 也可使用dd命令或其它命令
  33. qemu-img create centos_aarch64.img 2G

  34. # 镜像分区
  35. fdisk centos_aarch64.img <<EOF
  36. n
  37. p



  38. w
  39. EOF

  40. # 映射镜像
  41. losetup -Pf centos_aarch64.img && lsblk

  42. # 格式镜像
  43. mkfs.ext4 -L CentOS /dev/loop2p1

  44. # 挂载镜像
  45. mount /dev/loop2p1 rootfs


  46. # 配置引导文件 | 因采用mv命令,故操作后原镜像失效
  47. mv /root/centos/* /root/rootfs
  48. rm -rf /root/rootfs/usr/lib/{modules,firmware}
  49. mv /root/armbian/usr/lib/{modules,firmware} /root/rootfs/usr/lib
  50. cp -a /root/armbian/boot/{boot.bmp,config*,initrd*,System*,uInitrd*,vmlinuz*,Image*} /root/rootfs/boot
  51. cp -a /root/boot/* /root/rootfs/boot

  52. # 配置fstab
  53. cat >/root/rootfs/etc/fstab<<EOF
  54. LABEL=CentOS /                       ext4     defaults,noatime        0 0
  55. EOF

  56. sync

  57. umount armbian centos rootfs &>/dev/null
复制代码

2、构建可引导镜像
  1. bash centos_aarch64.sh
  2. xz -zk centos_aarch64.img
复制代码

七、制作U盘镜像
# 导出镜像centos_aarch64.img至桌面 | 方便制作U盘镜像
# 我使用的工具为Etcher | 应用请百度下载 | 也可使用其它工具 或dd命令

Select imagecentos_aarch64.img Select target →  U盘Flash!

八、将贝壳云引导修改为U盘优先模式 | 在贝壳云shell终端操作
#  因贝壳云缺少spi导致uboot环境变量修改后无法保存,故需采用硬修改模式,以下uboot.img采用rush提供的修改版引导
#  贝壳云首先必须先刷armbian镜像,再将文件uboot.img上传至贝壳云/root目录下
  1. EMMC=$(lsblk | grep -oE mmcblk[0-9]boot | cut -b 1-7 | uniq)
  2. dd if=/root/uboot.img of=/dev/$EMMC seek=16384 bs=512 count=8192 conv=fsync
  3. poweroff
复制代码

九、插上U盘开机即可
# 然后去路由器查看dhcp分配地址 | shell登录      
# 用户名    root
# 密   码    123456

十、写入EMMC
# 不想写入的就不用写入了,直接U盘使用即可 | 如果无法启动 | 请更换U盘重新制作即可 | 还是无法启动,就必须检查启动参数了
  1. # 备份EMMC数据 | 备份时建议挂载硬盘 | 没有硬盘挂载时也可再添加一个U盘,此U盘建议大于8G ,如果不备份4G即可 | 也可用当前U盘,但需对未分区部分进行格式化挂载,且U盘空间足够,如需备份16G,不备份8G即可
  2. # 准备备份磁盘 | 此处以硬盘作为参考 | /dev/sdb1 为硬盘设备号 | 请使用空盘,否则将导致数据丢失
  3. parted -s /dev/sdb mklabel msdos
  4. parted -s /dev/sdb mkpart primary ext4 2048s 100%
  5. mkfs.ext4 /dev/sdb1
  6. mkdir -p /mnt/disk
  7. mount /dev/sdb1 /mnt/disk

  8. # 备份EMMC数据 | 不备份时此步可省略
  9. EMMC=$(lsblk | grep -oE mmcblk[0-9]boot | cut -b 1-7 | uniq)
  10. dd if=/dev/${EMMC} of=/mnt/disk/bkc.img bs=1M

  11. # 格式EMMC分区 | 默认保留32M | 不建议全部分配
  12. parted -s /dev/${EMMC} mklabel msdos
  13. parted -s /dev/${EMMC} mkpart primary ext4 65536s 100%
  14. mkfs.ext4 -L CentOS /dev/${EMMC}

  15. # 恢复U盘引导
  16. EMMC=$(lsblk | grep -oE mmcblk[0-9]boot | cut -b 1-7 | uniq)
  17. dd if=/boot/uboot.img of=/dev/$EMMC seek=16384 bs=512 count=8192 conv=fsync

  18. # 移动镜像数据
  19. # 将镜像文件centos_aarch64.img上传到/mnt/disk目录下
  20. mkdir -p centos emmc
  21. losetup -Pf /mnt/disk/centos_aarch64.img
  22. mount /dev/loop0p1 centos
  23. mount /dev/${EMMC}p1 emmc
  24. mv  centos/* emmc
  25. sync

  26. # 关机拔掉U盘硬盘 | 开机测试
  27. poweroff
复制代码

十一、多系统引导 | 高阶衍生 | 无需跳过即可
# 本教程仍以贝壳云作为参考安装centos + debian + ubuntu三个系统
# 教程仅针对U盘和硬盘作为多系统安装磁盘,EMMC磁盘容量硬改或其他设备16G以上的可参考下方教程自行尝试修改
# 文件的上传下载请参考上方教程中工具和镜像步骤
# 贝壳云或其它设备必须开启第三方磁盘可引导,贝壳云的U盘引导见本教程第八步
# 构建需要两个磁盘一个数据磁盘和一个系统磁盘,建议选择硬盘,使用时请先备份数据,构建操作会格式化磁盘
# 前提条件贝壳云已刷centos系统,以下脚本构建于centos 7 2009,不保证armbian各系统能完全兼容,不能兼容的请根据脚本内容,分步执行即可

1、脚本内容
  1. cat buildmultios.sh
复制代码
  1. #! /bin/bash

  2. #########################################################################
  3. # Name: buildmultios.sh
  4. # Date: Thu 16 Sep 2021 10:20:23 PM CST
  5. # Auth: network007
  6. # Vers: V1.0
  7. #########################################################################

  8. T1=$(date +%T)
  9. DISKFILE="/tmp/storage_disk"
  10. OSSWITCH="/media/boot/extlinux/qhos.sh"
  11. OSTEMP="/tmp/qhos.txt"

  12. # 存储磁盘
  13. storage_disk () {
  14.     # 磁盘检测 | 非EMMC系统请直接注释磁盘检测参数
  15.     HDD="$(ls /dev/sd[a-z] 2>/dev/null)"
  16.     HDDNUM="$(ls -l /dev/sd[a-z] 2>/dev/null| wc -l)"
  17.     [ -z $HDD ] &>/dev/null && echo -e "\n请插入存储磁盘!" && exit 1
  18.     [ $HDDNUM -gt 1 ] && echo -e "\n检测到多个磁盘,请仅插入存储磁盘!" && exit 1

  19.     # 存储分区 | 非EMMC启动请直接指定HDD参数即可
  20.     # HDD="/dev/sda"
  21.     umount -f /mnt/data 2>/dev/null
  22.     parted -s ${HDD} mklabel msdos
  23.     parted -s ${HDD} mkpart primary ext4 2048s 100%
  24.     mkfs.ext4 ${HDD}1
  25.     mkdir -p /mnt/data
  26.     mount ${HDD}1 /mnt/data
  27.     echo HDD=$HDD > $DISKFILE
  28.     lsblk | grep "/mnt/data"
  29. }

  30. # 扇区转换
  31. seccon () {
  32.     [ $# -ne 1 ] && exit
  33.     UNIT="$(echo $1 | rev |cut -b1)"
  34.     NUM="$(echo $1 | sed "s/.$//")"
  35.     if [ "$UNIT" == "M" ]; then
  36.         counts=$(($NUM <<11))
  37.     elif [ "$UNIT" == "G" ]; then
  38.         counts=$((NUM <<21 ))
  39.     elif [ "$UNIT" == "T" ]; then
  40.         counts=$((NUM <<31 ))
  41.     else
  42.         echo -e "无效单位,请重新输入!" && exit 1
  43.     fi
  44.     echo $counts
  45. }

  46. # 系统磁盘
  47. system_disk () {
  48.     # 磁盘检测 | 同理使用非EMMC系统注释全部磁盘检测参数即可
  49.     [ $# -eq 0 ] && echo -e "\n未检测到分区参数!" && exit 1
  50.     [ ! -f $DISKFILE ] && echo -e "\n请先进行存储磁盘操作!" && exit 1
  51.     source $DISKFILE

  52.     for i
  53.     do
  54.         TAG1="$(echo $i | sed "s/.$//" | sed "s/[0-9]//g")"
  55.         TAG2="$(echo $i | sed "s/[0-9]//g")"
  56.         TAG3="$(echo $i | sed "s/[0-9]//g" | sed "s/[A-Z]//g")"
  57.         [ ${#TAG1} -ne 0 -o ${#TAG2} -eq 0 -o ${#TAG3} -ne 0 ] \
  58.             && echo -e '无效字符,请重新输入!' && exit 1
  59.     done

  60.     UDISK="$(ls /dev/sd[a-z] 2>/dev/null | grep -v "$HDD")"
  61.     [ -z $UDISK ] && echo -e "\n请插入系统U盘!" && exit 1
  62.     echo UDISK=$UDISK >> $DISKFILE

  63.     # 系统分区 | 非EMMC系统直接指定UDISK即可
  64.     # UDISK="/dev/sdb"
  65.     umount -f ${UDISK}{1..4} 2>/dev/null
  66.     parted -s ${UDISK} mklabel msdos
  67.     STARTSEC=2048
  68.     for n in $(seq 1 $#)
  69.     do
  70.         ENDSEC=$(($(seccon "$(eval echo \$n)") + $STARTSEC - 1))
  71.         parted -s ${UDISK} mkpart primary ext4 ${STARTSEC}s ${ENDSEC}s
  72.         STARTSEC=$(($ENDSEC + 1))
  73.     done
  74.     parted -s ${UDISK} mkpart primary ext4 ${STARTSEC}s 100%
  75.     mkfs.ext4 -L boot ${UDISK}1
  76.     mkdir -p /media/boot && mount ${UDISK}1 /media/boot
  77. }

  78. # 多系统构建
  79. multios () {
  80.     [ ! -f $DISKFILE ] && echo -e "\n请先进行存储磁盘操作!" && exit 1
  81.     source $DISKFILE

  82.     # 分区数检测
  83.     PARTNUM="$(ls -l ${UDISK}[2-9] 2>/dev/null |wc -l)"

  84.     # 镜像检测 | 以.img.xz镜像压缩包作为原始镜像 | 至少一个文件,即单系统构建
  85.     cd /mnt/data || { echo -e "\n挂载点不存在!"; exit 1; }
  86.     umount -f IMG 2>/dev/null
  87.     rm -f *.img
  88.     losetup -D

  89.     XZNUM="$(ls -l *.img.xz 2>/dev/null | wc -l)"
  90.     [ $XZNUM -ne $PARTNUM ] && echo -e "\n镜像和分区数不匹配!" && exit 1

  91.     # 引导文件
  92.     [ ! -f boot.7z ] && echo -e "\n引导文件boot.tar.gz不存在!" && exit 1
  93.     7za x boot.7z -o/media/boot -y
  94.     >/media/boot/extlinux/extlinux.conf

  95.     # 切换菜单
  96.     >$OSSWITCH
  97.     >$OSTEMP
  98.     chmod +x $OSSWITCH
  99.     cat >>$OSSWITCH<<EOF
  100. #! /bin/bash

  101. system_change(){
  102. echo -en "OS Menu:
  103. Please Select:"

  104. read -n 1 NUM
  105. echo ""

  106. case \$NUM in
  107. esac
  108. }

  109. while true
  110. do
  111.     clear
  112.     system_change
  113. done
  114. EOF

  115.     # 镜像解压
  116.     p=2
  117.     q=1
  118.     ls *.img.xz | while read line
  119.     do
  120.         IMGNAME="$(echo $line | sed "s/.xz$//")"
  121.         xz -dk $line
  122.         IMGDEV="$(losetup -f)"
  123.         losetup -Pf $IMGNAME
  124.         mkdir -p IMG && mount ${IMGDEV}p1 IMG

  125.         OSNAME="$(awk -F [=] '$0~/^ID=/ {print $2}' IMG/etc/os-release | sed "s/"//g")"
  126.         if [ "$OSNAME" == "centos" ]; then
  127.             TITLENAME="CentOS"
  128.         elif [ "$OSNAME" == "debian" ]; then
  129.             TITLENAME="Debian"
  130.         elif [ "$OSNAME" == "ubuntu" ]; then
  131.             TITLENAME="Ubuntu"
  132.         else
  133.             TITLENAME="$OSNAME"
  134.         fi

  135.         [ -z $OSNAME ] && echo -e "\n镜像文件无明确系统,构建失败!" && exit 1
  136.         mkfs.ext4 -L os_${OSNAME} ${UDISK}${p}
  137.         mkdir -p /media/${OSNAME} && mount ${UDISK}${p} /media/${OSNAME}
  138.         rm -rf /mnt/data/IMG/lost+found
  139.         mv /mnt/data/IMG/* /media/${OSNAME}

  140.         cat >/media/${OSNAME}/etc/fstab<<EOF
  141. LABEL=os_${OSNAME} / ext4 defaults,noatime 0 0
  142. LABEL=boot /boot ext4 defaults 0 2
  143. tmpfs /tmp tmpfs defaults,nosuid 0 0
  144. EOF
  145.         cat >>/media/boot/extlinux/extlinux.conf<<EOF
  146. LABEL ${TITLENAME}
  147.     LINUX /os/${OSNAME}/Image
  148.     INITRD /os/${OSNAME}/uInitrd
  149.     FDT /dtb/rockchip/rk3328-beikeyun-1296mhz.dtb
  150.     APPEND root=LABEL=os_${OSNAME} rootflags=data=writeback rw console=uart8250,mmio32,0xff130000 console=tty0 no_console_suspend consoleblank=0 fsck.fix=yes fsck.repair=yes net.ifnames=0

  151. EOF

  152.         # 引导内核
  153.         mkdir -p /media/boot/os/${OSNAME}
  154.         \mv -f /media/${OSNAME}/boot/{config*,Image,initrd.img*,System*,uInitrd*,vmlinuz*} /media/boot/os/${OSNAME}
  155.         rm -rf /media/${OSNAME}/boot/*

  156.         # 切换菜单
  157.         sed -i "/^Please/ i \  ${q}、${TITLENAME}" $OSSWITCH
  158.         cat >>$OSTEMP<<EOF
  159.     ${q})
  160.         sed -i "/DEFAULT/ c DEFAULT ${TITLENAME}" /boot/extlinux/extlinux.conf
  161.         shutdown -r now
  162.         ;;
  163. EOF
  164.         ln -sf /boot/extlinux/qhos.sh /media/${OSNAME}/usr/local/bin/qhos
  165.         q=$(($q+1))

  166.         # 镜像清理
  167.         sync
  168.         sleep 2
  169.         umount -f /mnt/data/IMG
  170.         umount -f /media/${OSNAME}
  171.         rmdir /media/${OSNAME}
  172.         [ $? -ne 0 ] && echo -e "\n卸载镜像失败,再次构建失败" && break && exit 1
  173.         losetup -d ${IMGDEV}p1
  174.         rm -f $IMGNAME
  175.         p=$(($p+1))
  176.     done

  177.     # 默认启动
  178.     DEFAULTMENU="$(cat /media/boot/extlinux/extlinux.conf|head -1|cut -d " " -f2)"
  179.     sed -i "1i DEFAULT $DEFAULTMENU" /media/boot/extlinux/extlinux.conf

  180.     # 补全菜单
  181.     sed -i "/^case/ r $OSTEMP" $OSSWITCH

  182.     # 清理文件
  183.     umount /media/boot
  184.     rmdir /media/boot

  185. echo -e "
  186. ##############################最终构建状态####################################"

  187. T2=$(date +%T)
  188. T3=$(($(date -d $T2 +%s)-$(date -d $T1 +%s)))
  189. T4="$(($T3/3600)):$(($T3%3600/60)):$(($T3%3600%60))"

  190. echo -e "
  191.   开始时间: "$(date -d $T1 "+%Y-%m-%d %H:%M:%S")"
  192.   结束时间: "$(date "+%Y-%m-%d %H:%M:%S")"
  193.   总计耗时: $T4

  194. ##############################最终构建状态####################################\n"
  195. }

  196. # 分区数据
  197. partdata() {
  198. echo -en "\n分区数据说明:
  199.     因最后分区为空闲分区划分,故配置参数时需少配置一个
  200.     前面256M为引导分区,各分区皆可根据实际需要自行配置
  201.     因采用mbr主分区,故最多支持4个主分区,引导分区会占用一个
  202.     想支持更多,请采用gpt分区或3主分区+1扩展分区+N逻辑分区
  203.     32G分4个分区输入: 256M 8G 8G
  204.     16G分4个分区输入: 256M 5G 5G
  205.     16G分3个分区输入: 256M 8G
  206.      8G分2个分区输入: 256M
  207. 请输入分区数据: "

  208. read "PARTDATA"
  209. echo ""
  210. }

  211. echo -en "
  212. 本脚本简单说明:
  213.     因各shell环境不一定一致,故本脚本不可能在任意系统上运行,即脚本完全兼容性差
  214.     即centos7运行成功,centos8不一定完全运行成功,运行失败,请将代码分条执行即可
  215.     本脚本支持单系统构建和多系统构建
  216.     本脚本仅支持镜像为单分区的构建,即不含单独引导分区或家目录或缓存分区等

  217. 系统构建菜单:
  218.     1、存储磁盘分区
  219.     2、系统磁盘分区
  220.     3、单多系统构建
  221. 请选择: "

  222. read -n 1 -t 20 NUM
  223. echo ""

  224. case $NUM in
  225.     1)
  226.         storage_disk
  227.         ;;
  228.     2)
  229.         partdata
  230.         system_disk $PARTDATA
  231.         ;;
  232.     3)
  233.         multios
  234.         ;;
  235.     *)
  236.         exit 0
  237. esac
复制代码

2、存储磁盘分区
# 将多系统构建脚本放入/root目录
2.1 安装7z工具
  1. yum install -y epel-release
  2. yum install -y p7zip
复制代码

2.2 贝壳云centos系统启动后先插入第一个磁盘做数据磁盘,然后执行命令选择1
  1. bash buildmultios.sh
复制代码
storagedisk.png

2.3 存储磁盘格式化后,通过shell工具将镜像压缩包和boot.7z引导文件传入指定目录/mnt/data
# 上传方法,最终结果为下方tree命令的文件内容
uploadfile.png

  1. [root@XXX ~]# tree /mnt/data
  2. /mnt/data
  3. ├── Armbian_21.02.3_Rock64_buster_current_5.10.21.img.xz
  4. ├── Armbian_21.02.3_Rock64_focal_current_5.10.21.img.xz
  5. ├── boot.7z
  6. └── centos_aarch64.img.xz

  7. 0 directories, 4 files
复制代码

3、系统磁盘分区
# 接着再插入第二个磁盘作为系统磁盘,然后执行命令选择2,并根据提示输入分区参数
# 磁盘分区除第一个引导分区boot外,其余分区数量必须和所上传的镜像数一致,否则脚本报错退出
# 如3个镜像需四个分区(含boot分区),而分区参数为3个,因为最后一个分区以剩余空闲空间划分
  1. bash buildmultios.sh
复制代码
systemdisk.png

4、单多系统构建
# 执行命令后选选择3,即可执行,构建时间取决镜像大小、镜像数量、以及磁盘读写速度
# 如果脚本执行报错,请根据提示解决,构建失败时建议根据脚本内容分步执行
  1. bash buildmultios.sh
复制代码

5、关闭系统
# 关闭系统后拔掉存储磁盘,重启即可进入默认系统,默认系统是什么系统取决于镜像压缩包间的默认排序
# centos用户密码:  root | 123456
# armbian用户密码:root | 1234
  1. shutdown -h now
复制代码

6、系统切换
# 输入命令后根据提示即可,切换脚本通用debian ubuntu centos系统
  1. qhos
复制代码
qhos.png


十二、最终运行效果图
#                  CentOS                                             Debian                                               Ubuntu
centos.png     debian.png     ubuntu.png


# 以下为centos开启samba后的上传下载图,速度80m/s,armbian的上传下载图见贝壳云改2G内存,写100m/s,读取60m/s

上传图

上传图
   

下载图

下载图


十三、 最终结语

             构建
                    network007
然水无常形,系统无常态;
祝构建成功,方运行成功。

centos.7z.zip

256.17 KB, 下载次数: 15

centos构建主脚本

buildmultios.zip

250.93 KB, 下载次数: 5

多系统构建

评分

参与人数 3恩山币 +4 收起 理由
lzzdyyy + 1 优秀教程,感谢lz
SkyTiger + 1 感谢你的分享,无论怎样,你都是最无私的人!来,说说,你E盘上还有啥一起给我吧!
sunjun1989 + 2 来来来,有什么伤心的事说出来让大家开心一下。

查看全部评分

我的恩山、我的无线 The best wifi forum is right here.
发表于 2021-8-24 09:01 | 显示全部楼层
牛逼,不过我还是喜欢ubuntu
我的恩山、我的无线 The best wifi forum is right here.
发表于 2021-9-15 05:52 | 显示全部楼层
可以直接刷到内置硬盘上吗

点评

不是emmc哦,我指的是内接的那个盘位  详情 回复 发表于 2021-9-15 14:59
当然可以,上面有写入EMMC教程  发表于 2021-9-15 14:19
我的恩山、我的无线 The best wifi forum is right here.
发表于 2021-9-15 14:59 | 显示全部楼层
苏夏 发表于 2021-9-15 05:52
可以直接刷到内置硬盘上吗

不是emmc哦,我指的是内接的那个盘位

点评

只要引导能驱动就没问题,不过贝壳云没有直接的sata硬盘接口,你说的是我家云、粒子云还是其它?  详情 回复 发表于 2021-9-15 15:38
我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2021-9-15 15:38 | 显示全部楼层
苏夏 发表于 2021-9-15 14:59
不是emmc哦,我指的是内接的那个盘位

只要引导能驱动就没问题,不过贝壳云没有直接的sata硬盘接口,你说的是我家云、粒子云还是其它?

点评

我家云,,话说这个方案出来,不止是centos,其他各种arm系统都可以装咯?  详情 回复 发表于 2021-9-15 16:42
我的恩山、我的无线 The best wifi forum is right here.
发表于 2021-9-15 16:42 | 显示全部楼层
network007 发表于 2021-9-15 15:38
只要引导能驱动就没问题,不过贝壳云没有直接的sata硬盘接口,你说的是我家云、粒子云还是其它?

我家云,,话说这个方案出来,不止是centos,其他各种arm系统都可以装咯?

点评

教程是通用于arm32 | arm64 但你得搞定uboot引导,否则是无法启动的,难点就是引导  发表于 2021-9-15 16:50
我的恩山、我的无线 The best wifi forum is right here.
发表于 2021-9-16 17:16 | 显示全部楼层
还可以多系统,厉害了啊,,有在ubuntu下用得脚本吗
我的恩山、我的无线 The best wifi forum is right here.
发表于 2021-9-17 09:13 | 显示全部楼层
可以用emmc配置引导分区,这样就支持内置硬盘和USB3也可以运行系统了

点评

不熟悉时不建议用emmc分区做引导,一旦配置失败,系统可能无法开机。因为引导分区任意磁盘都可做,当然前提是系统驱动支持  详情 回复 发表于 2021-9-17 19:14
我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2021-9-17 19:14 | 显示全部楼层
苏夏 发表于 2021-9-17 09:13
可以用emmc配置引导分区,这样就支持内置硬盘和USB3也可以运行系统了

不熟悉时不建议用emmc分区做引导,一旦配置失败,系统可能无法开机。因为引导分区任意磁盘都可做,当然前提是系统驱动支持
我的恩山、我的无线 The best wifi forum is right here.
发表于 2021-9-17 23:21 | 显示全部楼层
所以现在比较稳的方法就是插个U盘做引导么,,
话说,内核替换那块,extlinux.conf是怎么弄的呢,,F大的貌似是ext4格式的armbianEnv.txt,/boot目录长的不一样也

点评

1、你熟悉后可直接把EMMC分个boot分区做引导,不熟悉就用你的磁盘分个boot分区做引导,磁盘即是引导盘也是系统盘 2、多系统中的extlinux.conf和切换菜单由脚本自动构建,根据你选择的系统不一样,内容就不一样 3、  详情 回复 发表于 2021-9-18 13:10
我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2021-9-18 13:10 | 显示全部楼层
本帖最后由 network007 于 2021-9-18 13:21 编辑
苏夏 发表于 2021-9-17 23:21
所以现在比较稳的方法就是插个U盘做引导么,,
话说,内核替换那块,extlinux.conf是怎么弄的呢,,F大的 ...

1、你熟悉后可直接把EMMC分个boot分区做引导,不熟悉就用你的磁盘分个boot分区做引导,磁盘即是引导盘也是系统盘
2、多系统中的extlinux.conf和切换菜单由脚本自动构建,根据你选择的系统不一样,内容就不一样
3、对于系统你主要提取的文件为内核文件,uInitrd和Image或vmlinuz等,其余不需要,提取完后就可清空/boot目录
4、不过本教程有个缺陷就是armbian系列初次登陆时会调整分区导致最后的分区会分区表出错
5、解决方法为构建完系统后fdisk -l记录分区表主要是最后一个位置,然后去登录所有armbian系统初始化后,再恢复错误的分区表即可解决
6、当然也可先对armbian系统进行处理,处理完后再构建系统,不过不熟悉还是建议用恢复分区表方法7、不过这个脚本可能在你设备上不好用,因为你多个默认磁盘,直接执行命令可能会出错,需要自己指定存储盘目录和系统盘目录,然后注释掉判断磁盘的命令即可,不过都复杂
8、建议你构建系统时,先拔掉SATA硬盘,然后再按照教程构建,插入磁盘后用lsblk命令查看设备号,默认存储磁盘为/dev/sda,第二个磁盘为/dev/sdb,磁盘一定不能同时插入,否则可能格式化报错

点评

启动分区配置不好呀,可以分享一个镜像吗?  详情 回复 发表于 2021-9-25 17:49
我的恩山、我的无线 The best wifi forum is right here.
发表于 2021-9-23 12:00 | 显示全部楼层
感谢楼主分享。
我的恩山、我的无线 The best wifi forum is right here.
发表于 2021-9-25 17:49 | 显示全部楼层
network007 发表于 2021-9-18 13:10
1、你熟悉后可直接把EMMC分个boot分区做引导,不熟悉就用你的磁盘分个boot分区做引导,磁盘即是引导盘也 ...

启动分区配置不好呀,可以分享一个镜像吗?
我的恩山、我的无线 The best wifi forum is right here.
发表于 2021-9-25 23:13 | 显示全部楼层
牛!!!反正我看不懂!!!
我的恩山、我的无线 The best wifi forum is right here.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )|网站地图

GMT+8, 2021-9-27 15:58

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表