改造安卓+Linux双启动,默认自动进入Linux,包含配置mini系统和ubuntu系统rootFS根系统。可以挂载移动硬盘,安装SMB实现windows共享。

分析存储设备信息

当前磁盘挂载和占用
root@raspberrypi:/home/pi# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/root 9.8G 3.1G 6.4G 33% /
devtmpfs 272M 0 272M 0% /dev
tmpfs 492M 0 492M 0% /dev/shm
tmpfs 492M 6.6M 485M 2% /run
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 492M 0 492M 0% /sys/fs/cgroup
/dev/mmcblk1p1 253M 51M 202M 21% /boot
tmpfs 99M 0 99M 0% /run/user/1000
/dev/sda1 7.5G 7.0M 7.5G 1% /media/pi/A0CF-2D25

查看分区
root@raspberrypi:/home/pi# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 1 7.5G 0 disk
└─sda1 8:1 1 7.5G 0 part /media/pi/A0CF-2D25
mmcblk0 179:0 0 7.3G 0 disk
mmcblk0boot0 179:8 0 4M 1 disk
mmcblk0boot1 179:16 0 4M 1 disk
mmcblk0rpmb 179:24 0 4M 0 disk
mmcblk1 179:32 0 119.3G 0 disk
├─mmcblk1p1 179:33 0 256M 0 part /boot
└─mmcblk1p2 179:34 0 119G 0 part /
root@raspberrypi:/home/pi#

blkid看不到内置eMMC分区
root@raspberrypi:/home/pi# blkid
/dev/mmcblk1p1: LABEL_FATBOOT=“boot” LABEL=“boot” UUID=“70A2-8001” TYPE=“vfat” PARTUUID=“ca9addd8-01”
/dev/mmcblk1p2: LABEL=“rootfs” UUID=“a1fafd2b-1ef0-4fe8-8ac1-ad33bbb48642” TYPE=“ext4” PARTUUID=“ca9addd8-02”
/dev/sda1: UUID=“A0CF-2D25” TYPE=“vfat” PARTUUID=“69b367ce-01”
/dev/mmcblk1: PTUUID=“ca9addd8” PTTYPE=“dos”

gdisk无法识别eMMC分区
root@raspberrypi:/home/pi# gdisk -l /dev/mmcblk0
mmcblk0 mmcblk0boot0 mmcblk0boot1 mmcblk0rpmb
root@raspberrypi:/home/pi# gdisk -l /dev/mmcblk0
GPT fdisk (gdisk) version 1.0.3

Partition table scan:
MBR: not present
BSD: not present
APM: not present
GPT: not present

Creating new GPT entries.
Disk /dev/mmcblk0: 15269888 sectors, 7.3 GiB
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): 127F9EA0-231B-4D73-BC03-515D4A2DF1D7
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 15269854
Partitions will be aligned on 2048-sector boundaries
Total free space is 15269821 sectors (7.3 GiB)

Number Start (sector) End (sector) Size Code Name
root@raspberrypi:/home/pi# ls /dev/mmc*
/dev/mmcblk0 /dev/mmcblk0boot1 /dev/mmcblk1 /dev/mmcblk1p2
/dev/mmcblk0boot0 /dev/mmcblk0rpmb /dev/mmcblk1p1
root@raspberrypi:/home/pi#

拷贝fastboot下的分区信息
factory_bootargs=mem=1G console=ttyAMA0,115200 root=/dev/mmcblk0p16 rootfstype=ext3 rootwait blkdevparts=mmcblk0:1M(fastboot),1M(bootargs),10M(recovery),2M(deviceinfo),8M(baseparam),8M(pqparam),20M(logo),20M(logobak),10M(loaderdb),40M(fastplay),40M(fastplaybak),40M(kernel),20M(misc),1M(stbid),10M(fackernel),70M(facrootbox),8M(userapi),8M(hibdrv),8M(qbflag),300M(qbdata),600M(cache),1024M(system),50M(keydata),-(userdata)

方案分析

由于内置eMMC查询 不到分区信息,如果要把linux安装到eMMC,就只能按照扇区直接写入,可能破坏原有的数据。
fastboot只能读取usb口,不能读取SD卡,所以只能把根文件系统放到u盘,SD卡就不用了。
小结:内置eMMC保持安卓启动,U盘启动Linux。

改造U盘

U盘分为2个区,boot分区为fat32保存内核;ext3分区保存根文件系统。
备份U盘的内核
root@raspberrypi:~# cp /media/pi/A0CF-2D25/hi_kernel.bin .
分区
fdisk /dev/sda
输入m查看帮助,p查看分区
d删除分区
Command (m for help): d
Selected partition 1
Partition 1 has been deleted.

n创建分区,指定100MB
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p):

Using default response p.
Partition number (1-4, default 1):
First sector (2048-15728639, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-15728639, default 15728639): +100M

Created a new partition 1 of type ‘Linux’ and of size 100 MiB.
Partition #1 contains a vfat signature.

Do you want to remove the signature? [Y]es/[N]o: y

The signature will be removed by a write command.

创建另外一个分区,使用剩余的全部空间
Command (m for help): n
Partition type
p primary (1 primary, 0 extended, 3 free)
e extended (container for logical partitions)
Select (default p):

Using default response p.
Partition number (2-4, default 2):
First sector (206848-15728639, default 206848):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (206848-15728639, default 15728639):

Created a new partition 2 of type ‘Linux’ and of size 7.4 GiB.

Command (m for help): p
Disk /dev/sda: 7.5 GiB, 8053063680 bytes, 15728640 sectors
Disk model:
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x69b367ce

Device Boot Start End Sectors Size Id Type
/dev/sda1 2048 206847 204800 100M 83 Linux
/dev/sda2 206848 15728639 15521792 7.4G 83 Linux

Filesystem/RAID signature on partition 1 will be wiped.

w保存分区表
Command (m for help): w
The partition table has been altered.
Syncing disks.

root@raspberrypi:~#

格式化
忘了卸载
root@raspberrypi:~# mkfs.vfat /dev/sda1
mkfs.fat 4.1 (2017-01-24)
mkfs.vfat: /dev/sda1 contains a mounted filesystem.
root@raspberrypi:~# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/root 9.8G 3.1G 6.4G 33% /
devtmpfs 272M 0 272M 0% /dev
tmpfs 492M 0 492M 0% /dev/shm
tmpfs 492M 6.7M 485M 2% /run
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 492M 0 492M 0% /sys/fs/cgroup
/dev/mmcblk1p1 253M 51M 202M 21% /boot
tmpfs 99M 0 99M 0% /run/user/1000
/dev/sda1 7.5G 7.0M 7.5G 1% /media/pi/A0CF-2D25
root@raspberrypi:~# umount /media/pi/A0CF-2D25
root@raspberrypi:~#
root@raspberrypi:~# fdisk -l /dev/sda
Disk /dev/sda: 7.5 GiB, 8053063680 bytes, 15728640 sectors
Disk model:
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x69b367ce

Device Boot Start End Sectors Size Id Type
/dev/sda1 2048 206847 204800 100M 83 Linux
/dev/sda2 206848 15728639 15521792 7.4G 83 Linux
root@raspberrypi:~# mkfs.vfat /dev/sda1
mkfs.fat 4.1 (2017-01-24)
格式化之后分区类型并未改变。几秒就完成

ext3的格式化大概花了2-3分钟。
root@raspberrypi:~# mkfs.ext3 /dev/sda2
mke2fs 1.44.5 (15-Dec-2018)
Creating filesystem with 1940224 4k blocks and 485760 inodes
Filesystem UUID: 53577d11-f7d5-45df-aebe-52c4418e07aa
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks):
done
Writing superblocks and filesystem accounting information: done

root@raspberrypi:~#
在windows下可以识别fat分区,写入文件正常。
重新插入机顶盒,自动识别并挂载,df查看挂载点
root@raspberrypi:~# df
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/root 10258552 3161032 6629604 33% /
devtmpfs 277800 0 277800 0% /dev
tmpfs 503336 0 503336 0% /dev/shm
tmpfs 503336 6760 496576 2% /run
tmpfs 5120 0 5120 0% /run/lock
tmpfs 503336 0 503336 0% /sys/fs/cgroup
/dev/mmcblk1p1 258095 52146 205949 21% /boot
tmpfs 100664 0 100664 0% /run/user/1000
/dev/sda2 7573368 17120 7168204 1% /media/pi/53577d11-f7d5-45df-aebe-52c4418e07aa
/dev/sda1 102182 1312 100870 2% /media/pi/B151-7A19
拷贝我之前用busybox制作的1.3M的根文件系统,只是找不到之前的内核文件了。
root@raspberrypi:/media/pi/53577d11-f7d5-45df-aebe-52c4418e07aa# tar -zxvf /media/pi/B151-7A19/armroot.tar.gz
root@raspberrypi:/media/pi/53577d11-f7d5-45df-aebe-52c4418e07aa# mv armroot/* .
root@raspberrypi:/media/pi/53577d11-f7d5-45df-aebe-52c4418e07aa# rmdir armroot
root@raspberrypi:/media/pi/53577d11-f7d5-45df-aebe-52c4418e07aa# ls
bin dev etc linuxrc lost+found proc sbin sys tmp usr
恢复内核文件

设置自启动

剩下的工作就是修改、保存fastboot的环境变量
reboot进入fastboot模式
printenv查看环境变量
fastboot# printenv bootcmd
bootcmd=mmc read 0 0x1FFBFC0 0x50000 0x5000; bootm 0x1FFBFC0
fastboot# printenv bootargs
bootargs=console=ttyAMA0,115200 blkdevparts=mmcblk0:1M(fastboot),1M(bootargs),10M(recovery),2M(deviceinfo),8M(baseparam),8M(pqparam),20M(logo),20M(logobak),10M(loaderdb),40M(fastplay),40M(fastplaybak),40M(kernel),20M(misc),1M(stbid),10M(fackernel),70M(facrootbox),8M(userapi),8M(hibdrv),8M(qbflag),300M(qbdata),600M(cache),1024M(system),50M(keydata),-(userdata) androidboot.serialno=005404FF0018143000010019F0E21CC6 androidboot.deviceid=111018410000046 androidboot.serialno=005404FF0018143000010019F0E21CC6 androidboot.deviceid=111018410000046 androidboot.serialno=005404FF0018143000010019F0E21CC6 androidboot.deviceid=111018410000046
fastboot#
备份
setenv bootcmd_bak ‘mmc read 0 0x1FFBFC0 0x50000 0x5000; bootm 0x1FFBFC0’
setenv bootargs_bak ‘console=ttyAMA0,115200 blkdevparts=mmcblk0:1M(fastboot),1M(bootargs),10M(recovery),2M(deviceinfo),8M(baseparam),8M(pqparam),20M(logo),20M(logobak),10M(loaderdb),40M(fastplay),40M(fastplaybak),40M(kernel),20M(misc),1M(stbid),10M(fackernel),70M(facrootbox),8M(userapi),8M(hibdrv),8M(qbflag),300M(qbdata),600M(cache),1024M(system),50M(keydata),-(userdata) androidboot.serialno=005404FF0018143000010019F0E21CC6 androidboot.deviceid=111018410000046 androidboot.serialno=005404FF0018143000010019F0E21CC6 androidboot.deviceid=111018410000046 androidboot.serialno=005404FF0018143000010019F0E21CC6 androidboot.deviceid=111018410000046’
设置新的默认启动配置
setenv bootargs ‘console=ttyAMA0,115200 root=/dev/sda2 rootfstype=ext3 rootwait rw’
setenv bootcmd ‘usb start;fatload usb 0:1 0x1FFBFC0 hi_kernel.bin;bootm 0x1FFBFC0’
保存
saveenv
打印验证
printenv
拔出SD卡,重启
reset

自动启动到Linux正常
有个小错误,一直打印
—HDMI kernel event(no UserCallBack): HOTPLUG. —
scsi 0:0:0:0: Direct-Access 8.07 PQ: 0 ANSI: 4
sd 0:0:0:0: [sda] 15728640 512-byte logical blocks: (8.05 GB/7.50 GiB)
sd 0:0:0:0: [sda] Write Protect is off
sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn’t support DPO or FUA
sda: sda1 sda2
sd 0:0:0:0: [sda] Attached SCSI removable disk
kjournald starting. Commit interval 5 seconds
EXT3-fs (sda2): using internal journal
EXT3-fs (sda2): mounted filesystem with writeback data mode
VFS: Mounted root (ext3 filesystem) on device 8:2.
Freeing unused kernel memory: 508K (80e1e000 - 80e9d000)
can’t open /dev/tty2: No such file or directory

MiniRoot FileSystem is Ready …
can’t open /dev/tty2: No such file or directory
can’t open /dev/tty2: No such file or directory
can’t open /dev/tty2: No such file or directory
can’t open /dev/tty2: No such file or directory
random: nonblocking pool is initialized
can’t open /dev/tty2: No such file or directory

翻一下笔记:qemu模拟arm最小化文件系统测试记录
https://editor.csdn.net/md/?articleId=91347512

[root@(none) dev]# cat /proc/devices
Character devices:
1 mem
4 /dev/vc/0
4 tty
创建2个串口设备文件
mknod /dev/tty1 c 4 1
mknod /dev/tty2 c 4 2
重启还是报错

修改 /etc/inittab
tty2::askfirst:-/bin/sh 修改为
::askfirst:-/bin/sh
reboot正常
kjournald starting. Commit interval 5 seconds
EXT3-fs (sda2): using internal journal
EXT3-fs (sda2): mounted filesystem with writeback data mode
VFS: Mounted root (ext3 filesystem) on device 8:2.
Freeing unused kernel memory: 508K (80e1e000 - 80e9d000)

Please press Enter to activate this console.
random: nonblocking pool is initialized

MiniRoot FileSystem is Ready …
[root@(none) ~]#
查看内核
[root@(none) ~]# uname -rp
3.18.24_s40 unknown
top信息
Mem: 148628K used, 863804K free, 0K shrd, 172K buff, 1972K cached
CPU: 0.0% usr 0.0% sys 0.0% nic 100% idle 0.0% io 0.0% irq 0.0% sirq
Load average: 4.71 2.17 0.84 1/68 85
cat /proc/cpuinfo meminfo都正常

这个迷你系统可以自己扩展
为了方便,拷贝一个Ubuntu系统
把u盘插入pc机,挂载到虚拟机
root@ubuntu18:~# df -h
Filesystem Size Used Avail Use% Mounted on
udev 966M 0 966M 0% /dev
tmpfs 200M 748K 199M 1% /run
/dev/mapper/ubuntu–vg-ubuntu–lv 8.8G 5.0G 3.4G 60% /
tmpfs 997M 0 997M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 997M 0 997M 0% /sys/fs/cgroup
/dev/sda2 976M 77M 832M 9% /boot
/dev/loop0 315M 269M 19M 94% /media
tmpfs 200M 0 200M 0% /run/user/1000
root@ubuntu18:~# ls /mnt
root@ubuntu18:~# losetup
NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO LOG-SEC
/dev/loop0 0 0 1 0 /home/xy/ubuntu-16-04.img 0 512
root@ubuntu18:~# pwd
/home/xy
root@ubuntu18:~# mount /dev/sdb2 /mnt
root@ubuntu18:~# ls /mnt
bin dev etc linuxrc lost+found proc sbin sys tmp usr
root@ubuntu18:~# rm -rf /mnt/
rm: cannot remove ‘/mnt/’: Device or resource busy
root@ubuntu18:~# rm -rf /mnt/*
root@ubuntu18:~# cp -a /media/* /mnt/
root@ubuntu18:~# sync 这里一定要刷新缓存,否则拔掉u盘时会缺少文件。
出现3次 block 超过120秒的提示。
root@ubuntu18:~# umount /mnt

启动正常
Ubuntu 16.04 LTS ubuntu-zy ttyAMA0

ubuntu-zy login:
但是没有登录密码
通过下载时的介绍找到root密码1234
Ubuntu 16.04 LTS ubuntu-zy ttyAMA0

ubuntu-zy login: root
Password:
Last login: Sun Jun 16 01:42:37 CST 2019 on ttyAMA0
Welcome to Ubuntu 16.04 LTS (GNU/Linux 3.18.24_s40 armv7l)

  • Documentation: https://help.ubuntu.com/
    root@ubuntu-zy:~#
    root@ubuntu-zy:~# df -h
    Filesystem Size Used Avail Use% Mounted on
    /dev/root 7.3G 287M 6.6G 5% /
    devtmpfs 275M 0 275M 0% /dev
    tmpfs 495M 0 495M 0% /dev/shm
    tmpfs 495M 13M 482M 3% /run
    tmpfs 5.0M 0 5.0M 0% /run/lock
    tmpfs 495M 0 495M 0% /sys/fs/cgroup
    root@ubuntu-zy:~# uname -rp
    3.18.24_s40 armv7l
    root@ubuntu-zy:~#
    修改IP地址
    /etc/network/interfaces
    auto eth0
    iface eth0 inet static
    address 192.168.199.131
    gateway 192.168.199.1
    netmask 255.255.255.0
    配置路由
    /etc/resolv.conf
    nameserver 192.168.199.1
    重启网络
    root@ubuntu-zy:~# systemctl restart networking
    root@ubuntu-zy:~# ip ad
    地址加上了,但是ping域名失败,reboot后正常

apt更新正常
root@ubuntu-zy:~# apt update
Hit:1 http://mirrors.ustc.edu.cn/ubuntu-ports xenial InRelease
安装软件正常
root@ubuntu-zy:~# apt install telnet
串口登录很卡
ssh登录正常,看看服务
root@ubuntu-zy:~# systemctl status sshd
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2020-08-29 14:03:00 CST; 6min ago

再回去测试安卓启动

setenv bootargs ‘console=ttyAMA0,115200 blkdevparts=mmcblk0:1M(fastboot),1M(bootargs),10M(recovery),2M(deviceinfo),8M(baseparam),8M(pqparam),20M(logo),20M(logobak),10M(loaderdb),40M(fastplay),40M(fastplaybak),40M(kernel),20M(misc),1M(stbid),10M(fackernel),70M(facrootbox),8M(userapi),8M(hibdrv),8M(qbflag),300M(qbdata),600M(cache),1024M(system),50M(keydata),-(userdata) androidboot.serialno=005404FF0018143000010019F0E21CC6 androidboot.deviceid=111018410000046 androidboot.serialno=005404FF0018143000010019F0E21CC6 androidboot.deviceid=111018410000046 androidboot.serialno=005404FF0018143000010019F0E21CC6 androidboot.deviceid=111018410000046’
mmc read 0 0x1FFBFC0 0x50000 0x5000; bootm 0x1FFBFC0
启动正常。

挂载一个移动硬盘
启动时已正常识别
—HDMI kernel event(no UserCallBack): HOTPLUG. —
scsi 1:0:0:0: Direct-Access ATA ST500LM000-1EJ16 DEMC PQ: 0 ANSI: 6
sd 1:0:0:0: [sdb] 976773168 512-byte logical blocks: (500 GB/465 GiB)
sd 1:0:0:0: [sdb] Write Protect is off
sd 1:0:0:0: [sdb] Write cache: disabled, read cache: enabled, doesn’t support DPO or FUA
random: nonblocking pool is initialized
sdb: sdb1 sdb2 sdb3 < sdb5 sdb6 >
sd 1:0:0:0: [sdb] Attached SCSI disk
挂载ntfs分区正常,但是只读
root@ubuntu-zy:~# fdisk -l /dev/sdb
Disk /dev/sdb: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xebffb04d

Device Boot Start End Sectors Size Id Type
/dev/sdb1 * 2048 92279407 92277360 44G 83 Linux
/dev/sdb2 209717248 838862847 629145600 300G 7 HPFS/NTFS/exFAT
/dev/sdb3 838862848 976773119 137910272 65.8G f W95 Ext’d (LBA)
/dev/sdb5 838864896 847251455 8386560 4G 82 Linux swap / Solaris
/dev/sdb6 847253504 976752639 129499136 61.8G 83 Linux
root@ubuntu-zy:~# ls /mnt
root@ubuntu-zy:~# mount /dev/sdb2 /mnt
root@ubuntu-zy:/mnt/tmp# touch bb
touch: cannot touch ‘bb’: Read-only file system

配置DLNA共享

root@ubuntu-zy:~# apt install minidlna
Reading package lists… Done
Building dependency tree
Reading state information… Done
E: Unable to locate package minidlna
没有源,可能要自己编译了。
windows共享可以自动安装
源码: https://sourceforge.net/projects/minidlna/files/minidlna/1.2.1/minidlna-1.2.1.tar.gz/download

安装SMB实现windows共享

apt install samba
漫长等待,U盘糟糕,安装后
root@ubuntu-zy:/var/log# df -h /
Filesystem Size Used Avail Use% Mounted on
/dev/root 7.3G 590M 6.3G 9% /
配置文件末尾添加/etc/samba/smb.conf
[public]
comment = Public Storage
path = /home/ubuntu
read only = no
guest ok = yes
browseable = yes
配置后在win10可以直接访问\192.168.199.131,显示public目录,能写入文件
下面这个新增用户这里未使用,新增安全加强时备用
root@ubuntu-zy:~# smbpasswd -a ubuntu
New SMB password:
Retype new SMB password:
Added user ubuntu.

软件链接:https://download.csdn.net/download/weixin_43869959/12774894

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐