blob: 2b6023aefcf88bb5db1504fe779fd1677613e584 (
plain)
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
|
help:
@echo "Build a minimal Linux system"
@echo ""
@echo "all - create all images"
@echo "qemu - create an image for QEMU"
@echo "vdi - create an image for VirtualBox"
@echo "vmdk - create an image for VMware"
@echo ""
@echo "clean - cleanup build artifacts"
@echo ""
@echo "run minimal Linux for example with 'qema -hda minilinux.img'"
.PHONY: help run all step1 step2 step3 step4 step5 mount-disk umount-disk mount-root umount-root
# software versions
SYSLINUX_VERSION=3.86
KERNEL_VERSION=2.6.33.3
UCLIBC_VERSION=0.9.31
BUSYBOX_VERSION=1.16.1
ACPID_VERSION=1.0.10
GPM_VERSION=1.20.6
PERL_VERSION=5.13.0
PARALLEL=-j12
all: qemu vdi vmdk zip-vdi zip-vmdk
vdi:
-rm -f minilinux.vdi
./vditool DD minilinux.vdi minilinux.img
./vditool SHRINK minilinux.vdi
chmod 666 minilinux.vdi
vmdk:
qemu-img convert -f raw minilinux.img -O vmdk minilinux.vmdk
chmod 666 minilinux.vmdk
chmod 777 minilinux.vmx
zip-vdi:
zip -9 -v -u minilinux.zip minilinux.vdi
mv minilinux.zip minilinux-virtualbox.zip
zip-vmdk:
zip -9 -v -u minilinux minilinux.vmx minilinux.vmdk
mv minilinux.zip minilinux-vmware.zip
qemu: clean step1 step2 step3 step4 step5 umount-root
step1:
# step2: initial setup, image, directory layout, device inodes
step2: disk-image mount-root directory-layout initial-devices
# step3: boot loader
step3: syslinux syslinux-loader
# step4: kernel, uclibc C-library, busybox, basic tools, ACPI daemon
step4: kernel busybox acpid
# step5: additional user space tools:
# - GPM for mouse copy-pate
# - Miniperl
step5: gpm perl
# disk image and directories
directory-layout:
cd target && mkdir bin boot dev etc home lib mnt root sbin tmp usr var proc sys
cd target/boot && mkdir extlinux
cd target/var && mkdir lock log run spool
cd target/usr && mkdir bin include lib local sbin share src
cd target/usr/share && mkdir man
cd target/usr/share/man && mkdir man1 man2 man3 man4 man5 man6 man7 man8 man9
cd target/usr && ln -s share/man man
cd target/etc && mkdir init.d
cp inittab passwd group nsswitch.conf hosts motd issue target/etc
cp rcS target/etc/init.d
initial-devices:
rm -rf target/dev/*
mknod target/dev/console c 5 1
mknod target/dev/null c 1 3
mknod target/dev/zero c 1 5
mknod target/dev/hda b 3 0
mknod target/dev/hda1 b 3 1
mknod target/dev/tty0 c 4 0
mknod target/dev/tty1 c 4 1
mknod target/dev/tty2 c 4 2
mknod target/dev/tty3 c 4 3
mknod target/dev/tty4 c 4 4
mknod target/dev/tty5 c 4 5
mknod target/dev/tty6 c 4 6
mknod target/dev/ttyS0 c 4 64
mknod target/dev/psaux c 10 1
disk-image:
qemu-img create minilinux.img 16450560
chmod 666 minilinux.img
/sbin/losetup /dev/loop0 minilinux.img
dd if=/dev/zero of=/dev/loop0 bs=512 count=32130
echo ',2,L,*' | /sbin/sfdisk -H 255 -S 63 -C 2 --no-reread /dev/loop0
sync && sleep 1
/sbin/losetup -d /dev/loop0
/sbin/losetup -o 512 /dev/loop0 minilinux.img
/sbin/mke2fs /dev/loop0
sync && sleep 1
losetup -d /dev/loop0
mkdir target
# syslinux boot loeader
syslinux:
tar jxf tarballs/syslinux-$(SYSLINUX_VERSION).tar.gz
cd syslinux-$(SYSLINUX_VERSION) && make $(PARALLEL)
syslinux-$(SYSLINUX_VERSION)/extlinux/extlinux -i target/boot/extlinux/.
cp extlinux.conf target/boot/extlinux/.
syslinux-loader:
/sbin/losetup /dev/loop1 minilinux.img
cat syslinux-3.86/mbr/mbr.bin > /dev/loop1
/sbin/losetup -d /dev/loop1
syslinux-clean:
-rm -rf syslinux-build
-rm -rf syslinux-$(SYSLINUX_VERSION)
# Linux kernel
kernel:
-rm -rf linux-$(KERNEL_VERSION)
tar jxf tarballs/linux-$(KERNEL_VERSION).tar.bz2
cp kernel-config linux-$(KERNEL_VERSION)/.config
cd linux-$(KERNEL_VERSION) && make $(PARALLEL) bzImage
cp linux-$(KERNEL_VERSION)/arch/x86/boot/bzImage target/boot/bzImage-$(KERNEL_VERSION)
kernel-clean:
-rm -rf linux-$(KERNEL_VERSION)
# micro C library
uclibc:
-rm -rf uClibc-$(UCLIBC_VERSION)
tar jxf tarballs/uClibc-$(UCLIBC_VERSION).tar.bz2
cp uclibc-config uClibc-$(UCLIBC_VERSION)/.config
cd uClibc-$(UCLIBC_VERSION) && make $(PARALLEL) CROSS=i486-pc-linux-gnu-
cd uClibc-$(UCLIBC_VERSION) && make install DESTDIR=/tools
uclibc-clean:
-rm -rf uClibc-$(UCLIBC_VERSION)
# busybox
busybox:
-rm -rf busybox-$(BUSYBOX_VERSION)
tar jxf tarballs/busybox-$(BUSYBOX_VERSION).tar.bz2
cp busybox-config busybox-$(BUSYBOX_VERSION)/.config
cd busybox-$(BUSYBOX_VERSION) && make $(PARALLEL)
cd busybox-$(BUSYBOX_VERSION) && make install
cp /lib/libcrypt.so.1 target/lib
cp /lib/ld-linux.so.2 target/lib
cp /lib/libm.so.6 target/lib
cp /lib/libc.so.6 target/lib
cp /lib/libdl.so.2 target/lib
cp /lib/libpthread.so.0 target/lib
-cp /lib/libpcre.so.0 target/lib
-cp /usr/lib/libpcre.so.3 target/lib
busybox-clean:
-rm -rf busybox-$(BUSYBOX_VERSION)
gpm:
-rm -rf gpm-$(GPM_VERSION)
tar jxf tarballs/gpm-$(GPM_VERSION).tar.bz2
cd gpm-$(GPM_VERSION) && ./configure --prefix=/usr --without-curses
cd gpm-$(GPM_VERSION) && make LDFLAGS="-lm" $(PARALLEL)
cd gpm-$(GPM_VERSION) && cp src/gpm ../target/usr/sbin
gpm-clean:
-rm -rf gpm-$(GPM_VERSION)
acpid:
-rm -rf acpid-$(ACPID_VERSION)
-rm -rf target/etc/acpi
tar zxf tarballs/acpid-$(ACPID_VERSION).tar.gz
cd acpid-$(ACPID_VERSION) && make $(PARALLEL)
cd acpid-$(ACPID_VERSION) && cp acpid ../target/usr/sbin/acpid
mkdir target/etc/acpi
mkdir target/etc/acpi/events
cp acpid-anything target/etc/acpi/events
cp acpid-handler.sh target/etc/acpi/handler.sh
chmod 775 target/etc/acpi/handler.sh
acpid-clean:
-rm -rf acpid-$(ACPID_VERSION)
perl:
-rm -rf perl-$(PERL_VERSION)
tar zxf tarballs/perl-$(PERL_VERSION).tar.gz
cp {Makefile.micro,miniperlmain.c} perl-$(PERL_VERSION)
cd perl-$(PERL_VERSION) && make -f Makefile.micro $(PARALLEL)
cd perl-$(PERL_VERSION) && cp microperl ../target/usr/bin/perl
perl-clean:
-rm -rf perl-$(PERL_VERSION)
# helpers
mount-disk:
/sbin/losetup /dev/loop0 minilinux.img
umount-disk:
/sbin/losetup -d /dev/loop0
mount-root:
/sbin/losetup -o 512 /dev/loop0 minilinux.img
mount /dev/loop0 target
umount-root:
umount target
/sbin/losetup -d /dev/loop0
# global clean
clean: syslinux-clean uclibc-clean kernel-clean busybox-clean acpid-clean gpm-clean perl-clean
-umount target
-/sbin/losetup -d /dev/loop0
-rm minilinux.img
-rm minilinux.vdi *-vditool-*.log
-rm minilinux.vmdk minilinux.nvram minilinux.vmem minilinux.vmsd minilinux.vmss vmware*.log minilinux.vmxf minilinux*.zip
-rm -rf target
# download sources to tarballs
source:
-test -d tarballs || mkdir tarballs
-test -r tarballs/syslinux-$(SYSLINUX_VERSION).tar.gz || \
wget -O tarballs/syslinux-$(SYSLINUX_VERSION).tar.gz \
http://www.kernel.org/pub/linux/utils/boot/syslinux/syslinux-$(SYSLINUX_VERSION).tar.bz2
-test -r tarballs/linux-$(KERNEL_VERSION).tar.bz2 || \
wget -O tarballs/linux-$(KERNEL_VERSION).tar.bz2 \
http://www.kernel.org/pub/linux/kernel/v2.6/linux-$(KERNEL_VERSION).tar.bz2
-test -r tarballs/uClibc-$(UCLIBC_VERSION).tar.bz2 || \
wget -O tarballs/uClibc-$(UCLIBC_VERSION).tar.bz2 \
http://www.uclibc.org/downloads/uClibc-$(UCLIBC_VERSION).tar.bz2
-test -r tarballs/busybox-$(BUSYBOX_VERSION).tar.bz2 || \
wget -O tarballs/busybox-$(BUSYBOX_VERSION).tar.bz2 \
http://www.busybox.net/downloads/busybox-$(BUSYBOX_VERSION).tar.bz2
-test -r tarballs/acpid-$(ACPID_VERSION).tar.gz || \
wget -O tarballs/acpid-$(ACPID_VERSION).tar.gz \
http://downloads.sourceforge.net/sourceforge/acpid/acpid-$(ACPID_VERSION).tar.gz
-test -r tarballs/gpm-$(GPM_VERSION).tar.bz2 || \
wget -O tarballs/gpm-$(GPM_VERSION).tar.bz2 \
http://www.nico.schottelius.org/software/gpm/archives/gpm-$(GPM_VERSION).tar.bz2
-test -r tarballs/perl-$(PERL_VERSION).tar.gz || \
wget -O tarballs/perl-$(PERL_VERSION).tar.gz \
http://www.cpan.org/src/perl-$(PERL_VERSION).tar.gz
|