背景知识
NVIDIA Jetson Nano开发者套件自今年三月份发布以来正变得越来越火,它的AI和机器学习特性吸引了一众开发者,在业界掀起了一股不小的热潮。笔者把它当作一个便携式桌面电脑来使用,取代之前的树莓派3B。
略微有些遗憾的是,Jetson Nano出厂不带任何的存储媒介。板上也无SATA接口,官方提供的软件映像也是基于Micro-SD卡的。从可靠性,容量以及速度方面考量,大容量硬盘仍旧是我的首选。由于Jetson Nano带4个USB 3.0端口,这就为我们添置外接硬盘提供了可能。
网上已经有了很多介绍将rootfs安装到外置硬盘的文章,都是源自这里原始教程。这个方法的缺点是需要准备一张32GB或者以上容量的Micro-SD卡。将rootfs复制到外置硬盘之前,首先需要在Micro-SD卡的根文件系统上编译生成一个新的内核映像。这个新的内核映像带USB3.0支持(关于USB 3.0的讨论见此处)。
仅仅为了重新编译内核而占用一张32GB的Micro-SD卡?听起来似乎有点太小题大作。今天我们要讨论的是,如何直接将rootfs分区复制到外置硬盘上,跳过这个额外的从Micro-SD复制到外置硬盘的过程。
分割Image
首先让我们来看一看官方L4T r32.1发布的SD Image构造:
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print
Model: Generic- Multi-Card (scsi)
Disk /dev/sdb: 15.9GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
2 1049kB 1180kB 131kB TBC
3 2097kB 2556kB 459kB RP1
4 3146kB 3736kB 590kB EBT
5 4194kB 4260kB 65.5kB WB0
6 5243kB 5439kB 197kB BPF
7 6291kB 6881kB 590kB TOS
8 7340kB 7406kB 65.5kB EKS
9 8389kB 9044kB 655kB LNX
10 9437kB 9896kB 459kB DTB
11 10.5MB 10.6MB 131kB RP4
12 11.5MB 11.6MB 81.9kB BMP
1 12.6MB 15.9GB 15.9GB ext4 APP
(parted)
上表前面2至12,这11个分区是bootloader使用的。后面的1分区是rootfs,文件系统类型为ext4。我们的想法是把前面2-12分区留在Micro-SD卡上,而将ext4分区复制到外置硬盘。Jetson Nano上电启动时,先从Micro-SD卡上启动bootloader,然后再从外置硬盘安装根文件分区。启动完成以后,Micro-SD卡不再需要,可以从内核卸载它。
设想的Micro-SD卡image:
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
2 1049kB 1180kB 131kB TBC
3 2097kB 2556kB 459kB RP1
4 3146kB 3736kB 590kB EBT
5 4194kB 4260kB 65.5kB WB0
6 5243kB 5439kB 197kB BPF
7 6291kB 6881kB 590kB TOS
8 7340kB 7406kB 65.5kB EKS
9 8389kB 9044kB 655kB LNX
10 9437kB 9896kB 459kB DTB
11 10.5MB 10.6MB 131kB RP4
12 11.5MB 11.6MB 81.9kB BMP
1 12.6MB 100MB 87.4MB ext4 APP
(parted)
可以看到Micro-SD卡上的image大小只有120MB左右,可以安装到128MB的卡上。
注意:此时的Micro-SD卡上的image仍旧有一个ext4分区,只是它已经大大缩水,只有87MB。保留这个分区是因为bootloader在加载linux内核时,需要从这个分区读取两个文件:/boot/Image和/boot/extlinux/extlinux.conf。前者是linux内核映像(带USB3.0支持),后者是配置文件,告诉内核从何处加载rootfs。有关如何产生这两个文件,请参照此链接
设想的rootfs image:
Model: Linux File-Stor Gadget (scsi)
Disk /dev/sdb: 25.4GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 12.6MB 12.9GB 12.9GB ext4 APP
(parted)
安装
准备事项
- 一块NVIDIA Jetson Nano开发板
- 一块HDMI/DP显示屏
- 一个USB外置硬盘(容量>=16GB)
- 一张Micro-SD卡(容量>=128MB)
- USB键盘和鼠标
- 分割好的L4T r32.1 rootfs image part1 提取码:52s7 image part2 提取码:e5sf 和 bootloader image 提取码:fd3g
- 一台主机(Windows或者Linux或者Mac)
安装步骤
1. 将Micro-SD卡插入读卡器,并连到主机
2. 启动etcher,烧写bootloader image
3. 烧写完成以后,断开读卡器并取出Micro-SD卡
4. 插入外置USB硬盘
5. 再次启动etcher,烧写rootfs
压缩过的rootfs image有5GB之大,由于百度网盘对单个文件大小的限制,rootfs image文件被分成两个部分。下载下来以后请使用winrar软件将其合为一个文件,再将文件后缀修改为.zip。
6. 烧写完成以后断开USB外置硬盘
7. 将Micro-SD卡插入Jetson Nano
8. 将USB外置硬盘插入Jetson Nano
9. 将Jetson Nano连至HDMI/DP显示屏
10. 连接USB键盘和鼠标
11. Jetson Nano上电
12. 按照显示屏的提示,完成Ubuntu第一次启动配置
扩展根文件分区
L4T第一次启动,根文件分区缺省只有12GB。为了充分利用硬盘空间,我们需要扩展根文件分区。
1. 查看磁盘信息
本例中,根文件分区位于/dev/sda1
2. 采用sgdisk命令,查看根文件分区信息
记录下根文件分区的起始扇区,后面步骤要用到。
3. 同样sgdisk命令,通过“删除+重新创建”操作来扩展根文件分区
我们可以看到扩展以后,根文件分区占据了整个硬盘空间
注意!重新创建的根文件分区必须和之前的起始扇区相同,否则会丢失根文件分区的所有内容!
4. 通知内核,根文件分区已改动
5. 通知内核,文件系统已改动
完工!