Compare commits
25 Commits
nilmdbuntu
...
wattsworth
Author | SHA1 | Date | |
---|---|---|---|
1ff37216df | |||
406b7db048 | |||
a9cfc6fa0e | |||
99a24ae2fc | |||
81156da6c7 | |||
55771824ce | |||
f14b1684bc | |||
a09d811c72 | |||
7eb6475a55 | |||
24a31b9e6d | |||
a2c4eb6258 | |||
8b49a30144 | |||
eea99fdc1e | |||
884e045cce | |||
46128c518e | |||
812b1803ea | |||
2f71b45b16 | |||
e699801a3b | |||
3618d9815f | |||
c17520bc8a | |||
4ddfa26355 | |||
6318e0a55a | |||
b7ca46922d | |||
cb0da24a7d | |||
70272d3184 |
56
README
56
README
@@ -1,33 +1,41 @@
|
||||
This live CD is customized by roughly following the guidelines at:
|
||||
https://
|
||||
help.ubuntu.com/community/LiveCDCustomization
|
||||
help.ubuntu.com/community/LiveCDCustomizationFromScratch
|
||||
help.ubuntu.com/community/MakeALiveCD/DVD/BootableFlashFromHarddiskInstall
|
||||
plus a lot of other info, like ubiquity and casper source code, and
|
||||
additions for making the resulting iso EFI bootable.
|
||||
Tools to customize an Ubuntu Live CD. Many parts of this will end up
|
||||
being version-specific. The host machine must be running systemd,
|
||||
since the image is executed inside a systemd-nspawn container.
|
||||
|
||||
extractiso.sh
|
||||
extract the original iso
|
||||
Set up host machine, which must be running a recent systemd:
|
||||
|
||||
customize.sh
|
||||
apply customizations
|
||||
sudo apt-get install squashfs-tools xorriso isolinux systemd-container iptables
|
||||
sudo systemctl start systemd-networkd
|
||||
|
||||
enter.sh
|
||||
chroot into the install (for optional manual customization)
|
||||
Choose a config:
|
||||
|
||||
buildiso.sh
|
||||
build the new iso
|
||||
export BUILD_CONFIG=16.04
|
||||
|
||||
run.sh -c
|
||||
boot the iso in qemu with a blank hdd, to test the install
|
||||
Download and extract the original ISO:
|
||||
|
||||
run.sh -d
|
||||
boot the installed hdd in qemu
|
||||
./extractiso.sh
|
||||
|
||||
cleanup.sh
|
||||
remove everything but the isos
|
||||
Apply customizations, both to the outer ISO and the inner image.
|
||||
This will also run customizer-inner.sh inside a container:
|
||||
|
||||
./customize.sh
|
||||
|
||||
SHORT VERSION:
|
||||
time sudo sh -c "env BUILD_CONFIG=12.10 ./full-rebuild.sh"
|
||||
time sudo sh -c "env BUILD_CONFIG=13.04 ./full-rebuild.sh"
|
||||
(Optional) Run and enter a shell in the container, for manual customization:
|
||||
|
||||
./enter.sh
|
||||
|
||||
Build the new ISO:
|
||||
|
||||
./buildiso.sh
|
||||
|
||||
Boot the ISO in QEMU with a blank HDD, to test and install:
|
||||
|
||||
./run.sh -c
|
||||
|
||||
Boot QEMU with the same HDD image as above, to test an "installed" system:
|
||||
|
||||
./run.sh -d
|
||||
|
||||
Remove everything but the ISOs:
|
||||
|
||||
./cleanup.sh
|
||||
|
15
TODO
15
TODO
@@ -1,15 +0,0 @@
|
||||
- Try other Ubuntu/Xubuntu versions
|
||||
|
||||
Problems with 3ce08771a631f9e373f65995fd2114a817326e98:
|
||||
* Ubiquity chooser doesn't have nilmdb background --- skip it!
|
||||
* Theme is still "Greybird" not "Clearlooks"
|
||||
* Icons are still "elementary Xfce dark" not "elementary Xfce"
|
||||
* Change xfdesktop background color to black
|
||||
* Set default firefox homepage to http://nilmdb.com/
|
||||
* /home/nilmdb should have /etc/skel stuff
|
||||
* capture.sh should say skipping
|
||||
* ubiquity still shows release notes?
|
||||
* release notes need to exist
|
||||
* in live CD, ssh_host_dsa_key is ba636e7440..
|
||||
* quiet/splash removal failed --- preseed late_command didn't work
|
||||
* build hybrid iso
|
76
buildiso.sh
76
buildiso.sh
@@ -1,56 +1,80 @@
|
||||
#!/bin/bash
|
||||
|
||||
# build the iso
|
||||
# Build the iso.
|
||||
# Some parts of this (particularly the xorriso command lines) come from
|
||||
# the ubuntu-cdimage project:
|
||||
# http://bazaar.launchpad.net/~ubuntu-cdimage/debian-cd/ubuntu/
|
||||
|
||||
# make sure this was run as root
|
||||
if [ $UID -ne 0 ] ; then
|
||||
echo "Need to be root; trying sudo"
|
||||
exec sudo env BUILD_CONFIG=$BUILD_CONFIG $0 "$@"
|
||||
fi
|
||||
. config || exit 0
|
||||
|
||||
set -x
|
||||
set -e
|
||||
|
||||
if ! [ "$1" == "skip" ] ; then
|
||||
INITRD=${FS}/initrd.img
|
||||
VMLINUZ=$(readlink -f ${FS}/vmlinuz)
|
||||
VMLINUZ_EFI=${VMLINUZ}.efi.signed
|
||||
|
||||
# copy kernel if changed
|
||||
if [ ${FS}/initrd.img -nt ${ISO}/casper/initrd.lz ] ; then
|
||||
sudo cp ${FS}/vmlinuz ${ISO}/casper/vmlinuz
|
||||
sudo sh -c "zcat ${FS}/initrd.img | lzma > ${ISO}/casper/initrd.lz"
|
||||
fi
|
||||
if ! [ "$1" == "justiso" ] ; then
|
||||
|
||||
# manifests
|
||||
sudo chmod +w ${ISO}/casper/filesystem.manifest
|
||||
sudo chroot ${FS} dpkg-query -W --showformat='${Package} ${Version}\n' \
|
||||
| sudo tee ${ISO}/casper/filesystem.manifest >/dev/null
|
||||
|
||||
# squashfs
|
||||
sudo rm -f ${ISO}/casper/filesystem.squashfs
|
||||
sudo mksquashfs ${FS} ${ISO}/casper/filesystem.squashfs
|
||||
printf $(sudo du -sx --block-size=1 ${FS} | cut -f1) \
|
||||
| sudo tee ${ISO}/casper/filesystem.size
|
||||
if ! [ -r ${INITRD} -a -r ${VMLINUZ} -a -r ${VMLINUZ_EFI} ] ; then
|
||||
set +x
|
||||
echo "== Missing kernel and/or initrd. Either upgrade or reinstall"
|
||||
echo "== the kernel inside the image to get the right files."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Recompress initrd if changed
|
||||
if [ ${INITRD} -nt ${ISO}/casper/initrd.lz ] ; then
|
||||
sh -c "zcat ${INITRD} | lzma > ${ISO}/casper/initrd.lz"
|
||||
fi
|
||||
# Get kernel and signed EFI kernel
|
||||
cp ${VMLINUZ} ${ISO}/casper/vmlinuz
|
||||
cp ${VMLINUZ_EFI} ${ISO}/casper/vmlinuz.efi
|
||||
|
||||
# manifests
|
||||
chmod +w ${ISO}/casper/filesystem.manifest
|
||||
chroot ${FS} dpkg-query -W --showformat='${Package} ${Version}\n' \
|
||||
| tee ${ISO}/casper/filesystem.manifest >/dev/null
|
||||
|
||||
# squashfs
|
||||
rm -f ${ISO}/casper/filesystem.squashfs
|
||||
mksquashfs ${FS} ${ISO}/casper/filesystem.squashfs
|
||||
printf $(du -sx --block-size=1 ${FS} | cut -f1) \
|
||||
| tee ${ISO}/casper/filesystem.size
|
||||
|
||||
fi
|
||||
|
||||
# md5sums
|
||||
sudo rm -f md5sum.txt
|
||||
sudo find ${ISO} -type f -print0 \
|
||||
| sudo xargs -0 md5sum \
|
||||
rm -f md5sum.txt
|
||||
find ${ISO} -type f -print0 \
|
||||
| xargs -0 md5sum \
|
||||
| sed -e "s, ${ISO}, .," \
|
||||
| grep -v isolinux/boot.cat \
|
||||
| grep -v isolinux/isolinux.bin \
|
||||
| grep -v md5sum.txt \
|
||||
| sudo tee ${ISO}/md5sum.txt >/dev/null
|
||||
| tee ${ISO}/md5sum.txt >/dev/null
|
||||
|
||||
sudo chown -R ${USER} ${ISO}
|
||||
chown -R ${NONPRIV_UID} ${ISO}
|
||||
|
||||
# build CD
|
||||
xorriso -as mkisofs \
|
||||
-D -r -V "NilmDBuntu ${VERSION}" -cache-inodes -J -l \
|
||||
-input-charset utf-8 -o ${OUTPUT} \
|
||||
-joliet -full-iso9660-filenames \
|
||||
-rational-rock \
|
||||
-V "NILMbuntu ${VERSION}" \
|
||||
-input-charset utf-8 -output ${OUTPUT} \
|
||||
-b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot \
|
||||
-boot-load-size 4 -boot-info-table \
|
||||
-eltorito-alt-boot -e boot/grub/efi.img -no-emul-boot \
|
||||
-isohybrid-mbr /usr/lib/ISOLINUX/isohdpfx.bin \
|
||||
-isohybrid-gpt-basdat -isohybrid-apm-hfsplus \
|
||||
${ISO}
|
||||
|
||||
# fix iso for hybrid booting
|
||||
isohybrid ${OUTPUT}
|
||||
|
||||
set +x
|
||||
echo "Burn it with:"
|
||||
echo " growisofs -dvd-compat -Z /dev/dvd=${OUTPUT}"
|
||||
|
@@ -3,9 +3,4 @@
|
||||
# delete all temporary stuff
|
||||
. config || exit 0
|
||||
|
||||
sudo umount ${FS}/dev/pts || true
|
||||
sudo umount ${FS}/sys/kernel/security || true
|
||||
sudo umount ${FS}/sys || true
|
||||
sudo umount ${FS}/proc || true
|
||||
sudo umount mnt || true
|
||||
sudo rm --one-file-system -rf ${FS} ${ISO} ${MNT} ${DISK}
|
||||
|
8
config
8
config
@@ -1,9 +1,13 @@
|
||||
#!/bin/bash
|
||||
|
||||
if [ -z "$BUILD_CONFIG" ] ; then
|
||||
echo "Set BUILD_CONFIG first"
|
||||
exit 1
|
||||
export BUILD_CONFIG=16.04
|
||||
echo "No BUILD_CONFIG set -- assuming $BUILD_CONFIG"
|
||||
fi
|
||||
|
||||
echo "Loading config file: config-$BUILD_CONFIG"
|
||||
. config-$BUILD_CONFIG
|
||||
# echo " Ubuntu version: ${VERSION}"
|
||||
# echo " Input ISO: ${ISONAME}"
|
||||
# echo " from: ${ORIGURL}"
|
||||
# echo " Output ISO: ${OUTPUT}"
|
||||
|
17
config-12.10
17
config-12.10
@@ -1,17 +0,0 @@
|
||||
# output image
|
||||
VERSION="12.10.1"
|
||||
OUTPUT="nilmdbuntu-${VERSION}.iso"
|
||||
|
||||
# original ISOs
|
||||
ISONAME="xubuntu-12.10-desktop-amd64.iso"
|
||||
ORIG="tmp-12.10/$ISONAME"
|
||||
ORIGURL="http://cdimage.ubuntu.com/xubuntu/releases/12.10/release/$ISONAME"
|
||||
|
||||
# work directories, temporary qemu HD image
|
||||
FS="tmp-12.10/fs"
|
||||
ISO="tmp-12.10/iso"
|
||||
MNT="tmp-12.10/mnt"
|
||||
DISK="tmp-12.10/disk.img"
|
||||
|
||||
# local user
|
||||
USER=jim:jim
|
17
config-13.04
17
config-13.04
@@ -1,17 +0,0 @@
|
||||
# output image
|
||||
VERSION="13.04.1"
|
||||
OUTPUT="nilmdbuntu-${VERSION}.iso"
|
||||
|
||||
# original ISOs
|
||||
ISONAME="xubuntu-13.04-desktop-amd64.iso"
|
||||
ORIG="tmp-13.04/$ISONAME"
|
||||
ORIGURL="http://cdimage.ubuntu.com/xubuntu/releases/13.04/release/$ISONAME"
|
||||
|
||||
# work directories, temporary qemu HD image
|
||||
FS="tmp-13.04/fs"
|
||||
ISO="tmp-13.04/iso"
|
||||
MNT="tmp-13.04/mnt"
|
||||
DISK="tmp-13.04/disk.img"
|
||||
|
||||
# local user
|
||||
USER=jim:jim
|
19
config-16.04
Normal file
19
config-16.04
Normal file
@@ -0,0 +1,19 @@
|
||||
# -*- sh -*-
|
||||
|
||||
# output image
|
||||
VERSION="16.04"
|
||||
OUTPUT="nilmbuntu-${VERSION}.iso"
|
||||
|
||||
# original ISO
|
||||
ISONAME="xubuntu-${VERSION}-desktop-amd64.iso"
|
||||
ORIGURL="http://cdimage.ubuntu.com/xubuntu/releases/${VERSION}/release/${ISONAME}"
|
||||
|
||||
# work directories, temporary qemu HD image, etc. Shouldn't need to change these.
|
||||
ORIG="tmp-${VERSION}/$ISONAME"
|
||||
FS="tmp-${VERSION}/fs"
|
||||
ISO="tmp-${VERSION}/iso"
|
||||
MNT="tmp-${VERSION}/mnt"
|
||||
DISK="tmp-${VERSION}/disk.img"
|
||||
|
||||
# non-privileged user, so we don't need to do everything as root
|
||||
NONPRIV_UID=${SUDO_UID:-$UID}
|
@@ -11,7 +11,9 @@ set -x
|
||||
try_install() {
|
||||
# try to install packages, but ignore failure
|
||||
for pkg in "$@"; do
|
||||
apt-get -y install "$pkg" || true
|
||||
if ! apt-get -y install "$pkg" ; then
|
||||
echo ---- WARNING: Failed to install package: $pkg
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
@@ -19,32 +21,23 @@ try_install() {
|
||||
cat >/etc/casper.conf <<"EOF"
|
||||
export USERNAME="ubuntu"
|
||||
export USERFULLNAME="Live session user"
|
||||
export HOST="nilmdb"
|
||||
export HOST="nilmbuntu"
|
||||
export BUILD_SYSTEM="Ubuntu"
|
||||
export FLAVOUR="NilmDBuntu"
|
||||
export FLAVOUR="NILMbuntu"
|
||||
EOF
|
||||
|
||||
# Upgrade packages, remove old kernels
|
||||
# Upgrade packages and remove old kernels
|
||||
apt-get update
|
||||
# in 13.04, doing upgrade & dist-upgrade together tries to install 2 kernels
|
||||
# at the same time, which breaks for some reason. Also, try the upgrade
|
||||
# multiple times since that can help
|
||||
apt-get -y upgrade || apt-get -y upgrade || true
|
||||
apt-get -y dist-upgrade || apt-get -y dist-upgrade || true
|
||||
apt-get -y dist-upgrade
|
||||
apt-get -y --purge autoremove
|
||||
for VER in $(ls --sort=version /lib/modules/ | head -n -1) ; do
|
||||
apt-get -y --purge remove ".*$VER.*"
|
||||
apt-get -y --purge remove "linux-.*$VER"
|
||||
done
|
||||
|
||||
# Disable upgrade popups
|
||||
sed -i -s -e 's/Prompt=normal/Prompt=never/g' \
|
||||
sed -i -s -e 's/Prompt=.*/Prompt=never/g' \
|
||||
/etc/update-manager/release-upgrades || true
|
||||
|
||||
# some stuff we need from Ubuntu
|
||||
try_install \
|
||||
wbritish \
|
||||
thunderbird-locale-en-us
|
||||
|
||||
# Set up & install postfix for local mail delivery
|
||||
debconf-set-selections <<"EOF"
|
||||
postfix postfix/mailname string localdomain
|
||||
@@ -52,8 +45,9 @@ postfix postfix/main_mailer_type select Local only
|
||||
EOF
|
||||
apt-get -y install postfix
|
||||
|
||||
# install nilmdb things
|
||||
# Required packages
|
||||
apt-get -y install \
|
||||
python3 \
|
||||
python2.7 \
|
||||
python2.7-dev \
|
||||
python-setuptools \
|
||||
@@ -77,261 +71,237 @@ apt-get -y install \
|
||||
python-scipy \
|
||||
python-daemon
|
||||
|
||||
# install other useful but optional stuff
|
||||
# Install other useful but optional stuff
|
||||
try_install \
|
||||
emacs-goodies-el \
|
||||
emacs23-nox \
|
||||
octave \
|
||||
octave-signal \
|
||||
octave-missing-functions \
|
||||
gnuplot \
|
||||
curl \
|
||||
gddrescue \
|
||||
help2man \
|
||||
luatex \
|
||||
pgf \
|
||||
moreutils \
|
||||
ntfsprogs \
|
||||
subversion \
|
||||
devscripts \
|
||||
dlocate \
|
||||
ack-grep \
|
||||
mutt \
|
||||
python-matplotlib \
|
||||
emacs \
|
||||
emacs-goodies-el \
|
||||
gcc-arm-none-eabi \
|
||||
gdb-arm-none-eabi \
|
||||
gddrescue \
|
||||
gnuplot \
|
||||
help2man \
|
||||
ipython \
|
||||
openvpn \
|
||||
libnewlib-arm-none-eabi \
|
||||
libstdc++-arm-none-eabi-newlib \
|
||||
texlive \
|
||||
mailutils \
|
||||
moreutils \
|
||||
mutt \
|
||||
network-manager-openvpn-gnome \
|
||||
openssl
|
||||
|
||||
# required
|
||||
apt-get -y install \
|
||||
openssh-server
|
||||
octave \
|
||||
octave-missing-functions \
|
||||
octave-signal \
|
||||
openocd \
|
||||
openssl \
|
||||
openvpn \
|
||||
python-matplotlib \
|
||||
screen \
|
||||
silversearcher-ag \
|
||||
subversion \
|
||||
tcpdump \
|
||||
zip
|
||||
|
||||
# Set up timezone to America/New_York for the live CD
|
||||
echo America/New_York > /etc/timezone
|
||||
ln -sf /usr/share/zoneinfo/America/New_York /etc/localtime
|
||||
dpkg-reconfigure -f noninteractive tzdata
|
||||
|
||||
# Create nilmdb user to run the database
|
||||
adduser --system --group --shell /bin/bash --disabled-password nilmdb
|
||||
cp -rv /etc/skel/.??* /home/nilmdb
|
||||
chown -R nilmdb:nilmdb /home/nilmdb
|
||||
|
||||
# Create WSGI scripts
|
||||
cat > /home/nilmdb/nilmdb.wsgi <<"EOF"
|
||||
import nilmdb.server
|
||||
application = nilmdb.server.wsgi_application("/home/nilmdb/db","/nilmdb")
|
||||
EOF
|
||||
cat > /home/nilmdb/nilmrun.wsgi <<"EOF"
|
||||
import nilmrun.server
|
||||
application = nilmrun.server.wsgi_application("/nilmrun")
|
||||
EOF
|
||||
|
||||
# Create apache config by hacking up the default one. Might be a better way
|
||||
# to do this, and it'll probably break on apache 2.4, but...
|
||||
DEF=/etc/apache2/sites-available/default
|
||||
perl -ne 'print unless /## NilmDB start/../## NilmDB end/' $DEF > $DEF.orig
|
||||
perl -ne 'print unless m-^[^#]*</VirtualHost>-..1' $DEF.orig > $DEF
|
||||
cat >>$DEF <<"EOF"
|
||||
## NilmDB start
|
||||
WSGIScriptAlias /nilmdb /home/nilmdb/nilmdb.wsgi
|
||||
WSGIDaemonProcess nilmdb-procgroup threads=32 user=nilmdb group=nilmdb
|
||||
<Location /nilmdb>
|
||||
WSGIProcessGroup nilmdb-procgroup
|
||||
WSGIApplicationGroup nilmdb-appgroup
|
||||
</Location>
|
||||
|
||||
WSGIScriptAlias /nilmrun /home/nilmdb/nilmrun.wsgi
|
||||
WSGIDaemonProcess nilmrun-procgroup threads=32 user=nilmdb group=nilmdb
|
||||
<Location /nilmrun>
|
||||
WSGIProcessGroup nilmrun-procgroup
|
||||
WSGIApplicationGroup nilmrun-appgroup
|
||||
</Location>
|
||||
## NilmDB end
|
||||
EOF
|
||||
perl -ne 'print if m-^[^#]*</VirtualHost>-..1' $DEF.orig >> $DEF
|
||||
|
||||
# Create nilmdb capture, processing, and cleanup files
|
||||
cat > /home/nilmdb/capture.sh <<"EOF"
|
||||
#!/bin/bash -e
|
||||
|
||||
# Don't run capture if we're running off a live CD
|
||||
if grep -q boot=casper /proc/cmdline ; then
|
||||
echo "Skipping capture, because this is a live CD."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "Starting capture in background..."
|
||||
nilm-pipewatch --daemon --lock "/tmp/nilmdb-capture.lock" --timeout 30 \
|
||||
"ethstream -a 192.168.1.209 -n 6 -r 8000" \
|
||||
"nilm-insert -m 10 -r 8000 --live /data/raw"
|
||||
EOF
|
||||
cat > /home/nilmdb/process.sh <<"EOF"
|
||||
#!/bin/bash -e
|
||||
|
||||
# Ensure only one copy of this code runs at a time:
|
||||
LOCKFILE="/tmp/nilmdb-process.lock"
|
||||
exec 99>"$LOCKFILE"
|
||||
flock -n -x 99 || exit 0
|
||||
trap 'rm -f "$LOCKFILE"' 0
|
||||
|
||||
nilm-sinefit -c 4 /data/raw /data/sinefit
|
||||
nilm-prep -c 1 -r 0 /data/raw /data/sinefit /data/prep-a
|
||||
nilm-prep -c 2 -r 120 /data/raw /data/sinefit /data/prep-b
|
||||
nilm-prep -c 3 -r 240 /data/raw /data/sinefit /data/prep-c
|
||||
nilm-decimate-auto /data/raw "/data/prep*"
|
||||
nilm-cleanup --yes /home/nilmdb/cleanup.cfg
|
||||
EOF
|
||||
cat > /home/nilmdb/cleanup.cfg <<"EOF"
|
||||
[/data/prep-*]
|
||||
keep = 1y
|
||||
|
||||
[/data/raw]
|
||||
keep = 2w
|
||||
|
||||
[/data/sinefit]
|
||||
keep = 1y
|
||||
decimated = false
|
||||
EOF
|
||||
|
||||
# Set up crontab
|
||||
cat > /home/nilmdb/crontab <<"EOF"
|
||||
SHELL=/bin/bash
|
||||
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
|
||||
# Run capture and processing scripts every 5 minutes
|
||||
*/5 * * * * chronic /home/nilmdb/capture.sh
|
||||
*/5 * * * * chronic /home/nilmdb/process.sh
|
||||
|
||||
# Try to run nilmdb-fsck on boot. It should hopefully run before
|
||||
# apache opens the database, and apache will return errors to clients
|
||||
# until nilmdb-fsck is done.
|
||||
@reboot chronic nilmdb-fsck --fix --no-data /home/nilmdb/db
|
||||
EOF
|
||||
crontab -u nilmdb /home/nilmdb/crontab
|
||||
|
||||
# Fix permissions
|
||||
chown -R nilmdb:nilmdb /home/nilmdb
|
||||
chmod +x /home/nilmdb/{capture,process}.sh
|
||||
|
||||
# Fetch and build everything. Put it in the nilmdb dir
|
||||
echo "machine git.jim.sh login nilm password nilm" > /home/nilmdb/.netrc
|
||||
GIT=https://git.jim.sh/jim/lees
|
||||
rm -rf /home/nilmdb/git
|
||||
mkdir /home/nilmdb/git
|
||||
chown nilmdb:nilmdb /home/nilmdb/.netrc /home/nilmdb/git
|
||||
REPOS="nilmdb nilmtools nilmrun ethstream"
|
||||
|
||||
# check it out as nilmdb, so the .netrc gets used
|
||||
for repo in $REPOS; do
|
||||
sudo -i -u nilmdb git clone $GIT/$repo.git git/$repo
|
||||
done
|
||||
|
||||
# build as root, because we need to do that for the install
|
||||
for repo in $REPOS; do
|
||||
make -C /home/nilmdb/git/$repo install
|
||||
done
|
||||
|
||||
# fix up all permissions in git dir, so nilmdb user can play with it later
|
||||
chown -R nilmdb:nilmdb /home/nilmdb/git
|
||||
|
||||
# Create the initial database and streams by running the standalone
|
||||
# server as nilmdb, making the right nilmtool calls, and killing it.
|
||||
sudo -i -u nilmdb nilmdb-server -a 127.0.0.1 -p 18646 -d /home/nilmdb/db &
|
||||
SERVERPID=$!
|
||||
trap "kill -9 $SERVERPID" 0
|
||||
for i in $(seq 1 120) ; do
|
||||
sleep 1
|
||||
echo waiting for nilmdb to start $i
|
||||
if nilmtool -u http://127.0.0.1:18646/ info ; then
|
||||
break
|
||||
fi
|
||||
done
|
||||
nilmtool -u http://127.0.0.1:18646/ destroy -R "/data/*" || true
|
||||
nilmtool -u http://127.0.0.1:18646/ create /data/raw uint16_6
|
||||
nilmtool -u http://127.0.0.1:18646/ create /data/sinefit float32_3
|
||||
nilmtool -u http://127.0.0.1:18646/ create /data/prep-a float32_8
|
||||
nilmtool -u http://127.0.0.1:18646/ create /data/prep-b float32_8
|
||||
nilmtool -u http://127.0.0.1:18646/ create /data/prep-c float32_8
|
||||
kill $SERVERPID
|
||||
wait
|
||||
trap "" 0
|
||||
|
||||
# Put some default desktop shortcuts in place
|
||||
DESKTOP=/etc/skel/Desktop
|
||||
mkdir -p $DESKTOP
|
||||
cp /usr/share/applications/exo-terminal-emulator.desktop $DESKTOP || true
|
||||
cp /usr/share/applications/exo-web-browser.desktop $DESKTOP || true
|
||||
chmod +x $DESKTOP/* # needs to be executable for 13.04+
|
||||
|
||||
# XFCE / theme customizations
|
||||
if [ -d /usr/share/themes/Clearlooks ] && \
|
||||
[ -d /usr/share/icons/elementary-xfce ] ; then
|
||||
cat > /usr/share/gconf/defaults/88_nilmdbuntu-settings <<"EOF"
|
||||
/desktop/gnome/interface/gtk_theme "Clearlooks"
|
||||
/desktop/gnome/interface/icon_theme "elementary-xfce"
|
||||
EOF
|
||||
update-gconf-defaults
|
||||
fi
|
||||
chmod +x $DESKTOP/*
|
||||
|
||||
# Custom background image (which was already copied in by customize.sh)
|
||||
XML=/etc/xdg/xdg-xubuntu/xfce4/xfconf/xfce-perchannel-xml
|
||||
BG=/usr/share/xfce4/backdrops
|
||||
mkdir -p $XML
|
||||
cat >$XML/xfce4-desktop.xml <<"EOF"
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
sed -i -s -e 's/xubuntu-wallpaper.png/nilmbuntu.png/g' $XML/xfce4-desktop.xml
|
||||
|
||||
<channel name="xfce4-desktop" version="1.0">
|
||||
<property name="desktop-icons" type="empty">
|
||||
<property name="style" type="int" value="2"/>
|
||||
<property name="file-icons" type="empty">
|
||||
<property name="show-home" type="bool" value="true"/>
|
||||
<property name="show-filesystem" type="bool" value="true"/>
|
||||
<property name="show-removable" type="bool" value="true"/>
|
||||
<property name="show-trash" type="bool" value="true"/>
|
||||
</property>
|
||||
</property>
|
||||
<property name="backdrop" type="empty">
|
||||
<property name="screen0" type="empty">
|
||||
<property name="monitor0" type="empty">
|
||||
<property name="image-path" type="string"
|
||||
value="/usr/share/xfce4/backdrops/nilmdbuntu.png"/>
|
||||
<property name="image-show" type="bool" value="true"/>
|
||||
<property name="image-style" type="int" value="4"/>
|
||||
<property name="color-style" type="int" value="0"/>
|
||||
<property name="color1" type="array">
|
||||
<value type="uint" value="0"/>
|
||||
<value type="uint" value="0"/>
|
||||
<value type="uint" value="0"/>
|
||||
<value type="uint" value="65535"/>
|
||||
</property>
|
||||
</property>
|
||||
<property name="monitor1" type="empty">
|
||||
<property name="image-path" type="string"
|
||||
value="/usr/share/xfce4/backdrops/nilmdbuntu.png"/>
|
||||
<property name="image-show" type="bool" value="true"/>
|
||||
<property name="image-style" type="int" value="4"/>
|
||||
<property name="color-style" type="int" value="0"/>
|
||||
<property name="color1" type="array">
|
||||
<value type="uint" value="0"/>
|
||||
<value type="uint" value="0"/>
|
||||
<value type="uint" value="0"/>
|
||||
<value type="uint" value="65535"/>
|
||||
</property>
|
||||
</property>
|
||||
</property>
|
||||
</property>
|
||||
</channel>
|
||||
# Configure Firefox with our default homepage
|
||||
HOMEPAGE="http://www.wattsworth.net/"
|
||||
cat >/etc/firefox/syspref.js <<EOF
|
||||
pref("browser.startup.homepage", "${HOMEPAGE}");
|
||||
pref("extensions.ubufox@ubuntu.com.custom_homepage", "${HOMEPAGE}");
|
||||
pref("browser.startup.homepage_override.mstone", "ignore");
|
||||
EOF
|
||||
sed -i -s -e 's/Greybird/Default/g' $XML/xfwm4.xml || true
|
||||
sed -i -s -e 's/Greybird/Clearlooks/g' $XML/xsettings.xml || true
|
||||
sed -i -s -e \
|
||||
's/elementary-xfce-dark/elementary-xfce/g' $XML/xsettings.xml || true
|
||||
|
||||
# Firefox defaults
|
||||
cat >/etc/firefox/syspref.js <<"EOF"
|
||||
pref("browser.startup.homepage", "http://nilmdb.com/");
|
||||
EOF
|
||||
cat >/etc/xul-ext/homepage.properties <<"EOF"
|
||||
browser.startup.homepage=http://nilmdb.com/
|
||||
EOF
|
||||
cat >/etc/xul-ext/ubufox.js <<"EOF"
|
||||
pref("browser.startup.homepage", "file:/etc/xul-ext/homepage.properties");
|
||||
EOF
|
||||
# NilmDB setup below...
|
||||
|
||||
# # Create nilmdb user to run the database
|
||||
# adduser --system --group --shell /bin/bash --disabled-password nilmdb
|
||||
# cp -rv /etc/skel/.??* /home/nilmdb
|
||||
# chown -R nilmdb:nilmdb /home/nilmdb
|
||||
|
||||
# # Create WSGI scripts
|
||||
# cat > /home/nilmdb/nilmdb.wsgi <<"EOF"
|
||||
# import nilmdb.server
|
||||
# application = nilmdb.server.wsgi_application("/home/nilmdb/db","/nilmdb")
|
||||
# EOF
|
||||
# cat > /home/nilmdb/nilmrun.wsgi <<"EOF"
|
||||
# import nilmrun.server
|
||||
# application = nilmrun.server.wsgi_application("/nilmrun")
|
||||
# EOF
|
||||
|
||||
# #### Edit apache config
|
||||
|
||||
# # Create apache config by hacking up the default one. Might be a better way
|
||||
# # to do this, and it'll probably break on new versions, but...
|
||||
|
||||
# APACHE_VER=$(dpkg -s apache2 | grep ^Version | cut -d ' ' -f 2)
|
||||
# if dpkg --compare-versions $APACHE_VER ge 2.4 ; then
|
||||
# DEF=/etc/apache2/sites-available/000-default.conf
|
||||
# NEED_PERMISSIONS=1
|
||||
# else
|
||||
# DEF=/etc/apache2/sites-available/default
|
||||
# NEED_PERMISSIONS=0
|
||||
# fi
|
||||
|
||||
# # Cut out any existing NilmDB stuff
|
||||
# perl -ne 'print unless /## NilmDB start/../## NilmDB end/' $DEF > $DEF.orig
|
||||
|
||||
# # Copy everything up to the first </VirtualHost> line
|
||||
# perl -ne 'print unless m-^[^#]*</VirtualHost>-..1' $DEF.orig > $DEF
|
||||
|
||||
# # Add the NilmDB config
|
||||
# cat >>$DEF <<"EOF"
|
||||
# ## NilmDB start
|
||||
# WSGIScriptAlias /nilmdb /home/nilmdb/nilmdb.wsgi
|
||||
# WSGIDaemonProcess nilmdb-procgroup threads=32 user=nilmdb group=nilmdb
|
||||
# <Location /nilmdb>
|
||||
# WSGIProcessGroup nilmdb-procgroup
|
||||
# WSGIApplicationGroup nilmdb-appgroup
|
||||
# </Location>
|
||||
|
||||
# WSGIScriptAlias /nilmrun /home/nilmdb/nilmrun.wsgi
|
||||
# WSGIDaemonProcess nilmrun-procgroup threads=32 user=nilmdb group=nilmdb
|
||||
# <Location /nilmrun>
|
||||
# WSGIProcessGroup nilmrun-procgroup
|
||||
# WSGIApplicationGroup nilmrun-appgroup
|
||||
# </Location>
|
||||
# EOF
|
||||
# if [ $NEED_PERMISSIONS == 1 ] ; then
|
||||
# cat >>$DEF <<"EOF"
|
||||
|
||||
# <Directory /home/nilmdb>
|
||||
# Options All
|
||||
# AllowOverride All
|
||||
# Require all granted
|
||||
# </Directory>
|
||||
# EOF
|
||||
# fi
|
||||
# cat >>$DEF <<"EOF"
|
||||
# ## NilmDB end
|
||||
# EOF
|
||||
|
||||
# # Copy everything including and after the first </VirtualHost> line
|
||||
# perl -ne 'print if m-^[^#]*</VirtualHost>-..1' $DEF.orig >> $DEF
|
||||
|
||||
# #### Done editing apache config
|
||||
|
||||
# # Create nilmdb capture, processing, and cleanup files
|
||||
# cat > /home/nilmdb/capture.sh <<"EOF"
|
||||
# #!/bin/bash -e
|
||||
|
||||
# # Don't run capture if we're running off a live CD
|
||||
# if grep -q boot=casper /proc/cmdline ; then
|
||||
# echo "Skipping capture, because this is a live CD."
|
||||
# exit 0
|
||||
# fi
|
||||
|
||||
# echo "Starting capture in background..."
|
||||
# nilm-pipewatch --daemon --lock "/tmp/nilmdb-capture.lock" --timeout 30 \
|
||||
# "ethstream -a 192.168.1.209 -n 6 -r 8000" \
|
||||
# "nilm-insert -m 10 -r 8000 --live /data/raw"
|
||||
# EOF
|
||||
# cat > /home/nilmdb/process.sh <<"EOF"
|
||||
# #!/bin/bash -e
|
||||
|
||||
# # Ensure only one copy of this code runs at a time:
|
||||
# LOCKFILE="/tmp/nilmdb-process.lock"
|
||||
# exec 99>"$LOCKFILE"
|
||||
# flock -n -x 99 || exit 0
|
||||
# trap 'rm -f "$LOCKFILE"' 0
|
||||
|
||||
# nilm-sinefit -c 4 /data/raw /data/sinefit
|
||||
# nilm-prep -c 1 -r 0 /data/raw /data/sinefit /data/prep-a
|
||||
# nilm-prep -c 2 -r 120 /data/raw /data/sinefit /data/prep-b
|
||||
# nilm-prep -c 3 -r 240 /data/raw /data/sinefit /data/prep-c
|
||||
# nilm-decimate-auto /data/raw "/data/prep*"
|
||||
# nilm-cleanup --yes /home/nilmdb/cleanup.cfg
|
||||
# EOF
|
||||
# cat > /home/nilmdb/cleanup.cfg <<"EOF"
|
||||
# [/data/prep-*]
|
||||
# keep = 1y
|
||||
|
||||
# [/data/raw]
|
||||
# keep = 2w
|
||||
|
||||
# [/data/sinefit]
|
||||
# keep = 1y
|
||||
# decimated = false
|
||||
# EOF
|
||||
|
||||
# # Set up crontab
|
||||
# cat > /home/nilmdb/crontab <<"EOF"
|
||||
# SHELL=/bin/bash
|
||||
# PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
|
||||
# # Run capture and processing scripts every 5 minutes
|
||||
# */5 * * * * chronic /home/nilmdb/capture.sh
|
||||
# */5 * * * * chronic /home/nilmdb/process.sh
|
||||
|
||||
# # Try to run nilmdb-fsck on boot. It should hopefully run before
|
||||
# # apache opens the database, and apache will return errors to clients
|
||||
# # until nilmdb-fsck is done.
|
||||
# @reboot chronic nilmdb-fsck --fix --no-data /home/nilmdb/db
|
||||
# EOF
|
||||
# crontab -u nilmdb /home/nilmdb/crontab
|
||||
|
||||
# # Fix permissions
|
||||
# chown -R nilmdb:nilmdb /home/nilmdb
|
||||
# chmod +x /home/nilmdb/{capture,process}.sh
|
||||
|
||||
# # Fetch and build everything. Put it in the nilmdb dir
|
||||
# echo "machine git.jim.sh login nilm password nilm" > /home/nilmdb/.netrc
|
||||
# GIT=https://git.jim.sh/jim/lees
|
||||
# rm -rf /home/nilmdb/git
|
||||
# mkdir /home/nilmdb/git
|
||||
# chown nilmdb:nilmdb /home/nilmdb/.netrc /home/nilmdb/git
|
||||
# REPOS="nilmdb nilmtools nilmrun ethstream"
|
||||
|
||||
# # check it out as nilmdb, so the .netrc gets used
|
||||
# for repo in $REPOS; do
|
||||
# sudo -i -u nilmdb git clone $GIT/$repo.git git/$repo
|
||||
# done
|
||||
|
||||
# # build as root, because we need to do that for the install
|
||||
# for repo in $REPOS; do
|
||||
# make -C /home/nilmdb/git/$repo install
|
||||
# done
|
||||
|
||||
# # fix up all permissions in git dir, so nilmdb user can play with it later
|
||||
# chown -R nilmdb:nilmdb /home/nilmdb/git
|
||||
|
||||
# # Create the initial database and streams by running the standalone
|
||||
# # server as nilmdb, making the right nilmtool calls, and killing it.
|
||||
# sudo -i -u nilmdb nilmdb-server -a 127.0.0.1 -p 18646 -d /home/nilmdb/db &
|
||||
# SERVERPID=$!
|
||||
# trap "kill -9 $SERVERPID" 0
|
||||
# for i in $(seq 1 120) ; do
|
||||
# sleep 1
|
||||
# echo waiting for nilmdb to start $i
|
||||
# if nilmtool -u http://127.0.0.1:18646/ info ; then
|
||||
# break
|
||||
# fi
|
||||
# done
|
||||
# nilmtool -u http://127.0.0.1:18646/ destroy -R "/data/*" || true
|
||||
# nilmtool -u http://127.0.0.1:18646/ create /data/raw uint16_6
|
||||
# nilmtool -u http://127.0.0.1:18646/ create /data/sinefit float32_3
|
||||
# nilmtool -u http://127.0.0.1:18646/ create /data/prep-a float32_8
|
||||
# nilmtool -u http://127.0.0.1:18646/ create /data/prep-b float32_8
|
||||
# nilmtool -u http://127.0.0.1:18646/ create /data/prep-c float32_8
|
||||
# kill $SERVERPID
|
||||
# wait
|
||||
# trap "" 0
|
||||
|
25
customize.sh
25
customize.sh
@@ -6,16 +6,16 @@ set -x
|
||||
|
||||
# Customize the outer ISO image
|
||||
sed -i -s -e \
|
||||
"s/DISKNAME.*/DISKNAME NilmDBuntu $VERSION by Jim Paris/" \
|
||||
"s/DISKNAME.*/DISKNAME NILMbuntu $VERSION/" \
|
||||
${ISO}/README.diskdefines
|
||||
|
||||
# The .disk/info file is important -- it's used by ubiquity to extract
|
||||
# out the distro name in dialogs, and I think casper might use it too
|
||||
echo "NilmDBuntu $VERSION by Jim Paris" > ${ISO}/.disk/info
|
||||
echo "NILMbuntu $VERSION" > ${ISO}/.disk/info
|
||||
|
||||
# Set up preseed file
|
||||
cp ${ISO}/preseed/xubuntu.seed ${ISO}/preseed/nilmdbuntu.seed
|
||||
cat >> ${ISO}/preseed/nilmdbuntu.seed <<"EOF"
|
||||
cp ${ISO}/preseed/xubuntu.seed ${ISO}/preseed/nilmbuntu.seed
|
||||
cat >> ${ISO}/preseed/nilmbuntu.seed <<"EOF"
|
||||
# Commands to run on successful install:
|
||||
# - Regenerate SSH host keys
|
||||
# - Remove "quiet splash" from grub command line
|
||||
@@ -35,7 +35,8 @@ ubiquity ubiquity/success_command string \
|
||||
umount /target/$i; done; \
|
||||
echo "success_command done" >>/target/var/log/installer/postinst.log
|
||||
|
||||
# Default user. Ubiquity should let them change this
|
||||
# Default user. Ubiquity should let them change this.
|
||||
# (To skip the dialog completely, maybe set a password?)
|
||||
d-i passwd/user-fullname string NILM User
|
||||
d-i passwd/username string nilm
|
||||
#d-i passwd/user-password password nilm
|
||||
@@ -45,24 +46,24 @@ d-i passwd/auto-login boolean true
|
||||
EOF
|
||||
|
||||
# Set up isolinux how we want by editing its config
|
||||
TRY="Boot ^NilmDBuntu ${VERSION}"
|
||||
TRY="Boot ^NILMbuntu ${VERSION}"
|
||||
cp splash.png ${ISO}/isolinux/splash.png
|
||||
perl -n -i \
|
||||
-e '$n=1 if /^label/; $n=2 if /^label live-install/; next if $n==2;' \
|
||||
-e "s/menu label.*(Try|NilmDBuntu).*/menu label $TRY/g;" \
|
||||
-e "s,preseed/.*[.]seed,preseed/nilmdbuntu.seed,g;" \
|
||||
-e "s/menu label.*(Try|NILM).*/menu label $TRY/g;" \
|
||||
-e "s,preseed/.*[.]seed,preseed/nilmbuntu.seed,g;" \
|
||||
-e "s/ quiet splash//g;" \
|
||||
-e "print;" \
|
||||
${ISO}/isolinux/txt.cfg
|
||||
sed -i -s -e "s/^ui gfxboot/# ui gfxboot/g;" ${ISO}/isolinux/isolinux.cfg
|
||||
|
||||
# Set up grub similarly
|
||||
TRY="Boot NilmDBuntu ${VERSION}"
|
||||
TRY="Boot NILMbuntu ${VERSION}"
|
||||
perl -n -i \
|
||||
-e "next if /menuentry \"Install/../^}$/;" \
|
||||
-e "next if /menuentry \"OEM install/../^}$/;" \
|
||||
-e "s/menuentry \"(Try|NilmDBuntu).*\" {/menuentry \"${TRY}\" {/g;" \
|
||||
-e "s,preseed/.*[.]seed,preseed/nilmdbuntu.seed,g;" \
|
||||
-e "s/menuentry \"(Try|NILM).*\" \{/menuentry \"${TRY}\" {/g;" \
|
||||
-e "s,preseed/.*[.]seed,preseed/nilmbuntu.seed,g;" \
|
||||
-e "s/ quiet splash//g;" \
|
||||
-e "print;" \
|
||||
${ISO}/boot/grub/{grub,loopback}.cfg
|
||||
@@ -70,7 +71,7 @@ perl -n -i \
|
||||
if ! [ "$1" == "skip" ] ; then
|
||||
|
||||
# Run the customize-inner.sh script inside the chroot
|
||||
sudo cp nilmdbuntu.png ${FS}/usr/share/xfce4/backdrops/nilmdbuntu.png
|
||||
sudo cp nilmbuntu.png ${FS}/usr/share/xfce4/backdrops/nilmbuntu.png
|
||||
sudo cp customize-inner.sh ${FS}/root/customize-inner.sh
|
||||
sudo chmod +x ${FS}/root/customize-inner.sh
|
||||
./enter.sh "cd /root ; ./customize-inner.sh"
|
||||
|
143
enter.sh
143
enter.sh
@@ -5,20 +5,91 @@ if [ $UID -ne 0 ] ; then
|
||||
echo "Need to be root; trying sudo"
|
||||
exec sudo env BUILD_CONFIG=$BUILD_CONFIG $0 "$@"
|
||||
fi
|
||||
|
||||
# enter the chroot and run the command (if supplied) or a shell
|
||||
. config || exit 0
|
||||
|
||||
# Spawn a systemd container that boots the machine, then run the given
|
||||
# command. We can't execute systemd-nspawn directly, because that
|
||||
# only allows us to either boot the machine, or run a command (not
|
||||
# both). Instead let's execute systemd-nspawn in a transient systemd
|
||||
# unit, then enter it using machinectl.
|
||||
|
||||
UNIT=nilmbuntu-run-$VERSION
|
||||
MACH=nilmbuntu-$VERSION
|
||||
|
||||
setup_networking() {
|
||||
# We use a virtual ethernet adapter -- this requires that
|
||||
# systemd-networkd is installed and running on the host.
|
||||
if ! systemctl is-active systemd-networkd ; then
|
||||
echo "Starting systemd-networkd"
|
||||
systemctl start systemd-networkd
|
||||
fi
|
||||
|
||||
# However, the current systemd-networkd from Debian is broken and
|
||||
# won't enable masquerading -- so do it manually
|
||||
IFACE=$(ip -4 route list default | head -1 | awk '{print $5}')
|
||||
echo 1 > /proc/sys/net/ipv4/ip_forward
|
||||
iptables -t nat -D POSTROUTING -o $IFACE -j MASQUERADE >/dev/null || true
|
||||
iptables -t nat -A POSTROUTING -o $IFACE -j MASQUERADE
|
||||
}
|
||||
|
||||
kill_container() {
|
||||
# Kill any running container
|
||||
if systemctl --quiet is-active $UNIT ; then
|
||||
echo "Stopping container..."
|
||||
# We could use "machinectl terminate", but that will wait
|
||||
# for a clean shutdown or timeout; we don't need a clean
|
||||
# shutdown, so send a SIGTERM twice to get systemd-nspawn
|
||||
# to terminate pretty quickly
|
||||
systemctl kill $UNIT
|
||||
sleep 2
|
||||
systemctl kill $UNIT
|
||||
|
||||
# Then wait for it to really stop
|
||||
systemctl stop $UNIT
|
||||
fi
|
||||
|
||||
# If systemd-nspawn returned with a failure code,
|
||||
# the transient service unit file will stick around,
|
||||
# so make sure we clear that.
|
||||
if systemctl --quiet is-failed $UNIT ; then
|
||||
systemctl reset-failed $UNIT
|
||||
fi
|
||||
}
|
||||
|
||||
start_container() {
|
||||
kill_container
|
||||
echo "Starting container..."
|
||||
systemd-run --unit=$UNIT systemd-nspawn \
|
||||
--quiet \
|
||||
--keep-unit \
|
||||
--boot \
|
||||
--network-veth \
|
||||
--directory $(realpath $FS) \
|
||||
--machine $MACH
|
||||
echo "Waiting..."
|
||||
while ! env SYSTEMD_LOG_LEVEL=0 machinectl shell $MACH /bin/true ; do
|
||||
sleep 0.1
|
||||
done
|
||||
}
|
||||
|
||||
FAILED=0
|
||||
run() {
|
||||
# Run a command inside the container
|
||||
echo "+" "$1"
|
||||
chroot ${FS} env -i \
|
||||
HOME=/root \
|
||||
PATH=/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
|
||||
TERM=$TERM \
|
||||
IN_CHROOT=1 \
|
||||
bash -c "$1"
|
||||
RET=$?
|
||||
|
||||
# machinectl doesn't propagate return codes, so append something
|
||||
# to the command that saves the result of what we ran.
|
||||
echo "99" > $FS/jim-cmd-result
|
||||
CMD="$1 ; echo \$? > /jim-cmd-result"
|
||||
|
||||
# Run it
|
||||
env SYSTEMD_LOG_LEVEL=notice machinectl \
|
||||
shell $MACH /usr/bin/env IN_CHROOT=1 \
|
||||
bash -c "$CMD"
|
||||
|
||||
# Check result
|
||||
RET=$(cat $FS/jim-cmd-result)
|
||||
rm -f $FS/jim-cmd-result
|
||||
if [ $RET -ne 0 ] && [ "$1" != "exec bash" ] ; then
|
||||
printf "%s\n" "----------- WARNING: failed with exit code $RET"
|
||||
FAILED=$RET
|
||||
@@ -27,16 +98,19 @@ run() {
|
||||
}
|
||||
|
||||
set -e
|
||||
mount -t proc none ${FS}/proc
|
||||
mount -t sysfs none ${FS}/sys
|
||||
mount -t devpts none ${FS}/dev/pts
|
||||
|
||||
run "echo 'nameserver 8.8.8.8' > /etc/resolv.conf"
|
||||
run "dbus-uuidgen > /var/lib/dbus/machine-id"
|
||||
run "dpkg-divert --local --rename --add /sbin/initctl"
|
||||
run "ln -s /bin/true /sbin/initctl"
|
||||
run "dpkg-divert --local --rename --add /usr/sbin/update-grub"
|
||||
run "ln -s /bin/true /usr/sbin/update-grub"
|
||||
setup_networking
|
||||
start_container
|
||||
|
||||
run "resolvconf --disable-updates"
|
||||
run "echo 'nameserver 8.8.8.8' > /run/resolvconf/resolv.conf"
|
||||
run "hostnamectl --transient set-hostname nilmbuntu"
|
||||
|
||||
#run "dbus-uuidgen > /var/lib/dbus/machine-id"
|
||||
#run "dpkg-divert --local --rename --add /sbin/initctl"
|
||||
#run "ln -sf /bin/true /sbin/initctl"
|
||||
#run "dpkg-divert --local --rename --add /usr/sbin/update-grub"
|
||||
#run "ln -sf /bin/true /usr/sbin/update-grub"
|
||||
|
||||
set +e
|
||||
if [ -z "$1" ] ; then
|
||||
@@ -44,21 +118,30 @@ if [ -z "$1" ] ; then
|
||||
else
|
||||
run "$1"
|
||||
fi
|
||||
|
||||
echo "Cleaning up..."
|
||||
|
||||
# Manually clean up some things that show up after booting an image
|
||||
# and installing packages. This doesn't get everything, but what's
|
||||
# left should be fine.
|
||||
run "apt-get clean"
|
||||
run "rm /sbin/initctl"
|
||||
run "dpkg-divert --rename --remove /sbin/initctl"
|
||||
run "rm /usr/sbin/update-grub"
|
||||
run "dpkg-divert --rename --remove /usr/sbin/update-grub"
|
||||
run "rm /var/lib/dbus/machine-id"
|
||||
run "> /etc/resolv.conf"
|
||||
run "rm -rf /tmp/* /tmp/.??* /root/.bash_history"
|
||||
run "> /etc/machine-id"
|
||||
run "rm -f /core /boot/grub/grubenv"
|
||||
run "rm -f /var/lib/systemd/random-seed"
|
||||
run "rm -f /var/lib/ubuntu-drivers-common/last_gfx_boot"
|
||||
run "rm -f /var/lib/NetworkManager/*"
|
||||
run "rm -f /root/.bash_history"
|
||||
|
||||
umount ${FS}/dev/pts
|
||||
umount ${FS}/sys/kernel/security || true
|
||||
umount ${FS}/sys
|
||||
umount ${FS}/proc
|
||||
#run "rm /sbin/initctl"
|
||||
#run "dpkg-divert --rename --remove /sbin/initctl"
|
||||
#run "rm /usr/sbin/update-grub"
|
||||
#run "dpkg-divert --rename --remove /usr/sbin/update-grub"
|
||||
#run "rm /var/lib/dbus/machine-id"
|
||||
#run "> /etc/resolv.conf"
|
||||
|
||||
echo "cleaned up"
|
||||
kill_container
|
||||
|
||||
echo "Done"
|
||||
if [ $FAILED -ne 0 ] ; then
|
||||
exit $FAILED
|
||||
fi
|
||||
|
@@ -29,7 +29,7 @@ sudo mount -o loop,ro "$ORIG" ${MNT}
|
||||
# copy data
|
||||
sudo mkdir ${ISO}
|
||||
sudo rsync --exclude=/casper/filesystem.squashfs -a ${MNT}/ ${ISO}
|
||||
sudo chown -R ${USER} ${ISO}
|
||||
sudo chown -R ${NONPRIV_UID} ${ISO}
|
||||
chmod -R u+w ${ISO}
|
||||
|
||||
# copy squashfs
|
||||
|
@@ -11,13 +11,12 @@ fi
|
||||
|
||||
set -e
|
||||
|
||||
#rm -f ${OUTPUT}
|
||||
./cleanup.sh
|
||||
for d in ${ORIG} ${OUTPUT} ${DISK} ; do
|
||||
mkdir -p $(dirname $d)
|
||||
chown ${USER} $(dirname $d)
|
||||
chown ${NONPRIV_UID} $(dirname $d)
|
||||
done
|
||||
./extractiso.sh
|
||||
./customize.sh
|
||||
./buildiso.sh
|
||||
chown ${USER} ${ORIG} ${OUTPUT}
|
||||
chown ${NONPRIV_UID} ${ORIG} ${OUTPUT}
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 599 KiB After Width: | Height: | Size: 589 KiB |
10
run.sh
10
run.sh
@@ -45,17 +45,21 @@ esac
|
||||
set -e
|
||||
set -x
|
||||
|
||||
cfg=""
|
||||
case $boot in
|
||||
c)
|
||||
echo "booting CD with empty disk"
|
||||
rm -f ${DISK}
|
||||
dd if=/dev/zero "of=${DISK}" bs=1M count=0 seek=10240
|
||||
cfg="-cdrom ${iso} -hda ${DISK} -boot d"
|
||||
cfg+=" -drive file=${iso},index=1,media=cdrom"
|
||||
cfg+=" -drive file=${DISK},index=0,media=disk,format=raw"
|
||||
cfg+=" -boot d"
|
||||
;;
|
||||
d)
|
||||
echo "booting disk with no CD"
|
||||
cfg="-hda ${DISK} -boot c"
|
||||
cfg+=" -drive file=${DISK},index=0,media=disk,format=raw"
|
||||
cfg+=" -boot c"
|
||||
;;
|
||||
esac
|
||||
|
||||
qemu-system-x86_64 -enable-kvm -m 1024 -vga vmware $cfg
|
||||
qemu-system-x86_64 -enable-kvm -m 2048 -vga vmware $cfg
|
||||
|
BIN
splash.png
BIN
splash.png
Binary file not shown.
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.1 KiB |
Reference in New Issue
Block a user