Browse Source

new experimental package gentooinstall

Waldemar Brodkorb 6 years ago
parent
commit
33a9c4a0f9
2 changed files with 218 additions and 0 deletions
  1. 29 0
      package/gentooinstall/Makefile
  2. 189 0
      package/gentooinstall/src/gentooinstall

+ 29 - 0
package/gentooinstall/Makefile

@@ -0,0 +1,29 @@
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+
+include ${ADK_TOPDIR}/rules.mk
+
+PKG_NAME:=		gentooinstall
+PKG_VERSION:=		1.0
+PKG_RELEASE:=		1
+PKG_DESCR:=		gentoo disk installer
+PKG_SECTION:=		base/adk
+PKG_DEPENDS:=		mke2fs parted sfdisk dosfstools mksh
+PKG_DEPENDS+=		grub grub-tools
+PKG_KDEPENDS:=		ext4-fs
+
+NO_DISTFILES:=		1
+
+include ${ADK_TOPDIR}/mk/package.mk
+
+$(eval $(call PKG_template,GENTOOINSTALL,gentooinstall,${PKG_VERSION}-${PKG_RELEASE},${PKG_DEPENDS},${PKG_DESCR},${PKG_SECTION}))
+
+CONFIG_STYLE:=		manual
+BUILD_STYLE:=		manual
+INSTALL_STYLE:=		manual
+
+fwinstall-install:
+	$(INSTALL_DIR) $(IDIR_GENTOOINSTALL)/usr/sbin
+	$(INSTALL_BIN) $(WRKBUILD)/fwinstall $(IDIR_GENTOOINSTALL)/usr/sbin
+
+include ${ADK_TOPDIR}/mk/pkg-bottom.mk

+ 189 - 0
package/gentooinstall/src/gentooinstall

@@ -0,0 +1,189 @@
+#!/bin/mksh
+# This file is part of the OpenADK project.
+# install Gentoo to a block/flash device
+
+if [ $(id -u) -ne 0 ]; then
+  print installation is only possible as root
+  exit 1
+fi
+
+# get architecture
+arch=$(uname -m)
+# get adk target system
+target=$(cat /etc/.adktarget)
+if [ -z $target ]; then
+  print autodetection of target failed
+  exit 1
+fi
+
+function help {
+	cat >&2 <<EOF
+Syntax: gentooinstall <archive> <device> <hostname>
+EOF
+	exit 1
+}
+
+if [ -z $1 ]; then
+  print no archive given
+  help 
+fi
+
+if [ -z $2 ]; then
+  print no device given
+  help 
+fi
+
+if [ -z $3 ]; then
+  print no hostname given
+  help 
+fi
+
+archive=$1
+device=$2
+hostname=$3
+swapsize=2048000
+fs=ext4
+tools="parted partprobe sfdisk mkfs.ext2"
+
+f=0
+for tool in $tools;do
+  if ! which $tool >/dev/null; then
+    echo "checking if $tool is installed... failed"
+    f=1
+  fi
+done
+if [ $f -eq 1 ]; then 
+  exit 1
+fi
+
+# create empty partition table
+function create_label {
+  print "creating empty partition table"
+  parted -s $1 mklabel msdos > /dev/null 2>&1
+  if [ $? -ne 0 ]; then
+    echo "creating empty partition failed!"
+    exit 1
+  fi
+}
+
+# get max size of disk in sectors
+function get_max_size {
+  maxsize=$(env LC_ALL=C parted $1 -s unit s print |awk '/^Disk/ { print $3 }'|sed -e 's/s//')
+  rootsize=$(($maxsize-$cfgfssize))
+  print device has $maxsize sectors. using $rootsize for root.
+}
+
+# create partition, with fstype start and end in sectors
+function create_partition {
+  print creating partition on $1
+  parted -s $1 unit s mkpart primary $2 $3 $4 > /dev/null 2>&1
+  if [ $? -ne 0 ]; then
+    echo "creating primary partition failed!"
+    exit 1
+  fi
+}
+
+function set_boot_flag {
+  print setting bootflag on $1 partition $2
+  parted -s $1 set $2 boot on > /dev/null 2>&1
+  if [ $? -ne 0 ]; then
+    echo "setting bootflag failed!"
+    exit 1
+  fi
+}
+
+function change_part_type {
+  print setting partition type on $1 partition $2 to $3
+  sfdisk --change-id $1 $2 $3 >/dev/null 2>&1
+  if [ $? -ne 0 ]; then
+    echo "changing partition type failed!"
+    exit 1
+  fi
+}
+
+function create_filesystem {
+  print creating filesystem $2 on $1 partition $3
+  mkfs.ext2 -j -F -q ${1}${3} >/dev/null 2>&1
+  if [ $? -ne 0 ]; then
+    echo "creating filesystem on partition failed!"
+    exit 1
+  fi
+}
+
+function mount_fs {
+  print mounting ${1}${2} to $4 with filesystem $3
+  mount -t $3 ${1}${2} $4
+  if [ $? -ne 0 ]; then
+    echo "mounting filesystem failed!"
+    exit 1
+  fi
+}
+
+function extract_archive {
+  print extracting archive $1 onto $2
+  tar -C $2 -xpf $1
+  if [ $? -ne 0 ]; then
+    echo "archive extraction failed!"
+    exit 1
+  fi
+}
+
+function create_chroot_installer {
+(
+  emerge-websync
+  emerge rsyslog
+  rc-update add sshd default
+  emerge grub:2
+  print grub-mkconfig > /boot/grub/grub.cfg
+  print Installing Grub into /dev/sda
+  print grub-install /dev/sda
+) >/mnt/install
+  chmod 755 /mnt/install
+}
+
+function chroot_install {
+  print Installing Gentoo
+  mount -t proc proc /mnt/proc
+  mount -t sysfs sys /mnt/sys
+  mount -o bind /dev /mnt/dev
+  mkdir /mnt/dev/shm
+  mount -t tmpfs tmpfs /mnt/dev/shm
+  chroot /mnt /install
+  if [ $? -ne 0 ]; then
+    echo "Gentoo installation failed!"
+    exit 1
+  fi
+}
+
+function fix_perm {
+  print fixing permissions
+  chmod 1777 ${1}/tmp
+}
+
+case $arch {
+  (x86|x86_64)
+    get_max_size $device
+    create_label $device
+    create_partition $device swap 0 $swapsize
+    create_partition $device ext2 $(($swapsize+1)) $(($maxsize-1))
+    set_boot_flag $device 1
+    change_part_type $device 1 82
+    partprobe $device
+    sync
+    create_filesystem $device $fs 1
+    [[ -x /sbin/mdev ]] && mdev -s
+    mount_fs $device 1 $fs /mnt
+    extract_archive $archive /mnt
+    create_chroot_installer
+    chroot_install /mnt
+    print "/dev/sda2	/	ext4	defaults	0	1" > /mnt/etc/fstab
+    print hostname=\"$hostname\" > /mnt/etc/conf.d/hostname
+    fix_perm /mnt
+    umount /mnt/dev/shm
+    umount /mnt/{proc,dev,sys}
+    umount /mnt
+    ;;
+}
+
+echo "Successfully installed Gentoo on $target."
+exit 0