diff mbox series

[OpenWrt-Devel,2/2] gemini: Generate harddisk image for DNS-313

Message ID 20190215160223.19734-1-linus.walleij@linaro.org
State Accepted, archived
Delegated to: Christian Lamparter
Headers show
Series [OpenWrt-Devel,1/2] firmware-tools/ptgen: Allow generation 0 size partitions | expand

Commit Message

Linus Walleij Feb. 15, 2019, 4:02 p.m. UTC
This makes OpenWrt build an Ext2+Ext4 partitioned image
for the D-Link DNS-313 with two blank partitions, a boot
partition on /dev/sda3 and a rootfs partition on
/dev/sda4.

This uses the methods already used in apm821xx including
the tricks to convert the generated Ext2 filesystem
partition to version 1 so that the firmware bootloader
will properly recognize it.

We patch a bit around the build files to make sure we
get the rootfs size set and that genext2fs is properly
built.

Tested on the D-Link DNS-313.

Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
[Fixing and tricksing]
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
 config/Config-images.in                       |  2 +-
 target/linux/gemini/Makefile                  |  2 +-
 target/linux/gemini/image/Makefile            | 27 ++++++++++++++----
 .../linux/gemini/image/dns313_gen_hdd_img.sh  | 28 +++++++++++++++++++
 tools/Makefile                                |  2 +-
 5 files changed, 52 insertions(+), 9 deletions(-)
 create mode 100755 target/linux/gemini/image/dns313_gen_hdd_img.sh

Comments

Christian Lamparter Feb. 17, 2019, 4:22 p.m. UTC | #1
On Friday, February 15, 2019 5:02:23 PM CET Linus Walleij wrote:
> This makes OpenWrt build an Ext2+Ext4 partitioned image
> for the D-Link DNS-313 with two blank partitions, a boot
> partition on /dev/sda3 and a rootfs partition on
> /dev/sda4.
> 
> This uses the methods already used in apm821xx including
> the tricks to convert the generated Ext2 filesystem
> partition to version 1 so that the firmware bootloader
> will properly recognize it.
> 
> We patch a bit around the build files to make sure we
> get the rootfs size set and that genext2fs is properly
> built.
> 
> Tested on the D-Link DNS-313.
> 
> Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
> [Fixing and tricksing]
> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
> ---
>  config/Config-images.in                       |  2 +-
>  target/linux/gemini/Makefile                  |  2 +-
>  target/linux/gemini/image/Makefile            | 27 ++++++++++++++----
>  .../linux/gemini/image/dns313_gen_hdd_img.sh  | 28 +++++++++++++++++++
>  tools/Makefile                                |  2 +-
>  5 files changed, 52 insertions(+), 9 deletions(-)
>  create mode 100755 target/linux/gemini/image/dns313_gen_hdd_img.sh
> 
> diff --git a/config/Config-images.in b/config/Config-images.in
> index bdd24ef6178c..b9cc929f0f95 100644
> --- a/config/Config-images.in
> +++ b/config/Config-images.in
> @@ -275,7 +275,7 @@ menu "Target Images"
>  
>  	config TARGET_ROOTFS_PARTSIZE
>  		int "Root filesystem partition size (in MB)"
> -		depends on GRUB_IMAGES || USES_ROOTFS_PART || TARGET_ROOTFS_EXT4FS || TARGET_mvebu || TARGET_omap || TARGET_rb532 || TARGET_sunxi || TARGET_uml
> +		depends on GRUB_IMAGES || USES_ROOTFS_PART || TARGET_ROOTFS_EXT4FS || TARGET_mvebu || TARGET_omap || TARGET_rb532 || TARGET_sunxi || TARGET_uml || TARGET_gemini
(see below)
>  		default 256
>  		help
>  		  Select the root filesystem partition size.
> diff --git a/target/linux/gemini/Makefile b/target/linux/gemini/Makefile
> index 7c573c7c6d09..e232937bb9eb 100644
> --- a/target/linux/gemini/Makefile
> +++ b/target/linux/gemini/Makefile
> @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
>  ARCH:=arm
>  BOARD:=gemini
>  BOARDNAME:=Cortina Systems CS351x
> -FEATURES:=squashfs pci rtc usb dt gpio display
> +FEATURES:=squashfs pci rtc usb dt gpio display ext4 root-part boot-part
Oops, that should have been "rootfs-part". Specifying rootfs-part will select
the USES_ROOTFS_PART symbol, which in turn makes the change (TARGET_gemini) 
in Config-images.in unnecessary.

>  CPU_TYPE:=fa526
>  MAINTAINER:=Roman Yeryomin <roman@advem.lv>
>  
> diff --git a/target/linux/gemini/image/Makefile b/target/linux/gemini/image/Makefile
> index a612cf706d63..493f14cbf416 100644
> --- a/target/linux/gemini/image/Makefile
> +++ b/target/linux/gemini/image/Makefile
> @@ -123,8 +136,10 @@ define Device/dlink_dns-313
>  	DEVICE_TITLE := D-Link DNS-313 1-Bay Network Storage Enclosure
>  	DEVICE_DTS := gemini-dlink-dns-313
>  	DEVICE_PACKAGES := $(GEMINI_NAS_PACKAGES)
> -	IMAGES := bootpart.tar.gz
> -	IMAGE/bootpart.tar.gz := dns313-images
> +	BLOCKSIZE := 1k 
> +	FILESYSTEMS := ext4 squashfs
squashfs images would be nice. They are prefered because they support features
like better/safer Failsafe Mode and Factory Reset, which are not available for
the ext4 images as they need the "read-only" property that squashfs provides.

Though, the squashfs images on block-like devices (hdd/ssd/mmc) are trickier, 
because they need f2fs (kernel + userspace) + loopdev support in order to
work properly. (Without these, the squashfs image will boot, but it will
always lose the configuration on reboot because all the volatile files are
just stored on a emergency ramdisk fallback).

That's why I added the changes to the config-4.14 and config-4.19 and added
the f2fs tools. I put them into this separate patch on my staging area:

https://git.openwrt.org/?p=openwrt/staging/chunkeey.git;a=commit;h=1626b5ca1d963e70a979fc4e6262149208608d46

if these work out, please let me know.

> +	IMAGES := factory.bin.gz
> +	IMAGE/factory.bin.gz := dns313-images | gzip
>  endef
>  TARGET_DEVICES += dlink_dns-313
>  

Cheers,
Christian
Linus Walleij Feb. 17, 2019, 8:51 p.m. UTC | #2
On Sun, Feb 17, 2019 at 5:22 PM Christian Lamparter <chunkeey@gmail.com> wrote:

> > +     FILESYSTEMS := ext4 squashfs
>
> squashfs images would be nice. They are prefered because they support features
> like better/safer Failsafe Mode and Factory Reset, which are not available for
> the ext4 images as they need the "read-only" property that squashfs provides.
>
> Though, the squashfs images on block-like devices (hdd/ssd/mmc) are trickier,
> because they need f2fs (kernel + userspace) + loopdev support in order to
> work properly. (Without these, the squashfs image will boot, but it will
> always lose the configuration on reboot because all the volatile files are
> just stored on a emergency ramdisk fallback).

So I figure if I just put a file in /etc/config/foo.txt or so and it remains
after a reboot it is fine.

> That's why I added the changes to the config-4.14 and config-4.19 and added
> the f2fs tools. I put them into this separate patch on my staging area:
>
> https://git.openwrt.org/?p=openwrt/staging/chunkeey.git;a=commit;h=1626b5ca1d963e70a979fc4e6262149208608d46
>
> if these work out, please let me know.

I'll git it a spin, now that I understand what you want to achieve!

Yours,
Linus Walleij
diff mbox series

Patch

diff --git a/config/Config-images.in b/config/Config-images.in
index bdd24ef6178c..b9cc929f0f95 100644
--- a/config/Config-images.in
+++ b/config/Config-images.in
@@ -275,7 +275,7 @@  menu "Target Images"
 
 	config TARGET_ROOTFS_PARTSIZE
 		int "Root filesystem partition size (in MB)"
-		depends on GRUB_IMAGES || USES_ROOTFS_PART || TARGET_ROOTFS_EXT4FS || TARGET_mvebu || TARGET_omap || TARGET_rb532 || TARGET_sunxi || TARGET_uml
+		depends on GRUB_IMAGES || USES_ROOTFS_PART || TARGET_ROOTFS_EXT4FS || TARGET_mvebu || TARGET_omap || TARGET_rb532 || TARGET_sunxi || TARGET_uml || TARGET_gemini
 		default 256
 		help
 		  Select the root filesystem partition size.
diff --git a/target/linux/gemini/Makefile b/target/linux/gemini/Makefile
index 7c573c7c6d09..e232937bb9eb 100644
--- a/target/linux/gemini/Makefile
+++ b/target/linux/gemini/Makefile
@@ -9,7 +9,7 @@  include $(TOPDIR)/rules.mk
 ARCH:=arm
 BOARD:=gemini
 BOARDNAME:=Cortina Systems CS351x
-FEATURES:=squashfs pci rtc usb dt gpio display
+FEATURES:=squashfs pci rtc usb dt gpio display ext4 root-part boot-part
 CPU_TYPE:=fa526
 MAINTAINER:=Roman Yeryomin <roman@advem.lv>
 
diff --git a/target/linux/gemini/image/Makefile b/target/linux/gemini/image/Makefile
index a612cf706d63..493f14cbf416 100644
--- a/target/linux/gemini/image/Makefile
+++ b/target/linux/gemini/image/Makefile
@@ -28,6 +28,7 @@  endef
 # the only real content.
 define Build/dns313-images
 	mkdir -p $@.tmp/.boot
+	chmod 755 $@.tmp/.boot
 
 	echo "dummy" > $@.tmp/dummyfile
 
@@ -38,9 +39,20 @@  define Build/dns313-images
 	dns313-header $(IMAGE_KERNEL) \
 		$@.tmp/.boot/zImage
 
-	tar --sort=name --owner=0 --group=0 --numeric-owner -czf $@ \
-		-C $@.tmp .boot \
-		$(if $(SOURCE_DATE_EPOCH),--mtime="@$(SOURCE_DATE_EPOCH)")
+	rm $@.tmp/dummyfile
+
+	genext2fs --block-size $(BLOCKSIZE:%k=%Ki) \
+		--size-in-blocks $$((1024 * $(CONFIG_TARGET_KERNEL_PARTSIZE))) \
+		--squash-uids \
+		--root $@.tmp $@.tmp-boot
+
+	# The device firmware needs revision 1 of EXT2
+	$(STAGING_DIR_HOST)/bin/tune2fs -O filetype $@.tmp-boot
+	$(STAGING_DIR_HOST)/bin/e2fsck -pDf $@.tmp-boot > /dev/null
+
+	./dns313_gen_hdd_img.sh $@ $@.tmp-boot $(IMAGE_ROOTFS) \
+		$(CONFIG_TARGET_KERNEL_PARTSIZE) \
+		$(CONFIG_TARGET_ROOTFS_PARTSIZE)
 
 	rm -rf $@.tmp
 endef
@@ -106,7 +118,8 @@  GEMINI_NAS_PACKAGES:=kmod-md-mod kmod-md-linear kmod-md-multipath \
 		kmod-fs-btrfs kmod-fs-cifs kmod-fs-nfs \
 		kmod-fs-nfsd kmod-fs-ntfs kmod-fs-reiserfs kmod-fs-vfat \
 		kmod-nls-utf8 kmod-usb-storage-extras \
-		samba36-server mdadm cfdisk fdisk e2fsprogs badblocks
+		samba36-server mdadm cfdisk fdisk e2fsprogs badblocks \
+		partx-utils
 
 define Device/dlink_dir-685
 	DEVICE_TITLE := D-Link DIR-685 Xtreme N Storage Router
@@ -123,8 +136,10 @@  define Device/dlink_dns-313
 	DEVICE_TITLE := D-Link DNS-313 1-Bay Network Storage Enclosure
 	DEVICE_DTS := gemini-dlink-dns-313
 	DEVICE_PACKAGES := $(GEMINI_NAS_PACKAGES)
-	IMAGES := bootpart.tar.gz
-	IMAGE/bootpart.tar.gz := dns313-images
+	BLOCKSIZE := 1k
+	FILESYSTEMS := ext4 squashfs
+	IMAGES := factory.bin.gz
+	IMAGE/factory.bin.gz := dns313-images | gzip
 endef
 TARGET_DEVICES += dlink_dns-313
 
diff --git a/target/linux/gemini/image/dns313_gen_hdd_img.sh b/target/linux/gemini/image/dns313_gen_hdd_img.sh
new file mode 100755
index 000000000000..1eb2c7c57599
--- /dev/null
+++ b/target/linux/gemini/image/dns313_gen_hdd_img.sh
@@ -0,0 +1,28 @@ 
+#!/usr/bin/env bash
+
+set -x
+[ $# -eq 5 ] || {
+	echo "SYNTAX: $0 <file> <bootfs image> <rootfs image> <bootfs size> <rootfs size>"
+	exit 1
+}
+
+OUTPUT="$1"
+BOOTFS="$2"
+ROOTFS="$3"
+BOOTFSSIZE="$4"
+ROOTFSSIZE="$5"
+
+head=4
+sect=63
+
+# Create two empty partitions followed by the boot partition with
+# the ./boot/zImage and then the rootfs partition.
+set `ptgen -o $OUTPUT -h $head -s $sect -t 83 -n -p 0 -p 0 -p ${BOOTFSSIZE}M -p ${ROOTFSSIZE}M`
+
+BOOTOFFSET="$(($1 / 512))"
+BOOTSIZE="$(($2 / 512))"
+ROOTFSOFFSET="$(($3 / 512))"
+ROOTFSSIZE="$(($4 / 512))"
+
+dd bs=512 if="$BOOTFS" of="$OUTPUT" seek="$BOOTOFFSET" conv=notrunc
+dd bs=512 if="$ROOTFS" of="$OUTPUT" seek="$ROOTFSOFFSET" conv=notrunc
diff --git a/tools/Makefile b/tools/Makefile
index cacba5bcb467..0123a759c826 100644
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -37,7 +37,7 @@  tools-y += lzma squashfs4 zip
 tools-$(BUILD_B43_TOOLS) += b43-tools
 tools-$(BUILD_ISL) += isl
 tools-$(CONFIG_USE_SPARSE) += sparse
-tools-$(CONFIG_TARGET_apm821xx) += genext2fs
+tools-$(CONFIG_TARGET_apm821xx)$(CONFIG_TARGET_gemini) += genext2fs
 
 # builddir dependencies
 $(curdir)/bison/compile := $(curdir)/flex/compile