nifengz

OpenWrt 安装以及扩展分区,磁盘扩容

2019-09-29

OpenWrt 安装以及扩展分区,磁盘扩容

为新家准备的组网方案买了一套四网口的x86软路由(4GB Memory+32G SSD),作为主路由。 打算写几篇来记录组网的过程。这篇文章是系列的第一篇,包含安装系统以及扩展分区。路由器是下面这个:

x86软路由

安装OpenWrt

OpenWrt镜像有两种获取方式,一种从源代编译,一种是直接下载Release的镜像。我们选择后者。在OpenWRT Releases页面下载我们需要的最新版,当前发布的最新版是18.06.4。我们选择64位的x86架构,打开后显示如下:

OpenWrt Download Page

上面的就是可选的img文件,下面的是OpenWrt的交叉编译工具和软件包,这里我们暂时用不到。我们选择上面的combined-ext4.img.gz下载后解压得到 openwrt-18.06.4-x86-64-combined-ext4.img,这个img是一个二进制文件,文件包含了OpenWrt分区,我们直接把这个分区烧录到硬盘,然后把硬盘插入路由器,直接上电就可以启动OpenWrt了,这里提供两个方法去烧录硬盘。

直接安装到路由器硬盘

如果路由器硬盘可以拆掉,并且可以安装到我们的PC(linux)上的话。就可以使用命令直接烧录,我的系统是ubuntu 18.04,下面是详细步骤:

插入路由器的硬盘到PC,然后查询硬盘信息:

sudo fdisk -l
# 显示如下信息
Disk /dev/nvme0n1: 477 GiB, 512110190592 bytes, 1000215216 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: gpt
Disk identifier: 5BEFF2E7-307C-460E-AB09-7070F5DEA034

Device           Start        End   Sectors   Size Type
/dev/nvme0n1p1    2048    1050623   1048576   512M EFI System
/dev/nvme0n1p2 1050624 1000214527 999163904 476.4G Linux filesystem


Disk /dev/sda: 28.7 GiB, 30752636928 bytes, 60063744 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

这里以我的举例,我的/dev/sda就是我路由器将来要使用的硬盘,下面直接烧录即可:

sudo dd if=/dev/sda of=openwrt-18.06.4-x86-64-combined-ext4.img bs=1M

烧录完成后把硬盘直接插入路由器,启动路由器,你就可以进入OpenWrt了,进入后需要先设置root密码:

passwd root
# 输入两遍root的密码即可

这就完成了系统安装。你以为这样就完了吗?So young, so simple. 我们进入OpenWrt,然后df -h查看硬盘挂载和使用情况:

df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/root               500.0M     21.1M    478.9M   4% /
tmpfs                     1.9G    592.0K      1.9G   0% /tmp
/dev/sda1                15.7M      3.2M     12.2M  21% /boot
/dev/sda1                15.7M      3.2M     12.2M  21% /boot
tmpfs                   512.0K         0    512.0K   0% /dev

尼玛,我32GB的SSD只用了500M,赶快google 下,官方这样解释:链接,意思就是OpenWrt默认挂载256M左右(根据选择的img不同)的rootfs,由于技术原因无法在线(已挂载)状态下调整分区的大小,所以有两种方法调整分区大小:

  1. 自己编译OpenWrt,然后在make menuconfig的时候,调TARGET_ROOTFS_PARTSIZE这个参数

  2. 把路由器硬盘插入PC 然后使用如下命令调整。

# 对sdb进行分区扩展
root@OpenWrt:~# sudo fdisk /dev/sdb
Welcome to fdisk (util-linux 2.32). 
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

# 输入 p 显示分区信息
Command (m for help): p
Disk /dev/sdb: 7.2 GiB, 7751073792 bytes, 15138816 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: 0xcbad8a62

Device     Boot Start    End Sectors  Size Id Type
/dev/sdb1  *      512  33279   32768   16M 83 Linux
/dev/sdb2       33792 558079  524288  256M 83 Linux
# 输入 d 删除 第二个分区,这里记录下第二个分区的起点是33792
Command (m for help): d
Partition number (1,2, default 2): 

Partition 2 has been deleted.
# 输入 n 创建新的分区
Command (m for help): n
Partition type
 p   primary (1 primary, 0 extended, 3 free)
 e   extended (container for logical partitions)
# 输入 p 确认是主分区
Select (default p): p
# 输入分区id 用默认的2
Partition number (2-4, default 2): 2
# 输入 分区起始位置(就是原来分区2起始的位置)
First sector (33280-15138815, default 34816): 33792
# 这里直接回车,默认选择终止位置就是硬盘的末尾
Last sector, +sectors or +size{K,M,G,T,P} (33792-15138815, default 15138815): 

Created a new partition 2 of type 'Linux' and of size 7.2 GiB.
Partition #2 contains a ext4 signature.

Do you want to remove the signature? [Y]es/[N]o: n
# 输入 w ,写入硬盘, 这里可能会有一个warning,忽略即可
Command (m for help): w

The partition table has been altered.
Syncing disks.

将硬盘插回到路由器,登录OpenWrt,恭喜你的rootfs已经扩容成功。

使用U盘安装

当路由器的硬盘无法插入到PC上时,只能采用U盘在路由器上直接来安装了,很不幸,我就是属于这种情况。这种情况下硬盘扩容就比较麻烦了,不过天无绝人之路,下面我们一步一步来:

还是使用openwrt-18.06.4-x86-64-combined-ext4.img这个镜像,因为无法在线扩容我们只有在这个镜像上做文章了,上面说了img是一个二进制文件,其实就是把分区直接做成了一个文件,我们直接扩展这个文件相当于扩展分区了,比如我我想扩展10GB的分区到rootfs可以这样做:

# 由于要扩展10GB count=1024 * 10
sudo dd if=/dev/zero bs=1M count=10240 >> openwrt-18.06.4-x86-64-combined-ext4.img

这样我们就得到一个10GB+的img文件,然后我们进行格式化操作。先把img虚拟为一个伪设备

# 显示可用的伪设备
losetup -f
/dev/loop19
#上面显示的路径是我们可以用的伪设备,然后
sudo losetup /dev/loop19 openwrt-18.06.4-x86-64-combined-ext4.img

接下来/dev/loop19就像普通硬盘一样了,然后我们使用fdisk进行分区:

sudo fdisk /dev/loop19

Welcome to fdisk (util-linux 2.31.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

# 输入p显示分区信息
Command (m for help): p
Disk /dev/loop19: 10.3 GiB, 11023155200 bytes, 21529600 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: 0xd1dbc8a6

Device        Boot Start    End Sectors  Size Id Type
/dev/loop19p1 *      512  33279   32768   16M 83 Linux
/dev/loop19p2      33792 558079  524288  256M 83 Linux

# 输入 d 删除分区,这里记录下第二个分区的开始位置是33792
Command (m for help): d
# 输入 2 删除第二个分区
Partition number (1,2, default 2): 2

Partition 2 has been deleted.

# 输入 n 新建分区 
Command (m for help): n
Partition type
p   primary (1 primary, 0 extended, 3 free)
e   extended (container for logical partitions)
# 输入 p 选择主分区
Select (default p): p
# 分区id 使用默认的
Partition number (2-4, default 2): 2
# 这里输入刚才记录的第二个分区的开始位置
First sector (33280-21529599, default 34816): 33792
# 这里直接回车
Last sector, +sectors or +size{K,M,G,T,P} (33792-21529599, default 21529599): 

Created a new partition 2 of type 'Linux' and of size 10.3 GiB.
Partition #2 contains a ext4 signature.

Do you want to remove the signature? [Y]es/[N]o: n
# 输入 w 写入硬盘
Command (m for help): w
# 忽略下面的报错信息
The partition table has been altered.
Calling ioctl() to re-read partition table.
Re-reading the partition table failed.: Invalid argument

The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8).

下面我们挂载这个虚拟磁盘:

sudo kpartx -a /dev/loop19

磁盘会被挂载到/dev/mapper/loop19p1/dev/mapper/loop19p2下,第二个分区就是 rootfs 了。用fsck对后者进行检查。

sudo fsck -f /dev/mapper/loop19p2
fsck from util-linux 2.31.1
e2fsck 1.44.1 (24-Mar-2018)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/mapper/loop19p2: 1231/16384 files (0.0% non-contiguous), 3677/65536 blocks

没毛病,那么我们就可以调整这个分区的大小:

sudo resize2fs /dev/mapper/loop19p2
resize2fs 1.44.1 (24-Mar-2018)
Resizing the filesystem on /dev/mapper/loop19p2 to 2686976 (4k) blocks.
The filesystem on /dev/mapper/loop19p2 is now 2686976 (4k) blocks long.

然后卸载设备,记得顺序的对应,就像出栈入栈一样:

sudo kpartx -d /dev/loop19
sudo losetup -d /dev/loop19

终于我们得到了img文件。然后还要解决烧录的问题,这里我借助了PE系统,找个足够大的U盘,安装一个WinPE,比如老毛桃啥的,安装到U盘。再去下载一个windows上可以用的img烧录工具,这里我推荐balenaEtcher,选择windows Portable的版本,下载下来也拷贝到U盘中。在路由器上插入U盘,开机后按F2(或者del,看机型),进入bios,选择从U盘启动,然后保存退出,进入PE后运行balenaEtcher,然后点右上角的设置打开非安全模式,否则你将无法选择系统硬盘。然后选则source为我们的img,dest为路由器的硬盘,然后Flash即可。

扫描二维码,分享此文章