Browse Source

use genext2fs on MacOS X to create qemu images

Waldemar Brodkorb 12 years ago
parent
commit
2636f0ed7b
8 changed files with 140 additions and 58 deletions
  1. 1 0
      mk/rootfs.mk
  2. 91 57
      scripts/create-image.sh
  3. BIN
      scripts/mbr
  4. 9 0
      target/config/Config.in
  5. 6 0
      target/x86/Makefile
  6. 1 1
      tools/Makefile
  7. 25 0
      tools/genext2fs/Makefile
  8. 7 0
      tools/rules.mk

+ 1 - 0
mk/rootfs.mk

@@ -41,6 +41,7 @@ else
 USB:=		rootdelay=2
 endif
 
+$(eval $(call rootfs_template,genext2fs,GENEXT2FS,$(ROOTFS)))
 $(eval $(call rootfs_template,cf,CF,$(ROOTFS)))
 $(eval $(call rootfs_template,mmc,MMC,$(ROOTFS)))
 $(eval $(call rootfs_template,usb,USB,$(USB)))

+ 91 - 57
scripts/create-image.sh

@@ -1,4 +1,26 @@
 #!/usr/bin/env bash
+#-
+# Copyright © 2010-2012
+#	Waldemar Brodkorb <wbx@openadk.org>
+#
+# Provided that these terms and disclaimer and all copyright notices
+# are retained or reproduced in an accompanying document, permission
+# is granted to deal in this work without restriction, including un‐
+# limited rights to use, publicly perform, distribute, sell, modify,
+# merge, give away, or sublicence.
+#
+# This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to
+# the utmost extent permitted by applicable law, neither express nor
+# implied; without malicious intent or gross negligence. In no event
+# may a licensor, author or contributor be held liable for indirect,
+# direct, other damage, loss, or other issues arising in any way out
+# of dealing in the work, even if advised of the possibility of such
+# damage or existence of a defect, except proven that it results out
+# of said person’s immediate fault when using the work as intended.
+#
+# Alternatively, this work may be distributed under the terms of the
+# General Public License, any version, as published by the Free Soft-
+# ware Foundation.
 
 filesystem=ext2
 
@@ -24,35 +46,32 @@ if [ $(id -u) -ne 0 ];then
 	exit 1
 fi
 
-printf "Checking if mkfs is installed"
-mkfs=$(which mkfs.$filesystem)
-
-if [ ! -z $mkfs -a -x $mkfs ];then
-	printf "...okay\n"
-else
-	printf "...failed\n"
+tools='qemu-img'
+ostype=$(uname -s)
+
+case $ostype in
+(Darwin)
+	tools="$tools genext2fs"
+	;;
+(Linux)
+	tools="$tools mke2fs parted"
+	;;
+(*)
+	printf Sorry, not ported to the OS "'$ostype'" yet.\n
 	exit 1
-fi
-
-printf "Checking if parted is installed"
-parted=$(which parted)
-
-if [ ! -z $parted -a -x $parted ];then
-	printf "...okay\n"
-else
-	printf "...failed\n"
-	exit 1
-fi
-
-printf "Checking if qemu-img is installed"
-qimg=$(which qemu-img)
-
-if [ ! -z $qimg -a -x $qimg ];then
-	printf "...okay\n"
-else
-	printf "...failed\n"
-	exit 1
-fi
+	;;
+esac
+
+for tool in $tools; do
+	printf "Checking if $tool is installed..."
+	if which $tool >/dev/null; then
+		printf " okay\n"
+	else
+		printf " failed\n"
+		f=1
+	fi
+done
+(( f )) && exit 1
 
 if [ -z $1 ];then
 	printf "Please give the name of the image file\n"
@@ -71,44 +90,53 @@ else
 	fi
 fi
 
-
 printf "Generate qemu image (512 MB)\n"
-$qimg create -f raw $1 512M >/dev/null
-
-printf "Creating filesystem $filesystem\n"
+qemu-img create -f raw $1 512M >/dev/null
 
 printf "Create partition and filesystem\n"
-$parted -s $1 mklabel msdos
-$parted -s $1 -- mkpart primary ext2 0 -0
-$parted -s $1 set 1 boot on
+case $ostype in
+(Darwin)
+	offset=16384
+	;;
+(Linux)
+	parted -s $1 mklabel msdos
+	parted -s $1 -- mkpart primary ext2 0 -0
+	parted -s $1 set 1 boot on
+	offset=$(parted $1 unit b print | tail -2 | head -1 | cut -f 1 --delimit="B" | cut -c 9-)
+	;;
+(*)
+	printf Sorry, not ported to the OS "'$ostype'" yet.\n
+	exit 1
+	;;
+esac
 
-offset=$(parted $1 unit b print | tail -2 | head -1 | cut -f 1 --delimit="B" | cut -c 9-)
 
-dd if=$1 of=mbr bs=$offset count=1 2>/dev/null
-dd if=$1 skip=$offset of=$1.new 2>/dev/null
+printf "Creating filesystem $filesystem\n"
 
 if [ "$filesystem" = "ext2" -o "$filesystem" = "ext3" -o "$filesystem" = "ext4" ];then
 	mkfsopts=-F
 fi
 
-mkfs.$filesystem $mkfsopts ${1}.new >/dev/null
-
-if [ $? -eq 0 ];then
-	printf "Successfully created partition\n"
-	#$parted $1 print
-else
-	printf "Partition creation failed, Exiting.\n"
-	exit 1
-fi
-
-cat mbr ${1}.new > $1
-rm ${1}.new 
-rm mbr
-
-tmp=$(mktemp -d)
-
-mount -o loop,offset=$offset -t $filesystem $1 $tmp
-
+case $ostype in
+(Darwin)
+	tmp=$(mktemp -d -t xxx)
+	tar -C $tmp -xzpf $2 
+	printf "Fixing permissions\n"
+	chmod 1777 $tmp/tmp
+	chmod 4755 $tmp/bin/busybox
+	genext2fs -b 409600 -d $tmp ${1}.new
+	cat scripts/mbr ${1}.new > $1
+	rm ${1}.new 
+	;;
+(Linux)
+	dd if=$1 of=mbr bs=$offset count=1 2>/dev/null
+	dd if=$1 skip=$offset of=$1.new 2>/dev/null
+	mkfs.$filesystem $mkfsopts ${1}.new >/dev/null
+	cat mbr ${1}.new > $1
+	rm ${1}.new 
+	rm mbr
+	tmp=$(mktemp -d)
+	mount -o loop,offset=$offset -t $filesystem $1 $tmp
 if [ -z $initramfs ];then
 	printf "Extracting install archive\n"
 	tar -C $tmp -xzpf $2 
@@ -121,8 +149,14 @@ else
 	cp $2-kernel $tmp/boot/kernel
 	cp $2-initramfs $tmp/boot/initramfs
 fi
+	umount $tmp
+	;;
+(*)
+	printf Sorry, not ported to the OS "'$ostype'" yet.\n
+	exit 1
+	;;
+esac
 
-umount $tmp
 printf "Successfully installed.\n"
 printf "Be sure $1 is writable for the user which use qemu\n"
 exit 0

BIN
scripts/mbr


+ 9 - 0
target/config/Config.in

@@ -589,6 +589,15 @@ config ADK_TARGET_ROOTFS_CF
 	  Use this option if you have a compact flash based system.
 	  (ext2 filesystem is used.)
 
+config ADK_TARGET_ROOTFS_GENEXT2FS
+	bool "read-write filesystem for compact flash (genext2fs version)"
+	depends on ADK_TARGET_WITH_CF
+	select ADK_KERNEL_EXT2_FS
+	select ADK_KERNEL_SCSI
+	help
+	  Use this option if you have a compact flash based system.
+	  (ext2 filesystem is used.)
+
 config ADK_TARGET_ROOTFS_MMC
 	bool "read-write filesystem for mmc/sdcard"
 	depends on ADK_TARGET_WITH_MMC

+ 6 - 0
target/x86/Makefile

@@ -9,6 +9,12 @@ include $(TOPDIR)/mk/image.mk
 
 KERNEL:=$(LINUX_DIR)/arch/x86/boot/bzImage
 
+ifeq ($(ADK_TARGET_FS),genext2fs)
+imageinstall: $(BIN_DIR)/$(ROOTFSTARBALL)
+	@echo "The RootFS tarball is: $(BIN_DIR)/$(ROOTFSTARBALL)"
+	@echo "To install everything to CompactFlash use scripts/genext2.sh"
+endif
+
 ifeq ($(ADK_TARGET_FS),cf)
 imageinstall: $(BIN_DIR)/$(ROOTFSTARBALL)
 	@echo "The RootFS tarball is: $(BIN_DIR)/$(ROOTFSTARBALL)"

+ 1 - 1
tools/Makefile

@@ -3,7 +3,7 @@
 
 include $(TOPDIR)/rules.mk
 
-TARGETS:=adk mkcrypt cpio mkimage
+TARGETS:=adk mkcrypt cpio mkimage genext2fs
 
 TARGETS_INSTALL:=$(patsubst %,%-install,$(TARGETS))
 TARGETS_CLEAN:=$(patsubst %,%-clean,$(TARGETS))

+ 25 - 0
tools/genext2fs/Makefile

@@ -0,0 +1,25 @@
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=		genext2fs
+PKG_VERSION:=		1.4.1
+PKG_RELEASE:=		1
+PKG_MD5SUM:=		b7b6361bcce2cedff1ae437fadafe53b
+PKG_SITES:=		${MASTER_SITE_SOURCEFORGE:=genext2fs/}
+
+include ../rules.mk
+
+install: ${TOOLS_DIR}/genext2fs
+
+$(WRKBUILD)/.compiled: ${WRKDIST}/.prepared
+	(cd ${WRKBUILD}; ./configure)
+	${MAKE} -C ${WRKBUILD} CC='${CC_FOR_BUILD}'
+	touch $@
+
+${TOOLS_DIR}/genext2fs: $(WRKBUILD)/.compiled
+	$(INSTALL_BIN) $(WRKBUILD)/genext2fs \
+		${TOOLS_DIR}
+
+include $(TOPDIR)/mk/tools.mk

+ 7 - 0
tools/rules.mk

@@ -0,0 +1,7 @@
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+
+WRKDIR_BASE=    ${TOOLS_BUILD_DIR}
+WRKDIR=		${WRKDIR_BASE}
+
+include ${TOPDIR}/mk/buildhlp.mk