Make a debian image
Based on freedom-maker with proprietary stuff removed
This commit is contained in:
parent
d81e4ee6b0
commit
0f91280e28
7
Makefile
7
Makefile
|
@ -10,6 +10,8 @@ source:
|
|||
gzip -f9n ../${APP}_${VERSION}.orig.tar
|
||||
install:
|
||||
mkdir -p ${DESTDIR}${PREFIX}/bin
|
||||
mkdir -p ${DESTDIR}/etc/freedombone
|
||||
cp -r image_build/* ${DESTDIR}/etc/freedombone
|
||||
install -m 755 src/${APP} ${DESTDIR}${PREFIX}/bin
|
||||
install -m 755 src/zeronetavahi ${DESTDIR}${PREFIX}/bin
|
||||
install -m 755 src/${APP}-keydrive ${DESTDIR}${PREFIX}/bin
|
||||
|
@ -45,6 +47,7 @@ install:
|
|||
install -m 755 src/${APP}-rmsipuser ${DESTDIR}${PREFIX}/bin
|
||||
install -m 755 src/${APP}-sipfreeext ${DESTDIR}${PREFIX}/bin
|
||||
install -m 755 src/${APP}-format ${DESTDIR}${PREFIX}/bin
|
||||
install -m 755 src/${APP}-image* ${DESTDIR}${PREFIX}/bin
|
||||
mkdir -m 755 -p ${DESTDIR}${PREFIX}/share/man/man1
|
||||
install -m 644 man/${APP}.1.gz ${DESTDIR}${PREFIX}/share/man/man1
|
||||
install -m 644 man/${APP}-keydrive.1.gz ${DESTDIR}${PREFIX}/share/man/man1
|
||||
|
@ -75,6 +78,7 @@ install:
|
|||
install -m 644 man/${APP}-addsipuser.1.gz ${DESTDIR}${PREFIX}/share/man/man1
|
||||
install -m 644 man/${APP}-rmsipuser.1.gz ${DESTDIR}${PREFIX}/share/man/man1
|
||||
install -m 644 man/${APP}-format.1.gz ${DESTDIR}${PREFIX}/share/man/man1
|
||||
install -m 644 man/${APP}-image.1.gz ${DESTDIR}${PREFIX}/share/man/man1
|
||||
uninstall:
|
||||
rm -f ${PREFIX}/share/man/man1/${APP}.1.gz
|
||||
rm -f ${PREFIX}/share/man/man1/${APP}-keydrive.1.gz
|
||||
|
@ -105,6 +109,7 @@ uninstall:
|
|||
rm -f ${PREFIX}/share/man/man1/${APP}-addsipuser.1.gz
|
||||
rm -f ${PREFIX}/share/man/man1/${APP}-rmsipuser.1.gz
|
||||
rm -f ${PREFIX}/share/man/man1/${APP}-format.1.gz
|
||||
rm -f ${PREFIX}/share/man/man1/${APP}-image.1.gz
|
||||
rm -rf ${PREFIX}/share/${APP}
|
||||
rm -f ${PREFIX}/bin/${APP}
|
||||
rm -f ${PREFIX}/bin/zeronetavahi
|
||||
|
@ -139,7 +144,9 @@ uninstall:
|
|||
rm -f ${PREFIX}/bin/${APP}-rmsipuser
|
||||
rm -f ${PREFIX}/bin/${APP}-sipfreeext
|
||||
rm -f ${PREFIX}/bin/${APP}-format
|
||||
rm -f ${PREFIX}/bin/${APP}-image*
|
||||
clean:
|
||||
rm -f \#* \.#* debian/*.substvars debian/*.log
|
||||
rm -fr deb.* debian/${APP}
|
||||
rm -f ../${APP}*.deb ../${APP}*.changes ../${APP}*.asc ../${APP}*.dsc
|
||||
rm -rf /etc/freedombone
|
||||
|
|
|
@ -0,0 +1,147 @@
|
|||
diff --git a/vmdebootstrap b/vmdebootstrap
|
||||
index 4895147..c46be43 100755
|
||||
--- a/vmdebootstrap
|
||||
+++ b/vmdebootstrap
|
||||
@@ -218,6 +218,25 @@ class VmDebootstrap(cliapp.Application): # pylint: disable=too-many-public-meth
|
||||
self.runcmd(['mkswap', swapdev])
|
||||
self.mkfs(rootdev, fstype=roottype)
|
||||
rootdir = self.mount(rootdev)
|
||||
+ rootfsdir = rootdir
|
||||
+ if 'btrfs' == roottype:
|
||||
+ # Put root in a subvolume, to ease snapshots and volume management
|
||||
+ self.message("Creating root file system as btrfs subvolume @")
|
||||
+ self.runcmd(['btrfs', 'subvolume', 'create', "%s/@" % rootdir])
|
||||
+
|
||||
+ # Make sure the subvolume mount point show in in
|
||||
+ # /proc/mounts for grub-update to figure out the
|
||||
+ # device for the root file system.
|
||||
+ newrootdir = "%s/build" % rootdir
|
||||
+ os.mkdir(newrootdir)
|
||||
+ self.mount(rootdev, newrootdir, ['-o','subvol=@'])
|
||||
+# self.runcmd(['btrfs', 'subvolume', 'set-default', '@', rootdir])
|
||||
+
|
||||
+ # Make the btrfs root file system available in the chroot.
|
||||
+ os.mkdir("%s/btrfs" % newrootdir)
|
||||
+ self.mount(rootdev, "%s/btrfs" % newrootdir)
|
||||
+
|
||||
+ rootdir = newrootdir
|
||||
if bootdev:
|
||||
if self.settings['boottype']:
|
||||
boottype = self.settings['boottype']
|
||||
@@ -245,9 +264,9 @@ class VmDebootstrap(cliapp.Application): # pylint: disable=too-many-public-meth
|
||||
|
||||
if self.settings['image']:
|
||||
if self.settings['grub']:
|
||||
- self.install_grub2(rootdev, rootdir)
|
||||
+ self.install_grub2(rootdev, rootdir, rootfsdir)
|
||||
elif self.settings['extlinux']:
|
||||
- self.install_extlinux(rootdev, rootdir)
|
||||
+ self.install_extlinux(rootdev, rootdir, rootfsdir)
|
||||
self.append_serial_console(rootdir)
|
||||
self.optimize_image(rootdir)
|
||||
if self.settings['squash']:
|
||||
@@ -300,13 +319,19 @@ class VmDebootstrap(cliapp.Application): # pylint: disable=too-many-public-meth
|
||||
logging.debug('mkdir %s', dirname)
|
||||
return dirname
|
||||
|
||||
- def mount(self, device, path=None):
|
||||
+ def mount(self, device, path=None, opts=None):
|
||||
if not path:
|
||||
mount_point = self.mkdtemp()
|
||||
else:
|
||||
mount_point = path
|
||||
self.message('Mounting %s on %s' % (device, mount_point))
|
||||
- self.runcmd(['mount', device, mount_point])
|
||||
+ cmd = ['mount']
|
||||
+ if opts is not None:
|
||||
+ for opt in opts:
|
||||
+ cmd.append(opt)
|
||||
+ cmd.append(device)
|
||||
+ cmd.append(mount_point)
|
||||
+ self.runcmd(cmd)
|
||||
self.mount_points.append(mount_point)
|
||||
logging.debug('mounted %s on %s', device, mount_point)
|
||||
return mount_point
|
||||
@@ -458,6 +483,9 @@ class VmDebootstrap(cliapp.Application): # pylint: disable=too-many-public-meth
|
||||
if self.settings['grub']:
|
||||
include.append('grub-pc')
|
||||
|
||||
+ if 'btrfs' == self.settings['roottype']:
|
||||
+ include.append('btrfs-tools')
|
||||
+
|
||||
if not self.settings['no-kernel']:
|
||||
if self.settings['kernel-package']:
|
||||
kernel_image = self.settings['kernel-package']
|
||||
@@ -546,7 +574,12 @@ class VmDebootstrap(cliapp.Application): # pylint: disable=too-many-public-meth
|
||||
fstab = os.path.join(rootdir, 'etc', 'fstab')
|
||||
with open(fstab, 'w') as f:
|
||||
f.write('proc /proc proc defaults 0 0\n')
|
||||
- f.write('%s / %s errors=remount-ro 0 1\n' % (rootdevstr, roottype))
|
||||
+ if 'btrfs' == roottype:
|
||||
+# f.write('%s / %s defaults 0 1\n' % (rootdevstr, roottype))
|
||||
+ f.write('%s / %s subvol=@ 0 1\n' % (rootdevstr, roottype))
|
||||
+ f.write('%s /btrfs %s defaults 1\n' % (rootdevstr, roottype))
|
||||
+ else:
|
||||
+ f.write('%s / %s errors=remount-ro 0 1\n' % (rootdevstr, roottype))
|
||||
if bootdevstr:
|
||||
f.write('%s /boot %s errors=remount-ro 0 2\n' % (bootdevstr, boottype))
|
||||
if self.settings['swap'] > 0:
|
||||
@@ -661,7 +694,8 @@ class VmDebootstrap(cliapp.Application): # pylint: disable=too-many-public-meth
|
||||
cfg.write("%s\n" % terminal)
|
||||
cfg.write("%s\n" % command)
|
||||
|
||||
- def install_grub2(self, rootdev, rootdir):
|
||||
+ def install_grub2(self, rootdev, rootdir, rootfsdir):
|
||||
+ # FIXME use rootfsdir
|
||||
self.message("Configuring grub2")
|
||||
# rely on kpartx using consistent naming to map loop0p1 to loop0
|
||||
install_dev = os.path.join('/dev', os.path.basename(rootdev)[:-2])
|
||||
@@ -679,12 +713,12 @@ class VmDebootstrap(cliapp.Application): # pylint: disable=too-many-public-meth
|
||||
self.runcmd(['chroot', rootdir, 'grub-install', install_dev])
|
||||
except cliapp.AppException:
|
||||
self.message("Failed. Is grub2-common installed? Using extlinux.")
|
||||
- self.install_extlinux(rootdev, rootdir)
|
||||
+ self.install_extlinux(rootdev, rootdir, rootfsdir)
|
||||
self.runcmd(['umount', os.path.join(rootdir, 'sys')])
|
||||
self.runcmd(['umount', os.path.join(rootdir, 'proc')])
|
||||
self.runcmd(['umount', os.path.join(rootdir, 'dev')])
|
||||
|
||||
- def install_extlinux(self, rootdev, rootdir):
|
||||
+ def install_extlinux(self, rootdev, rootdir, rootfsdir):
|
||||
if not os.path.exists("/usr/bin/extlinux"):
|
||||
self.message("extlinux not installed, skipping.")
|
||||
return
|
||||
@@ -711,7 +745,7 @@ class VmDebootstrap(cliapp.Application): # pylint: disable=too-many-public-meth
|
||||
'-s', 'UUID', rootdev])
|
||||
uuid = out.splitlines()[0].strip()
|
||||
|
||||
- conf = os.path.join(rootdir, 'extlinux.conf')
|
||||
+ conf = os.path.join(rootfsdir, 'extlinux.conf')
|
||||
logging.debug('configure extlinux %s', conf)
|
||||
kserial = 'console=ttyS0,115200' if self.settings['serial-console'] else ''
|
||||
extserial = 'serial 0 115200' if self.settings['serial-console'] else ''
|
||||
@@ -721,13 +755,14 @@ timeout 1
|
||||
|
||||
label linux
|
||||
kernel %(kernel)s
|
||||
-append initrd=%(initrd)s root=UUID=%(uuid)s ro %(kserial)s
|
||||
+append initrd=%(initrd)s root=UUID=%(uuid)s ro %(kserial)s %(rootflags)s
|
||||
%(extserial)s
|
||||
''' % {
|
||||
'kernel': kernel_image, # pylint: disable=bad-continuation
|
||||
'initrd': initrd_image, # pylint: disable=bad-continuation
|
||||
'uuid': uuid, # pylint: disable=bad-continuation
|
||||
'kserial': kserial, # pylint: disable=bad-continuation
|
||||
+ 'rootflags': 'rootfsflags=subvol=@' if 'btrfs' == self.settings['roottype'] else '', # pylint: disable=bad-continuation
|
||||
'extserial': extserial, # pylint: disable=bad-continuation
|
||||
} # pylint: disable=bad-continuation
|
||||
logging.debug("extlinux config:\n%s", msg)
|
||||
@@ -738,7 +773,7 @@ append initrd=%(initrd)s root=UUID=%(uuid)s ro %(kserial)s
|
||||
f = open(conf, 'w')
|
||||
f.write(msg)
|
||||
|
||||
- self.runcmd(['extlinux', '--install', rootdir])
|
||||
+ self.runcmd(['extlinux', '--install', rootfsdir])
|
||||
self.runcmd(['sync'])
|
||||
time.sleep(2)
|
||||
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 390e883698f85e34433ef79aeabfde77c06b1c22
|
Binary file not shown.
|
@ -0,0 +1,72 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# .---. . .
|
||||
# | | |
|
||||
# |--- .--. .-. .-. .-.| .-. .--.--. |.-. .-. .--. .-.
|
||||
# | | (.-' (.-' ( | ( )| | | | )( )| | (.-'
|
||||
# ' ' --' --' -' - -' ' ' -' -' -' ' - --'
|
||||
#
|
||||
# Freedom in the Cloud
|
||||
#
|
||||
# Creates a debian image using vmdebootstrap
|
||||
#
|
||||
# License
|
||||
# =======
|
||||
#
|
||||
# Copyright (C) 2015 Bob Mottram <bob@robotics.uk.to>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
IMAGE_TYPE=$1
|
||||
CURR_DIR=$(pwd)
|
||||
BUILD_DIR=~/.tmp_freedombone_build
|
||||
|
||||
rm $CURR_DIR/*.img
|
||||
|
||||
if [ -d $BUILD_DIR ]; then
|
||||
rm -rf $BUILD_DIR
|
||||
fi
|
||||
mkdir -p $BUILD_DIR
|
||||
if [ -f /usr/local/bin/freedombone-image-makefile ]; then
|
||||
cp /usr/local/bin/freedombone-image-makefile $BUILD_DIR/Makefile
|
||||
else
|
||||
cp /usr/bin/freedombone-image-makefile $BUILD_DIR/Makefile
|
||||
fi
|
||||
|
||||
cp -r /etc/freedombone/* $BUILD_DIR
|
||||
cd $BUILD_DIR
|
||||
|
||||
rm -rf vendor
|
||||
mkdir vendor
|
||||
if [ -d vendor/vmdebootstrap ] ; then
|
||||
(cd vendor/vmdebootstrap; git checkout .; git pull)
|
||||
else
|
||||
git clone git://git.liw.fi/vmdebootstrap vendor/vmdebootstrap
|
||||
fi
|
||||
cd vendor/vmdebootstrap
|
||||
git checkout tags/vmdebootstrap-0.8
|
||||
git checkout -b tags/vmdebootstrap-0.8
|
||||
for f in ../../vendor-patches/vmdebootstrap/* ; do
|
||||
echo applying $(basename $f)
|
||||
patch -p1 < $f
|
||||
done
|
||||
|
||||
cd $BUILD_DIR
|
||||
make $IMAGE_TYPE
|
||||
mv build/*.bz2 $CURR_DIR
|
||||
mv build/*.img $CURR_DIR
|
||||
mv build/*.sig $CURR_DIR
|
||||
rm -rf $BUILD_DIR
|
||||
|
||||
exit 0
|
|
@ -0,0 +1,158 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# Based on bin/freedombox-customize from freedom-maker
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
set -e
|
||||
set -x
|
||||
|
||||
enable_eatmydata_override() {
|
||||
chroot $rootdir apt-get install --no-install-recommends -y eatmydata
|
||||
if [ -x $rootdir/usr/bin/eatmydata ] && \
|
||||
[ ! -f $rootdir/etc/apt/apt.conf.d/95debian-edu-install-dpkg-eatmydata ]; then
|
||||
echo "info: Adding apt config to call dpkg via eatmydata"
|
||||
printf "#!/bin/sh\nexec eatmydata dpkg \"\$@\"\n" \
|
||||
> $rootdir/var/tmp/dpkg-eatmydata
|
||||
chmod 755 $rootdir/var/tmp/dpkg-eatmydata
|
||||
cat > $rootdir/etc/apt/apt.conf.d/95debian-edu-install-dpkg-eatmydata <<EOF
|
||||
Dir::Bin::dpkg "/var/tmp/dpkg-eatmydata";
|
||||
EOF
|
||||
else
|
||||
echo "error: unable to find /usr/bin/eatmydata after installing the eatmydata package"
|
||||
fi
|
||||
}
|
||||
|
||||
disable_eatmydata_override() {
|
||||
for override in \
|
||||
/etc/apt/apt.conf.d/95debian-edu-install-dpkg-eatmydata \
|
||||
/var/tmp/dpkg-eatmydata ; do
|
||||
echo "info: Removing apt config to call dpkg via eatmydata"
|
||||
if [ -f $rootdir$override ] ; then
|
||||
rm -f $rootdir$override
|
||||
else
|
||||
echo "warning: missing $rootdir$override"
|
||||
fi
|
||||
done
|
||||
sync # Flush file buffers before continuing
|
||||
}
|
||||
|
||||
set_apt_sources() {
|
||||
NEW_MIRROR="$1"
|
||||
COMPONENTS="main"
|
||||
|
||||
cat <<EOF > etc/apt/sources.list
|
||||
deb $NEW_MIRROR $SUITE $COMPONENTS
|
||||
deb-src $NEW_MIRROR $SUITE $COMPONENTS
|
||||
|
||||
#deb http://security.debian.org/ $SUITE/updates main
|
||||
#deb-src http://security.debian.org/ $SUITE/updates main
|
||||
EOF
|
||||
}
|
||||
|
||||
# Set to true/false to control if eatmydata is used during build
|
||||
use_eatmydata=true
|
||||
|
||||
rootdir="$1"
|
||||
fmdir="$(pwd)"
|
||||
image="$fmdir"/"$2"
|
||||
cd "$rootdir"
|
||||
|
||||
echo info: building $MACHINE for $ARCHITECTURE
|
||||
|
||||
export DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true
|
||||
export LC_ALL=C LANGUAGE=C LANG=C
|
||||
|
||||
# Override libpam-tmpdir setting during build, as the directories
|
||||
# are not created yet.
|
||||
export TMP=/tmp/ TMPDIR=/tmp/
|
||||
|
||||
username=freedom
|
||||
echo "warning: creating initial user $username with well known password!"
|
||||
password=bone
|
||||
chroot $rootdir adduser --gecos $username --disabled-password $username
|
||||
echo $username:$password | chroot $rootdir /usr/sbin/chpasswd
|
||||
chroot $rootdir adduser $username sudo
|
||||
|
||||
case "$MACHINE" in
|
||||
virtualbox)
|
||||
# hide irrelevant console keyboard messages.
|
||||
echo "echo \"4 4 1 7\" > /proc/sys/kernel/printk" \
|
||||
>> /etc/init.d/rc.local
|
||||
;;
|
||||
esac
|
||||
|
||||
set_apt_sources $BUILD_MIRROR
|
||||
chroot $rootdir apt-get update
|
||||
|
||||
cat > $rootdir/usr/sbin/policy-rc.d <<EOF
|
||||
#!/bin/sh
|
||||
exit 101
|
||||
EOF
|
||||
chmod a+rx $rootdir/usr/sbin/policy-rc.d
|
||||
|
||||
if $use_eatmydata ; then
|
||||
enable_eatmydata_override
|
||||
fi
|
||||
|
||||
if [ -n "$CUSTOM_SETUP" ]; then
|
||||
cp "$CUSTOM_SETUP" "$rootdir"/tmp
|
||||
chroot "$rootdir" apt-get install -y gdebi-core
|
||||
chroot "$rootdir" gdebi -n /tmp/"$(basename $CUSTOM_SETUP)"
|
||||
fi
|
||||
|
||||
chroot "$rootdir" apt-get install -y git dialog
|
||||
chroot "$rootdir" git clone https://github.com/bashrc/freedombone /root/freedombone
|
||||
chroot "$rootdir" cd /root/freedombone && make install
|
||||
|
||||
chroot $rootdir freedombone-image-hardware-setup 2>&1 | \
|
||||
tee $rootdir/var/log/freedombone-image-hardware-setup.log
|
||||
|
||||
rm $rootdir/usr/sbin/policy-rc.d
|
||||
|
||||
chroot $rootdir /usr/lib/freedombone/setup 2>&1 | \
|
||||
tee $rootdir/var/log/freedombone-setup.log
|
||||
|
||||
# Remove SSH keys from the image
|
||||
rm $rootdir/etc/ssh/ssh_host_* || true
|
||||
|
||||
# copy u-boot to beginning of image
|
||||
case "$MACHINE" in
|
||||
beaglebone)
|
||||
chroot $rootdir apt-get -y install rng-tools
|
||||
sed -i 's|#HRNGDEVICE=/dev/hwrng|HRNGDEVICE=/dev/hwrng|g' $rootdir/etc/default/rng-tools
|
||||
|
||||
dd if=$rootdir/usr/lib/u-boot/am335x_boneblack/MLO of="$image" \
|
||||
count=1 seek=1 conv=notrunc bs=128k
|
||||
dd if=$rootdir/usr/lib/u-boot/am335x_boneblack/u-boot.img of="$image" \
|
||||
count=2 seek=1 conv=notrunc bs=384k
|
||||
;;
|
||||
cubieboard2)
|
||||
dd if=$rootdir/usr/lib/u-boot/Cubieboard2/u-boot-sunxi-with-spl.bin of="$image" \
|
||||
seek=8 conv=notrunc bs=1k
|
||||
;;
|
||||
esac
|
||||
|
||||
if $use_eatmydata ; then
|
||||
disable_eatmydata_override
|
||||
fi
|
||||
|
||||
set_apt_sources $MIRROR
|
||||
chroot $rootdir apt-get update
|
||||
|
||||
cd /
|
||||
echo "info: killing leftover processes in chroot"
|
||||
# 2014-11-04 this killed /usr/lib/erlang/erts-6.2/bin/epmd, see
|
||||
# <URL: https://www.ejabberd.im/epmd?q=epmd > to learn more.
|
||||
fuser -mvk $rootdir/. || true
|
|
@ -0,0 +1,170 @@
|
|||
#!/bin/sh
|
||||
|
||||
enable_serial_console() {
|
||||
# By default, spawn a console on the serial port
|
||||
device="$1"
|
||||
echo "Adding a getty on the serial port"
|
||||
echo "T0:12345:respawn:/sbin/getty -L $device 115200 vt100" >> /etc/inittab
|
||||
}
|
||||
|
||||
beaglebone_setup_boot() {
|
||||
# Setup uEnv.txt
|
||||
if grep -q btrfs /etc/fstab ; then
|
||||
fstype=btrfs
|
||||
else
|
||||
fstype=ext4
|
||||
fi
|
||||
kernelVersion=$(ls /usr/lib/*/am335x-boneblack.dtb | head -1 | cut -d/ -f4)
|
||||
version=$(echo $kernelVersion | sed 's/linux-image-\(.*\)/\1/')
|
||||
initRd=initrd.img-$version
|
||||
vmlinuz=vmlinuz-$version
|
||||
|
||||
# uEnv.txt for Beaglebone
|
||||
# based on https://github.com/beagleboard/image-builder/blob/master/target/boot/beagleboard.org.txt
|
||||
cat >> /boot/uEnv.txt <<EOF
|
||||
mmcroot=/dev/mmcblk0p2 ro
|
||||
mmcrootfstype=$fstype rootwait fixrtc
|
||||
mmcrootflags=subvol=@
|
||||
|
||||
console=ttyO0,115200n8
|
||||
|
||||
kernel_file=$vmlinuz
|
||||
initrd_file=$initRd
|
||||
|
||||
loadaddr=0x80200000
|
||||
initrd_addr=0x81000000
|
||||
fdtaddr=0x80F80000
|
||||
|
||||
initrd_high=0xffffffff
|
||||
fdt_high=0xffffffff
|
||||
|
||||
loadkernel=load mmc \${mmcdev}:\${mmcpart} \${loadaddr} \${kernel_file}
|
||||
loadinitrd=load mmc \${mmcdev}:\${mmcpart} \${initrd_addr} \${initrd_file}; setenv initrd_size \${filesize}
|
||||
loadfdt=load mmc \${mmcdev}:\${mmcpart} \${fdtaddr} /dtbs/\${fdtfile}
|
||||
|
||||
loadfiles=run loadkernel; run loadinitrd; run loadfdt
|
||||
mmcargs=setenv bootargs console=tty0 console=\${console} root=\${mmcroot} rootfstype=\${mmcrootfstype} rootflags=\${mmcrootflags}
|
||||
|
||||
uenvcmd=run loadfiles; run mmcargs; bootz \${loadaddr} \${initrd_addr}:\${initrd_size} \${fdtaddr}
|
||||
EOF
|
||||
|
||||
mkdir -p /boot/dtbs
|
||||
cp /usr/lib/linux-image-*-armmp/* /boot/dtbs
|
||||
}
|
||||
|
||||
beaglebone_flash() {
|
||||
# allow flash-kernel to work without valid /proc contents
|
||||
# ** this doesn't *really* work, since there are too many checks
|
||||
# that fail in an emulated environment! We'll have to do it by
|
||||
# hand below anyway...
|
||||
export FK_MACHINE="TI AM335x BeagleBone"
|
||||
apt-get install -y flash-kernel
|
||||
}
|
||||
|
||||
beaglebone_repack_kernel() {
|
||||
# process installed kernel to create uImage, uInitrd, dtb
|
||||
# using flash-kernel would be a good approach, except it fails in the
|
||||
# cross build environment due to too many environment checks...
|
||||
#FK_MACHINE="TI AM335x BeagleBone" flash-kernel
|
||||
# so, let's do it manually...
|
||||
|
||||
# flash-kernel's hook-functions provided to mkinitramfs have the
|
||||
# unfortunate side-effect of creating /conf/param.conf in the initrd
|
||||
# when run from our emulated chroot environment, which means our root=
|
||||
# on the kernel command line is completely ignored! repack the initrd
|
||||
# to remove this evil...
|
||||
|
||||
echo "info: repacking beaglebone kernel and initrd"
|
||||
|
||||
kernelVersion=$(ls /usr/lib/*/am335x-boneblack.dtb | head -1 | cut -d/ -f4)
|
||||
version=$(echo $kernelVersion | sed 's/linux-image-\(.*\)/\1/')
|
||||
initRd=initrd.img-$version
|
||||
vmlinuz=vmlinuz-$version
|
||||
|
||||
mkdir /tmp/initrd-repack
|
||||
|
||||
(cd /tmp/initrd-repack ; \
|
||||
zcat /boot/$initRd | cpio -i ; \
|
||||
rm -f conf/param.conf ; \
|
||||
find . | cpio --quiet -o -H newc | \
|
||||
gzip -9 > /boot/$initRd )
|
||||
|
||||
rm -rf /tmp/initrd-repack
|
||||
|
||||
(cd /boot ; \
|
||||
cp /usr/lib/$kernelVersion/am335x-boneblack.dtb dtb ; \
|
||||
cat $vmlinuz dtb >> temp-kernel ; \
|
||||
mkimage -A arm -O linux -T kernel -n "Debian kernel ${version}" \
|
||||
-C none -a 0x80200000 -e 0x80200000 -d temp-kernel uImage ; \
|
||||
rm -f temp-kernel ; \
|
||||
mkimage -A arm -O linux -T ramdisk -C gzip -a 0x81000000 -e 0x81000000 \
|
||||
-n "Debian ramdisk ${version}" \
|
||||
-d $initRd uInitrd )
|
||||
}
|
||||
|
||||
cubieboard2_setup_boot() {
|
||||
# Setup boot.cmd
|
||||
if grep -q btrfs /etc/fstab ; then
|
||||
fstype=btrfs
|
||||
else
|
||||
fstype=ext4
|
||||
fi
|
||||
kernelVersion=$(ls /usr/lib/*/sun7i-a20-cubieboard2.dtb | head -1 | cut -d/ -f4)
|
||||
version=$(echo $kernelVersion | sed 's/linux-image-\(.*\)/\1/')
|
||||
initRd=initrd.img-$version
|
||||
vmlinuz=vmlinuz-$version
|
||||
|
||||
# boot.cmd for CubieTruck
|
||||
cat >> /boot/boot.cmd <<EOF
|
||||
setenv mmcdev 0
|
||||
setenv mmcpart 1
|
||||
|
||||
setenv mmcroot /dev/mmcblk0p2 ro
|
||||
setenv mmcrootfstype $fstype rootwait fixrtc
|
||||
setenv mmcrootflags subvol=@
|
||||
|
||||
setenv console ttyS0,115200n8
|
||||
|
||||
setenv kernel_file $vmlinuz
|
||||
setenv initrd_file $initRd
|
||||
|
||||
setenv loadaddr 0x46000000
|
||||
setenv initrd_addr 0x48000000
|
||||
setenv fdtaddr 0x47000000
|
||||
|
||||
setenv initrd_high 0xffffffff
|
||||
setenv fdt_high 0xffffffff
|
||||
|
||||
setenv loadkernel load mmc \${mmcdev}:\${mmcpart} \${loadaddr} \${kernel_file}
|
||||
setenv loadinitrd load mmc \${mmcdev}:\${mmcpart} \${initrd_addr} \${initrd_file}\\; setenv initrd_size \\\${filesize}
|
||||
setenv loadfdt load mmc \${mmcdev}:\${mmcpart} \${fdtaddr} /dtbs/\${fdtfile}
|
||||
|
||||
setenv loadfiles run loadkernel\\; run loadinitrd\\; run loadfdt
|
||||
setenv mmcargs setenv bootargs console=\${console} root=\${mmcroot} rootfstype=\${mmcrootfstype} rootflags=\${mmcrootflags}
|
||||
|
||||
run loadfiles; run mmcargs; bootz \${loadaddr} \${initrd_addr}:\${initrd_size} \${fdtaddr}
|
||||
EOF
|
||||
|
||||
# boot.scr for CubieTruck
|
||||
mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr
|
||||
|
||||
# DTBs for CubieTruck
|
||||
mkdir -p /boot/dtbs
|
||||
cp /usr/lib/$kernelVersion/* /boot/dtbs
|
||||
|
||||
# extra boot modules
|
||||
echo "rtc_sunxi" >> /etc/initramfs-tools/modules
|
||||
}
|
||||
|
||||
case "$MACHINE" in
|
||||
beaglebone)
|
||||
beaglebone_setup_boot
|
||||
beaglebone_flash
|
||||
beaglebone_repack_kernel
|
||||
enable_serial_console ttyO0
|
||||
;;
|
||||
cubieboard2)
|
||||
cubieboard2_setup_boot
|
||||
enable_serial_console ttyS0
|
||||
;;
|
||||
esac
|
|
@ -0,0 +1,129 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# Based upon bin/mk-freedombox-image from freedom-maker
|
||||
# With non-free stuff removed
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
set -e # Exit on first error
|
||||
|
||||
#set -x # Enable debugging
|
||||
|
||||
IMAGE=$1
|
||||
export ARCHITECTURE
|
||||
export MACHINE
|
||||
export SOURCE
|
||||
export SUITE
|
||||
|
||||
# Locate vmdebootstrap program fetched in Makefile
|
||||
basedir=`pwd`
|
||||
vendor_dir="${basedir}/vendor"
|
||||
vmdebootstrap_dir="${vendor_dir}/vmdebootstrap"
|
||||
|
||||
if [ -z "$MIRROR" ] || [ -z "$SUITE" ] ; then
|
||||
echo error: Missing MIRROR and SUITE settings inherited from Makefile.
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Packages to install in all Freedombone environments
|
||||
base_pkgs="apt base-files ifupdown initramfs-tools \
|
||||
logrotate module-init-tools netbase rsyslog udev debian-archive-keyring"
|
||||
|
||||
# Packages needed on the beaglebone
|
||||
beaglebone_pkgs="linux-image-armmp u-boot-tools u-boot"
|
||||
|
||||
# Packages needed for self-hosted development
|
||||
dev_pkgs="build-essential devscripts make man-db emacs org-mode git mercurial"
|
||||
|
||||
# Packages needed for XFCE desktop environment
|
||||
xfce_pkgs="task-xfce-desktop iceweasel ca-certificates"
|
||||
|
||||
echo Building $MACHINE Freedombone for $ARCHITECTURE.
|
||||
|
||||
case "$MACHINE" in
|
||||
beaglebone)
|
||||
extra_pkgs="$beaglebone_pkgs"
|
||||
extra_opts="\
|
||||
--variant minbase \
|
||||
--bootoffset=2mib \
|
||||
--bootsize 128M \
|
||||
--boottype ext2 \
|
||||
--no-kernel \
|
||||
--no-extlinux \
|
||||
--foreign /usr/bin/qemu-arm-static \
|
||||
--roottype btrfs \
|
||||
"
|
||||
;;
|
||||
virtualbox)
|
||||
extra_opts="\
|
||||
--grub \
|
||||
--roottype btrfs \
|
||||
" ;;
|
||||
all)
|
||||
extra_opts="\
|
||||
--grub \
|
||||
--roottype btrfs \
|
||||
" ;;
|
||||
esac
|
||||
|
||||
# allow for lots of extra fun customization options.
|
||||
for customization in $CUSTOMIZATIONS
|
||||
do
|
||||
case "$customization" in
|
||||
development)
|
||||
extra_pkgs="$extra_pkgs $dev_pkgs"
|
||||
;;
|
||||
xfce)
|
||||
extra_pkgs="$extra_pkgs $xfce_pkgs"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
for p in $base_pkgs $extra_pkgs; do
|
||||
pkgopts="$pkgopts --package $p"
|
||||
done
|
||||
|
||||
# Make sure file is owned by current user, not root
|
||||
touch $(dirname $IMAGE)/freedombone.log
|
||||
|
||||
if [ -x vendor/vmdebootstrap/vmdebootstrap ] ; then
|
||||
VMDEBOOTSTRAP=vendor/vmdebootstrap/vmdebootstrap
|
||||
else
|
||||
VMDEBOOTSTRAP=vmdebootstrap
|
||||
fi
|
||||
|
||||
echo "starting $VMDEBOOTSTRAP"
|
||||
# Run vmdebootstrap script to create image
|
||||
sudo -H \
|
||||
SUITE="$SUITE" \
|
||||
MIRROR="$MIRROR" \
|
||||
BUILD_MIRROR="$BUILD_MIRROR"\
|
||||
MACHINE="$MACHINE" \
|
||||
ARCHITECTURE="$ARCHITECTURE" \
|
||||
SOURCE="$SOURCE" \
|
||||
CUSTOM_SETUP="$CUSTOM_SETUP" \
|
||||
$VMDEBOOTSTRAP \
|
||||
--log $(dirname $IMAGE)/freedombone.log \
|
||||
--log-level debug \
|
||||
--size $IMAGE_SIZE \
|
||||
--image $IMAGE.img \
|
||||
--hostname freedombone \
|
||||
--verbose \
|
||||
--mirror $BUILD_MIRROR \
|
||||
--customize "freedombone-image-customise" \
|
||||
--lock-root-password \
|
||||
--arch $ARCHITECTURE \
|
||||
--distribution $SUITE \
|
||||
$extra_opts \
|
||||
$pkgopts
|
|
@ -0,0 +1,147 @@
|
|||
#!/usr/bin/make
|
||||
#
|
||||
# A debian image builder, based upon freedom-maker
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# Where to fetch packages
|
||||
MIRROR ?= http://httpredir.debian.org/debian
|
||||
BUILD_MIRROR ?= http://httpredir.debian.org/debian
|
||||
IMAGE_SIZE ?= 8G
|
||||
SUITE ?= jessie
|
||||
# include source packages in image?
|
||||
SOURCE ?= false
|
||||
|
||||
# yes no
|
||||
BUILD = $(MACHINE)-$(ARCHITECTURE)
|
||||
TODAY := $(shell date +%Y-%m-%d)
|
||||
NAME = build/freedombone-$(TODAY)_$(BUILD)
|
||||
IMAGE = $(NAME).img
|
||||
ARCHIVE = $(NAME).tar.bz2
|
||||
SIGNATURE = $(ARCHIVE).sig
|
||||
OWNER = 1000
|
||||
TAR = tar --checkpoint=1000 --checkpoint-action=dot -cjvf
|
||||
SIGN = -gpg --output $(SIGNATURE) --detach-sig $(ARCHIVE)
|
||||
|
||||
# settings for `make test`
|
||||
TEST_SSH_PORT = 2222
|
||||
TEST_FIRSTRUN_WAIT_TIME = 120 # seconds
|
||||
|
||||
# Using taskset to pin build process to single core. This is a
|
||||
# workaround for a qemu-user-static issue that causes builds to
|
||||
# hang. (See Debian bug #769983 for details.)
|
||||
MAKE_IMAGE = ARCHITECTURE=$(ARCHITECTURE) MACHINE=$(MACHINE) SOURCE=$(SOURCE) \
|
||||
MIRROR=$(MIRROR) SUITE=$(SUITE) OWNER=$(OWNER) \
|
||||
BUILD_MIRROR=$(BUILD_MIRROR) \
|
||||
CUSTOM_PLINTH=$(CUSTOM_PLINTH) CUSTOM_SETUP=$(CUSTOM_SETUP) \
|
||||
IMAGE_SIZE=$(IMAGE_SIZE) taskset 0x01 freedombone-image-make $(NAME)
|
||||
|
||||
# build Beaglebone SD card image
|
||||
beaglebone: prep
|
||||
$(eval ARCHITECTURE = armhf)
|
||||
$(eval MACHINE = beaglebone)
|
||||
$(MAKE_IMAGE)
|
||||
$(TAR) $(ARCHIVE) $(IMAGE)
|
||||
@echo ""
|
||||
$(SIGN)
|
||||
@echo "Build complete."
|
||||
|
||||
# build Cubieboard2 SD card image
|
||||
cubieboard2: prep
|
||||
$(eval ARCHITECTURE = armhf)
|
||||
$(eval MACHINE = cubieboard2)
|
||||
$(MAKE_IMAGE)
|
||||
$(TAR) $(ARCHIVE) $(IMAGE)
|
||||
@echo ""
|
||||
$(SIGN)
|
||||
@echo "Build complete."
|
||||
|
||||
# build an i386 image
|
||||
i386: prep
|
||||
$(eval ARCHITECTURE = i386)
|
||||
$(eval MACHINE = all)
|
||||
$(MAKE_IMAGE)
|
||||
$(TAR) $(ARCHIVE) $(IMAGE)
|
||||
@echo ""
|
||||
$(SIGN)
|
||||
@echo "Build complete."
|
||||
|
||||
# build an amd64 image
|
||||
amd64: prep
|
||||
$(eval ARCHITECTURE = amd64)
|
||||
$(eval MACHINE = all)
|
||||
$(MAKE_IMAGE)
|
||||
$(TAR) $(ARCHIVE) $(IMAGE)
|
||||
@echo ""
|
||||
$(SIGN)
|
||||
@echo "Build complete."
|
||||
|
||||
# build a virtualbox image
|
||||
virtualbox: virtualbox-i386
|
||||
|
||||
virtualbox-i386: prep
|
||||
$(eval ARCHITECTURE = i386)
|
||||
$(eval MACHINE = virtualbox)
|
||||
$(MAKE_IMAGE)
|
||||
# Convert image to vdi hard drive
|
||||
VBoxManage convertdd $(NAME).img $(NAME).vdi
|
||||
$(TAR) $(ARCHIVE) $(NAME).vdi
|
||||
@echo ""
|
||||
$(SIGN)
|
||||
@echo "Build complete."
|
||||
|
||||
virtualbox-amd64: prep
|
||||
$(eval ARCHITECTURE = amd64)
|
||||
$(eval MACHINE = virtualbox)
|
||||
$(MAKE_IMAGE)
|
||||
# Convert image to vdi hard drive
|
||||
VBoxManage convertdd $(NAME).img $(NAME).vdi
|
||||
$(TAR) $(ARCHIVE) $(NAME).vdi
|
||||
@echo ""
|
||||
$(SIGN)
|
||||
@echo "Build complete."
|
||||
|
||||
test: test-virtualbox
|
||||
|
||||
test-virtualbox: virtualbox
|
||||
$(eval VM_NAME = freedom-maker-test)
|
||||
VBoxManage createvm --name $(VM_NAME) --ostype "Debian" --register
|
||||
VBoxManage storagectl $(VM_NAME) --name "SATA Controller" --add sata \
|
||||
--controller IntelAHCI
|
||||
VBoxManage storageattach $(VM_NAME) --storagectl "SATA Controller" \
|
||||
--port 0 --device 0 --type hdd --medium $(NAME).vdi
|
||||
VBoxManage modifyvm $(VM_NAME) --pae on --memory 1024 --vram 128 \
|
||||
--nic1 nat --natpf1 ,tcp,,$(TEST_SSH_PORT),,22
|
||||
VBoxManage startvm $(VM_NAME) --type headless
|
||||
sleep $(TEST_FIRSTRUN_WAIT_TIME) # wait for first-run to complete
|
||||
echo frdm |sshpass -p frdm ssh -o UserKnownHostsFile=/dev/null \
|
||||
-o StrictHostKeyChecking=no -t -t \
|
||||
-p $(TEST_SSH_PORT) fbx@127.0.0.1 \
|
||||
"sudo plinth --diagnose" \
|
||||
|tee build/$(VM_NAME)-results_$(TODAY).log
|
||||
VBoxManage controlvm $(VM_NAME) poweroff
|
||||
VBoxManage modifyvm $(VM_NAME) --hda none
|
||||
VBoxManage unregistervm $(VM_NAME) --delete
|
||||
|
||||
vendor/vmdebootstrap/vmdebootstrap: vendor-patches/vmdebootstrap/*.patch
|
||||
bin/fetch-new-vmdebootstrap
|
||||
|
||||
prep: vendor/vmdebootstrap/vmdebootstrap
|
||||
mkdir -p build
|
||||
|
||||
clean:
|
||||
-rm -f build/freedombone.log
|
||||
|
||||
distclean: clean
|
||||
sudo rm -rf build
|
Loading…
Reference in New Issue