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() {
if [ ! -d ${STAGE32_DIR} ];
then
echo "No stage3.2 directory found. Please run \"./mltk tools build\" first."
exit 1
fi
if [ ! -e ${STAGE32_DIR}/openslx/bin/busybox ];
then
echo "Busybox not found, run 'setup_tools busybox' first."
exit 1
fi
# 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?
if [ -z $(which mksquashfs) ];
then
echo "mksquashfs not found, please install squashfs-tools first."
exit 1
fi
#check for kernel modules, if not present copy from system
if [ ! -d ${STAGE32_DIR}/lib/modules ];
then
echo "Couldn't find kernel modules in stage3.2."
echo "Copying modules for kernel $(uname -r)..."
mkdir -p ${STAGE32_DIR}/lib/modules
cp -r /lib/modules/$(uname -r) ${STAGE32_DIR}/lib/modules/
fi
# TODO: check for aufs and squaskfs modules
}
generate_rootfs() {
# produce stage3.1
[ ! -d ${STAGE31_DIR} ] && mkdir -p ${STAGE31_DIR}
# create basic directory structure
mkdir -p ${STAGE31_DIR}/{bin,dev,proc,run,lib/modules,etc,mnt,sys}
# copy device files from running system
cp -a /dev/{console,kmsg,mem,null,tty,tty0,tty1,tty9,urandom,zero} \
${STAGE31_DIR}/dev
# copy busybox, its libs and static data to stage3.1
cp -r ${STAGE32_DIR}/openslx/* ${STAGE31_STATIC_DIR}/* ${STAGE31_DIR}
# fix for aufs & squashfs modules needed for stage 3.1
cp /lib/modules/$(uname -r)/kernel/fs/squashfs/squashfs.ko ${STAGE31_DIR}/lib/modules/
cp /lib/modules/$(uname -r)/kernel/ubuntu/aufs/aufs.ko ${STAGE31_DIR}/lib/modules/
# 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
(tar cpv $BASICLIBS | tar xpv -C ${STAGE31_DIR}) &>/dev/null
}
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 2>/dev/null
}
generate_initramfs() {
cd ${STAGE31_DIR}
find . | cpio --format="newc" --create | gzip -9 > ${MODULE_DIR}/initramfs
cd - &>/dev/null
}
generate_stage31() {
initial_checks
generate_rootfs
generate_squashfs
generate_initramfs
# TODO better kernel copy
cp /boot/vmlinuz-$(uname -r) ${MODULE_DIR}/kernel
}
clean_core() {
echo -n "Cleaning ${STAGE31_DIR}..."
[ -d ${STAGE31_DIR} ] && rm -rf ${STAGE31_DIR}
echo " done."
echo -n "Cleaning ${MODULE_DIR}/initramfs..."
[ -e ${MODULE_DIR}/initramfs ] && rm ${MODULE_DIR}/initramfs
echo " done."
}
|