Skip to content

Commit 1391e25

Browse files
committed
Generate disk images
1 parent d434ef6 commit 1391e25

File tree

3 files changed

+136
-65
lines changed

3 files changed

+136
-65
lines changed

resources/sfdisk.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
$SIZE_MBR,$SIZE_BOOTFS,0C,*
2+
$START_USERSFS,,,

resources/syslinux.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@ LABEL NodeOS
77
SAY Booting NodeOS...
88
LINUX bzImage
99
INITRD initram.gz
10-
APPEND vga=0x318 ip=dhcp root=$USERSFS
10+
APPEND vga=0x318 ip=dhcp root=$USERSFS_UUID

scripts/build

Lines changed: 133 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ if [[ -z "$OUTPUT" ]]; then
5252
fi
5353

5454
if [[ "$USERSFS" ]]; then
55-
USERSFS=`blkid $USERSFS -o export | grep UUID`
55+
USERSFS_UUID=`blkid $USERSFS -o export | grep UUID`
5656
fi
5757

5858

@@ -63,7 +63,7 @@ source $TOOLCHAIN/scripts/adjustEnvVars.sh || exit $?
6363

6464
if [[ -d $OBJECTS ]]; then
6565
chmod -R u+w $OBJECTS &&
66-
rm -rf $OBJECTS || exit 10
66+
rm -rf $OBJECTS || exit 2
6767
fi
6868

6969

@@ -73,6 +73,7 @@ fi
7373

7474
EFIBOOT_DIR=$OBJECTS/efiboot
7575
EFIBOOT_IMG=$EFIBOOT_DIR.img
76+
DISK_DIR=$OBJECTS/disk
7677
IMG_DIR=$OBJECTS/img
7778
ISO_DIR=$OBJECTS/iso
7879

@@ -88,22 +89,46 @@ SRC_DIR=$__dirname/../deps/syslinux
8889
# Wrap the system up and pack it
8990
#
9091

92+
# Disk images are a composition of bootfs and usersfs
93+
function createDiskImage() {
94+
BOOTFS=$1
95+
96+
STEP_DIR=$DISK_DIR
97+
98+
# ToDo: sizes would need to be on cylinders and retain DOS compatibility
99+
# http://elinux.org/RPi_Advanced_Setup#Advanced_SD_card_setup
100+
101+
SIZE_MBR=$((2*1024)) # Reserve first megabyte for raspi. Is this needed?
102+
SIZE_BOOTFS=$(stat -L -c%s "$BOOTFS")
103+
SIZE_BOOTFS=$(($SIZE_BOOTFS/512))
104+
START_USERSFS=$(($SIZE_MBR+$SIZE_BOOTFS))
105+
106+
dd if=/dev/zero of=$OUTPUT count=$SIZE_MBR &&
107+
dd if=$BOOTFS of=$OUTPUT seek=$SIZE_MBR &&
108+
dd if=$USERSFS of=$OUTPUT seek=$START_USERSFS || exit 10
109+
110+
eval "echo \"$(<$__dirname/../resources/sfdisk.txt)\"" | \
111+
/sbin/sfdisk -uS --force $OUTPUT || exit 11
112+
}
113+
91114
function createPartitionImage() {
115+
BOOTFS=$1
116+
92117
# Copy kernel and initramfs on the partition image
93118

94119
cp $INITRAMFS $STEP_DIR/initram.gz || exit 20
95120

96121
# Create partition image
97122

98-
mkdir -p `dirname $OUTPUT` || exit 21
123+
mkdir -p `dirname $BOOTFS` || exit 21
99124

100125
# Size in KB
101126
# DISK_SIZE=`du -ks $STEP_DIR | cut -f1`
102127
DISK_SIZE=$((32*1024))
103128

104129
genfatfs -b $DISK_SIZE \
105130
--root $STEP_DIR \
106-
$OUTPUT || exit 22
131+
$BOOTFS || exit 22
107132
}
108133

109134
function createEfiImage() {
@@ -137,6 +162,8 @@ function createEfiImage() {
137162
}
138163

139164
function createIsoImage() {
165+
STEP_DIR=$ISO_DIR
166+
140167
mkdir -p $STEP_DIR || exit 40
141168

142169
eval "echo \"$(<$__dirname/../resources/syslinux.cfg)\"" \
@@ -178,108 +205,150 @@ function createIsoImage() {
178205
$SRC_DIR/bios/utils/isohybrid $OUTPUT || exit 47
179206
}
180207

208+
function createTar() {
209+
STEP_DIR=$OUTPUT
210+
211+
mkdir -p `dirname $STEP_DIR` || err 50
212+
213+
gunzip $BAREBONES -c | tar --delete init | gzip > $STEP_DIR &&
214+
cat $INITRAMFS >> $STEP_DIR || err 51
215+
}
216+
217+
218+
function img_pc() {
219+
STEP_DIR=$IMG_DIR
220+
221+
mkdir -p $STEP_DIR || err 60
222+
223+
BOOTFS=$1
224+
225+
# Copy SysLinux files
226+
227+
eval "echo \"$(<$__dirname/../resources/syslinux.cfg)\"" \
228+
> $STEP_DIR/syslinux.cfg || exit 61
229+
230+
cp $KERNEL $STEP_DIR || exit 62
231+
232+
createPartitionImage $BOOTFS || exit $?
233+
234+
$SRC_DIR/bios/mtools/syslinux --install $BOOTFS || exit 63
235+
}
236+
237+
function img_raspi() {
238+
STEP_DIR=$IMG_DIR
239+
240+
mkdir -p $STEP_DIR || err 70
241+
242+
BOOTFS=$1
243+
244+
# Copy Raspberry PI extra files
245+
# http://elinux.org/RPi_Advanced_Setup#Setting_up_the_boot_partition
246+
#
247+
# bootcode.bin, fixup.dat, start.elf, cmdline.txt
248+
(
249+
cd $STEP_DIR || exit 71
250+
251+
wget https://github.com/raspberrypi/firmware/raw/master/boot/bootcode.bin || exit 72
252+
wget https://github.com/raspberrypi/firmware/raw/master/boot/fixup.dat || exit 73
253+
wget https://github.com/raspberrypi/firmware/raw/master/boot/start.elf || exit 74
254+
) || err $?
255+
256+
cp $__dirname/../resources/config.txt $DTS $STEP_DIR || exit 75
257+
258+
case $MACHINE in
259+
raspi)
260+
cp $KERNEL $STEP_DIR/kernel.img || exit 76
261+
;;
262+
263+
raspi2)
264+
cp $KERNEL $STEP_DIR/kernel7.img || exit 77
265+
;;
266+
267+
raspi3)
268+
echo arm_control=0x200 >> $STEP_DIR/config.txt &&
269+
cp $KERNEL $STEP_DIR/kernel7.img || exit 78
270+
;;
271+
272+
*)
273+
echo -e "${RED}Unknown MACHINE '$MACHINE'${CLR}"
274+
exit 79
275+
;;
276+
esac
277+
278+
createPartitionImage $BOOTFS || exit $?
279+
}
280+
181281

182282
case $MACHINE in
183283
pc)
184284
case $FORMAT in
185-
img) # FAT partition
186-
STEP_DIR=$IMG_DIR
187-
188-
mkdir -p $STEP_DIR || err 50
189-
190-
# Copy SysLinux files
285+
disk)
286+
if [[ -z "$USERSFS" ]]; then
287+
echo "-U is mandatory"
288+
exit 80
289+
fi
191290

192-
eval "echo \"$(<$__dirname/../resources/syslinux.cfg)\"" \
193-
> $STEP_DIR/syslinux.cfg || exit 51
291+
BOOTFS=$DISK_DIR/bootfs.img
194292

195-
cp $KERNEL $STEP_DIR || exit 52
293+
img_pc $BOOTFS &&
294+
createDiskImage $BOOTFS || exit $?
196295

197-
createPartitionImage || exit $?
296+
dd bs=440 count=1 conv=notrunc \
297+
if=$SRC_DIR/bios/mbr/mbr.bin of=$OUTPUT || err 81
298+
;;
198299

199-
$SRC_DIR/bios/mtools/syslinux --install $OUTPUT || exit 53
300+
img) # FAT partition
301+
img_pc $OUTPUT || exit $?
200302
;;
201303

202304
iso) # Hybrid ISO image for CDs and USB pendrives
203-
STEP_DIR=$ISO_DIR
204-
205305
createIsoImage || exit $?
206306
;;
207307

208308
tar) # Combine both barebones and initramfs tarfiles in a single one
209-
STEP_DIR=$OUTPUT
210-
211-
mkdir -p `dirname $STEP_DIR` || err 60
212-
213-
gunzip $BAREBONES -c | tar --delete init | gzip > $STEP_DIR &&
214-
cat $INITRAMFS >> $STEP_DIR || err 61
309+
createTar || exit $?
215310
;;
216311

217312
*)
218313
echo -e "${RED}Unknown FORMAT '$FORMAT'${CLR}"
219-
exit 70
314+
exit 90
220315
;;
221316
esac
222317
;;
223318

224319
raspi|raspi2|raspi3) # FAT partition for Raspberry PI
225320
if [[ -z "$DTS" ]]; then
226321
echo "-D is mandatory for MACHINE '$MACHINE'"
227-
exit 80
322+
exit 100
228323
fi
229324

230325
case $FORMAT in
231-
img)
232-
STEP_DIR=$IMG_DIR
233-
234-
mkdir -p $STEP_DIR || err 90
326+
disk)
327+
if [[ -z "$USERSFS" ]]; then
328+
echo "-U is mandatory"
329+
exit 110
330+
fi
235331

236-
# Copy Raspberry PI extra files
237-
# http://elinux.org/RPi_Advanced_Setup#Setting_up_the_boot_partition
238-
#
239-
# bootcode.bin, fixup.dat, start.elf, cmdline.txt
240-
(
241-
cd $STEP_DIR || exit 91
332+
BOOTFS=$DISK_DIR/bootfs.img
242333

243-
wget https://github.com/raspberrypi/firmware/raw/master/boot/bootcode.bin || exit 92
244-
wget https://github.com/raspberrypi/firmware/raw/master/boot/fixup.dat || exit 93
245-
wget https://github.com/raspberrypi/firmware/raw/master/boot/start.elf || exit 94
246-
) || err $?
247-
248-
cp $__dirname/../resources/config.txt $DTS $STEP_DIR || exit 95
249-
250-
case $MACHINE in
251-
raspi)
252-
cp $KERNEL $STEP_DIR/kernel.img || exit 96
253-
;;
254-
255-
raspi2)
256-
cp $KERNEL $STEP_DIR/kernel7.img || exit 97
257-
;;
258-
259-
raspi3)
260-
echo arm_control=0x200 >> $STEP_DIR/config.txt &&
261-
cp $KERNEL $STEP_DIR/kernel7.img || exit 98
262-
;;
263-
264-
*)
265-
echo -e "${RED}Unknown MACHINE '$MACHINE'${CLR}"
266-
exit 99
267-
;;
268-
esac
334+
img_raspi $BOOTFS &&
335+
createDiskImage $BOOTFS || exit $?
336+
;;
269337

270-
createPartitionImage || exit $?
338+
img)
339+
img_raspi $OUTPUT || exit $?
271340
;;
272341

273342
*)
274343
echo -e "${RED}Unknown FORMAT '$FORMAT'${CLR}"
275-
exit 100
344+
exit 120
276345
;;
277346
esac
278347
;;
279348

280349
*)
281350
echo -e "${RED}Unknown MACHINE '$MACHINE'${CLR}"
282-
exit 110
351+
exit 130
283352
;;
284353
esac
285354

0 commit comments

Comments
 (0)