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 |
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
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 --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