summaryrefslogtreecommitdiffstats
path: root/server/build_core
blob: 411036dfa6a59c2e8a7313d963d3aefb732b36dd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#!/bin/bash
# Copyright (c) 2012 - OpenSLX GmbH
#
# This program is free software distributed under the GPL version 2.
# See http://openslx.org/COPYING
#
# If you have any feedback please consult http://openslx.org/feedback and
# send your feedback to feedback@openslx.org
#
# General information about OpenSLX can be found at http://openslx.org
#
# Server side script to generate stage3.1,2 initial ramfses for OpenSLX Linux
# stateless clients
#############################################################################

# first parameter is a hash pointing to the target directory
# /srv/openslx/build

# in the future the prefix should be set via slxsettings ...

MODULE_DIR=${ROOT_DIR}/server

STAGE31_STATIC_DIR=${ROOT_DIR}/data/stage3.1
STAGE31_DIR=${MODULE_DIR}/stage3.1
STAGE32_DIR=${ROOT_DIR}/remote/stage3.2

# initial checks
initial_checks() {
	local TOOL_STR="$TOOL_STR initial_checks:"
	[ -d "${STAGE32_DIR}" ] || perror "No stage3.2 directory found. Please run './mltk tools build' first."

	[ -e "${STAGE32_DIR}/openslx/bin/busybox" ] || perror "Busybox not found, run './mltk tools build busybox' first."

	# shouldn't squashfs-tools be automatically installed as we need them nevertheless!?
	# what if it is already on the machine? faster to check with which than the apt-get check?
	[ -z $(which mksquashfs) ] && perror "mksquashfs not found, please install squashfs-tools first."

	#check for kernel modules, if not present copy from system
	if [ ! -d "${STAGE32_DIR}/lib/modules" ];
	then
		pinfo "Couldn't find kernel modules in stage3.2."
		pinfo "Copying modules for kernel $(uname -r)..."
		mkdir -p "${STAGE32_DIR}/lib/modules" || perror "Cannot create '${STAGE32_DIR}/lib/modules'"
		cp -r "/lib/modules/$(uname -r)" "${STAGE32_DIR}/lib/modules/" || perror "Cannot copy kernel modules from '/lib/modules/$(uname -r)' '${STAGE32_DIR}/lib/modules/'"
	else
		pinfo "Not copying kernel modules from system, as '${STAGE32_DIR}/lib/modules/' already exists."
	fi

	# TODO: check for aufs and squaskfs modules
}

generate_rootfs() {
	local TOOL_STR="$TOOL_STR generate_rootfs:"

	# produce stage3.1
	mkdir -p "${STAGE31_DIR}" || perror "Cannot create stage3.1 dir '${STAGE31_DIR}'"

	# create basic directory structure
	mkdir -p "${STAGE31_DIR}"/{bin,dev,proc,run,etc,mnt,sys} || perror "Cannot create basic directory structure in '${STAGE31_DIR}'"

	# copy device files from running system
	cp -a /dev/{console,kmsg,mem,null,tty,tty0,tty1,tty9,urandom,zero} \
		"${STAGE31_DIR}"/dev || perror "Cannot copy devices from running system"

	# copy busybox, its libs and static data to stage3.1
	cp -r "${STAGE32_DIR}"/openslx/* "${STAGE31_STATIC_DIR}"/* "${STAGE31_DIR}" || perror "Copying busybox, its libs and static data failed."

	# fix for aufs & squashfs modules needed for stage 3.1
	mkdir -p "${STAGE31_DIR}/lib/modules.0/" || perror "Creating modules.0 dir for aufs & squashfs in stage 3.1 failed."
	cp "/lib/modules/$(uname -r)/kernel/fs/squashfs/squashfs.ko" "${STAGE31_DIR}/lib/modules.0/" || perror "Copying squashfs.ko failed."
	cp "/lib/modules/$(uname -r)/kernel/ubuntu/aufs/aufs.ko" "${STAGE31_DIR}/lib/modules.0/" || perror "Copying aufs.ko failed."

	# fetch the libraries needed for busybox
	BASICLIBS=""
	for i in $(ldd "${STAGE31_DIR}/bin/busybox");
	do
		if [ $(echo $i | grep '^/' | grep -c ld) -eq 1 \
		-o  $(echo $i | grep '^/' | grep -c libc.so) -eq 1 ];
        	then
	                BASICLIBS="$BASICLIBS $i $(readlink -f "$i")"
        	fi	
	done
	tarcopy "$BASICLIBS" "${STAGE31_DIR}"
}

generate_squashfs() {
	local TOOL_STR="$TOOL_STR generate_squashfs:"
	# finalize the initramfs target
	[ -e "${STAGE31_DIR}/mnt/openslx.sqfs" ] && rm "${STAGE31_DIR}/mnt/openslx.sqfs"

	mksquashfs "${STAGE32_DIR}" "${STAGE31_DIR}/mnt/openslx.sqfs" -comp xz -b 1M -no-recovery >&6 || perror "mksquashfs failed ($?)."

}

generate_initramfs() {
	local TOOL_STR="$TOOL_STR generate_initramfs:"
	cd "${STAGE31_DIR}" || perror "Cannot cd to '${STAGE31_DIR}'"
	find . | cpio --format="newc" --create | gzip -9 > "${MODULE_DIR}/initramfs"
	local PS=(${PIPESTATUS[*]})
	[ "x${PS[0]}" != "x0" ] && perror "'find .' in '$(pwd)' failed."
	[ "x${PS[1]}" != "x0" ] && perror "cpio create failed."
	[ "x${PS[2]}" != "x0" ] && perror "gzip to '${MODULE_DIR}/initramfs' failed."
	cd -
	pinfo "initramfs created at ${MODULE_DIR}/initramfs"
}

generate_stage31() {
	initial_checks
	generate_rootfs
	generate_squashfs
	generate_initramfs

	# TODO better kernel copy
	cp "/boot/vmlinuz-$(uname -r)" "${MODULE_DIR}/kernel" || perror "Cannot copy kernel from '/boot/vmlinuz-$(uname -r)' to '${MODULE_DIR}/kernel'"
	pinfo "kernel $(uname -r) copied to ${MODULE_DIR}/kernel"
}

clean_core() {
	local TOOL_STR="$TOOL_STR clean_core:"
	pinfo "Cleaning '${STAGE31_DIR}'..."
	[ -d ${STAGE31_DIR} ] && { rm -rf ${STAGE31_DIR} || perror "rm -rf failed."; }
	pinfo "Cleaning '${MODULE_DIR}/initramfs'..."
	[ -e ${MODULE_DIR}/initramfs ] && { rm ${MODULE_DIR}/initramfs || perror "rm failed."; }
}