]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/commitdiff
make.sh: Build in ramdisk
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 16 Dec 2018 16:50:13 +0000 (16:50 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sun, 16 Dec 2018 16:50:13 +0000 (16:50 +0000)
This is an experimental change that I want to trial to speed up
the nightly builds. The build environment will be mounted in a
ramdisk and the build will be performed in there.

This will hopefully reduce IO on the (slow) replicated disks.

If there is no significant performance gain from this, this
commit will be reverted.

To enable this, USE_RAMDISK must be set to 1 in .config.

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
make.sh

diff --git a/make.sh b/make.sh
index fd626a999cf2d8ea3abffb1fbd29d7751923ec86..fb529b669c42fd171b57db9cc9fd2c2b2508b619 100755 (executable)
--- a/make.sh
+++ b/make.sh
@@ -290,6 +290,9 @@ stdumount() {
        umount $BASEDIR/build/usr/src/lfs               2>/dev/null;
        umount $BASEDIR/build/usr/src/log               2>/dev/null;
        umount $BASEDIR/build/usr/src/src               2>/dev/null;
+
+       # Umount ramdisk
+       ramdisk_save "${BASEDIR}/build"
 }
 
 now() {
@@ -423,6 +426,68 @@ exiterror() {
        exit 1
 }
 
+ramdisk_save() {
+       local path="${1}"
+
+       # Check if the ramdisk is actually mounted
+       if ! mountpoint "${path}" &>/dev/null; then
+               return 1
+       fi
+
+       # Remove the bind-mount
+       umount "${path}"
+
+       echo -n "Saving ramdisk (this might take a moment)..."
+
+       # Copy all data
+       mkdir -p "${path}.tmpfs"
+       if ! rsync -aHAXq --delete "${path}.tmpfs/" "${path}/"; then
+               print_status FAIL
+               return 1
+       fi
+
+       # Umount ramdisk
+       umount "${path}.tmpfs"
+       rm -rf "${path}.tmpfs"
+
+       print_status DONE
+}
+
+ramdisk_restore() {
+       local path="${1}"
+
+       # Don't do anything if ramdisk support isn't enabled
+       if [ "${USE_RAMDISK}" != "1" ]; then
+               return 1
+       fi
+
+       # Check for sufficient memory
+       # XXX TODO
+
+       echo -n "Restoring ramdisk (this might take a moment)..."
+
+       # Mount new ramdisk
+       mkdir -p "${path}.tmpfs"
+       if ! mount -t tmpfs none "${path}.tmpfs"; then
+               exiterror "Could not mount ramdisk"
+       fi
+
+       # Restore all data
+       if ! rsync -aHAXq --delete "${path}/" "${path}.tmpfs/"; then
+               umount "${path}.tmpfs"
+               rm -rf "${path}.tmpfs"
+
+               exiterror "Could not restore ramdisk"
+       fi
+
+       # Overlay the files on disk
+       # We would use "mount --move ..." but systemd is always
+       # mounting / as shared which doesn't allow moving anything
+       mount --bind "${path}.tmpfs" "${path}"
+
+       print_status DONE
+}
+
 prepareenv() {
        # Are we running the right shell?
        if [ -z "${BASH}" ]; then
@@ -472,6 +537,9 @@ prepareenv() {
        export LFS LC_ALL CFLAGS CXXFLAGS MAKETUNING
        unset CC CXX CPP LD_LIBRARY_PATH LD_PRELOAD
 
+       # Mount ramdisk (if requested)
+       ramdisk_restore "${BASEDIR}/build"
+
        # Make some extra directories
        mkdir -p "${BASEDIR}/build${TOOLS_DIR}" 2>/dev/null
        mkdir -p $BASEDIR/build/{etc,usr/src} 2>/dev/null