[build]: fix dpkg admindir corruption issue in parallel build (#6408)

Fix #119

when parallel build is enable, multiple dpkg-buildpackage
instances are running at the same time. /var/lib/dpkg is shared
by all instances and the /var/lib/dpkg/updates could be corrupted
and cause the build failure.

the fix is to use overlay fs to mount separate /var/lib/dpkg
for each dpkg-buildpackage instance so that they are not affecting
each other.

Signed-off-by: Guohan Lu <lguohan@gmail.com>
This commit is contained in:
lguohan 2021-01-12 06:03:12 -08:00
parent 7e282b89a2
commit 63a044a87c
23 changed files with 41 additions and 25 deletions

View File

@ -120,3 +120,15 @@ $(foreach deb,$(1), \
fi; \ fi; \
done; } ) done; } )
endef endef
###############################################################################
## Setup overlay fs for dpkg admin directory /var/lib/dpkg
###############################################################################
define SETUP_OVERLAYFS_FOR_DPKG_ADMINDIR
upperdir=$(shell mktemp -d -p $(DPKG_ADMINDIR_PATH))
workdir=$(shell mktemp -d -p $(DPKG_ADMINDIR_PATH))
mergedir=$(shell mktemp -d -p $(DPKG_ADMINDIR_PATH))
sudo mount -t overlay overlay -olowerdir=/var/lib/dpkg,upperdir=$$upperdir,workdir=$$workdir $$mergedir
export SONIC_DPKG_ADMINDIR=$$mergedir
trap "sudo umount $$mergedir && rm -rf $$mergedir $$upperdir $$workdir" EXIT
endef

View File

@ -30,6 +30,7 @@ PYTHON_WHEELS_PATH = $(TARGET_PATH)/python-wheels
PROJECT_ROOT = $(shell pwd) PROJECT_ROOT = $(shell pwd)
DBG_IMAGE_MARK = dbg DBG_IMAGE_MARK = dbg
DBG_SRC_ARCHIVE_FILE = $(TARGET_PATH)/sonic_src.tar.gz DBG_SRC_ARCHIVE_FILE = $(TARGET_PATH)/sonic_src.tar.gz
DPKG_ADMINDIR_PATH = /sonic/dpkg
CONFIGURED_PLATFORM := $(shell [ -f .platform ] && cat .platform || echo generic) CONFIGURED_PLATFORM := $(shell [ -f .platform ] && cat .platform || echo generic)
PLATFORM_PATH = platform/$(CONFIGURED_PLATFORM) PLATFORM_PATH = platform/$(CONFIGURED_PLATFORM)
@ -52,6 +53,7 @@ configure :
@mkdir -p target/debs @mkdir -p target/debs
@mkdir -p target/files @mkdir -p target/files
@mkdir -p target/python-wheels @mkdir -p target/python-wheels
@mkdir -p $(DPKG_ADMINDIR_PATH)
@echo $(PLATFORM) > .platform @echo $(PLATFORM) > .platform
distclean : .platform clean distclean : .platform clean
@ -280,6 +282,7 @@ $(addprefix $(DEBS_PATH)/, $(SONIC_MAKE_DEBS)) : $(DEBS_PATH)/% : .platform $$(a
rm -f $(addprefix $(DEBS_PATH)/, $* $($*_DERIVED_DEBS) $($*_EXTRA_DEBS)) rm -f $(addprefix $(DEBS_PATH)/, $* $($*_DERIVED_DEBS) $($*_EXTRA_DEBS))
# Apply series of patches if exist # Apply series of patches if exist
if [ -f $($*_SRC_PATH).patch/series ]; then pushd $($*_SRC_PATH) && QUILT_PATCHES=../$(notdir $($*_SRC_PATH)).patch quilt push -a; popd; fi if [ -f $($*_SRC_PATH).patch/series ]; then pushd $($*_SRC_PATH) && QUILT_PATCHES=../$(notdir $($*_SRC_PATH)).patch quilt push -a; popd; fi
$(SETUP_OVERLAYFS_FOR_DPKG_ADMINDIR)
# Build project and take package # Build project and take package
DEB_BUILD_OPTIONS="${DEB_BUILD_OPTIONS_GENERIC}" make DEST=$(shell pwd)/$(DEBS_PATH) -C $($*_SRC_PATH) $(shell pwd)/$(DEBS_PATH)/$* $(LOG) DEB_BUILD_OPTIONS="${DEB_BUILD_OPTIONS_GENERIC}" make DEST=$(shell pwd)/$(DEBS_PATH) -C $($*_SRC_PATH) $(shell pwd)/$(DEBS_PATH)/$* $(LOG)
# Clean up # Clean up
@ -307,9 +310,10 @@ $(addprefix $(DEBS_PATH)/, $(SONIC_DPKG_DEBS)) : $(DEBS_PATH)/% : .platform $$(a
# Build project # Build project
pushd $($*_SRC_PATH) $(LOG) pushd $($*_SRC_PATH) $(LOG)
[ ! -f ./autogen.sh ] || ./autogen.sh $(LOG) [ ! -f ./autogen.sh ] || ./autogen.sh $(LOG)
$(SETUP_OVERLAYFS_FOR_DPKG_ADMINDIR)
$(if $($*_DPKG_TARGET), $(if $($*_DPKG_TARGET),
DEB_BUILD_OPTIONS="${DEB_BUILD_OPTIONS_GENERIC} ${$*_DEB_BUILD_OPTIONS}" dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --as-root -T$($*_DPKG_TARGET) $(LOG), DEB_BUILD_OPTIONS="${DEB_BUILD_OPTIONS_GENERIC} ${$*_DEB_BUILD_OPTIONS}" dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --as-root -T$($*_DPKG_TARGET) --admindir $$mergedir $(LOG),
DEB_BUILD_OPTIONS="${DEB_BUILD_OPTIONS_GENERIC} ${$*_DEB_BUILD_OPTIONS}" dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) $(LOG) DEB_BUILD_OPTIONS="${DEB_BUILD_OPTIONS_GENERIC} ${$*_DEB_BUILD_OPTIONS}" dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $$mergedir $(LOG)
) )
popd $(LOG) popd $(LOG)
# Clean up # Clean up

View File

@ -10,7 +10,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% :
dget -u https://launchpad.net/debian/+archive/primary/+sourcefiles/bash/$(BASH_VERSION_FULL)/bash_$(BASH_VERSION_FULL).dsc dget -u https://launchpad.net/debian/+archive/primary/+sourcefiles/bash/$(BASH_VERSION_FULL)/bash_$(BASH_VERSION_FULL).dsc
pushd bash-$(BASH_VERSION_MAJOR) pushd bash-$(BASH_VERSION_MAJOR)
DEB_BUILD_OPTIONS=nocheck dpkg-buildpackage -us -uc -b -j$(SONIC_CONFIG_MAKE_JOBS) DEB_BUILD_OPTIONS=nocheck dpkg-buildpackage -us -uc -b -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR)
popd popd
mv $* $(DEST)/ mv $* $(DEST)/

View File

@ -14,7 +14,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% :
dpkg-source -x hiredis_$(HIREDIS_VERSION_FULL).dsc dpkg-source -x hiredis_$(HIREDIS_VERSION_FULL).dsc
pushd hiredis-$(HIREDIS_VERSION) pushd hiredis-$(HIREDIS_VERSION)
fakeroot debian/rules -j$(SONIC_CONFIG_MAKE_JOBS) binary dpkg-buildpackage -rfakeroot -d -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR)
popd popd
mv $* $(DERIVED_TARGETS) $(DEST)/ mv $* $(DERIVED_TARGETS) $(DEST)/

View File

@ -19,7 +19,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% :
# Build the package # Build the package
rm -f debian/*.debhelper.log rm -f debian/*.debhelper.log
dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR)
popd popd
mv $(DERIVED_TARGETS) $* $(DEST)/ mv $(DERIVED_TARGETS) $* $(DEST)/

View File

@ -14,7 +14,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% :
dpkg-source -x iproute2_$(IPROUTE2_VERSION_FULL).dsc dpkg-source -x iproute2_$(IPROUTE2_VERSION_FULL).dsc
pushd iproute2-$(IPROUTE2_VERSION) pushd iproute2-$(IPROUTE2_VERSION)
dpkg-buildpackage -us -uc -b -j$(SONIC_CONFIG_MAKE_JOBS) dpkg-buildpackage -us -uc -b -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR)
popd popd
mv $* $(DEST)/ mv $* $(DEST)/

View File

@ -24,7 +24,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% :
stg import -s ../patch/series stg import -s ../patch/series
# Build source and Debian packages # Build source and Debian packages
dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR)
popd popd
# Move the newly-built .deb packages to the destination directory # Move the newly-built .deb packages to the destination directory

View File

@ -22,7 +22,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% :
dpkg-source -x libnl3_$(LIBNL3_VERSION).dsc dpkg-source -x libnl3_$(LIBNL3_VERSION).dsc
pushd ./libnl3-$(LIBNL3_VERSION_BASE) pushd ./libnl3-$(LIBNL3_VERSION_BASE)
dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR)
popd popd
mv $(DERIVED_TARGETS) $* $(DEST)/ mv $(DERIVED_TARGETS) $* $(DEST)/

View File

@ -30,7 +30,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% :
mv tmp/debian libteam/ mv tmp/debian libteam/
rm -rf tmp rm -rf tmp
pushd ./libteam pushd ./libteam
dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR)
popd popd
mv $(DERIVED_TARGETS) $* $(DEST)/ mv $(DERIVED_TARGETS) $* $(DEST)/

View File

@ -23,7 +23,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% :
stg import -s ../patch/series stg import -s ../patch/series
# Build source and Debian packages # Build source and Debian packages
env "with_netlink_receive_bufsize=1024*1024" dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) env "with_netlink_receive_bufsize=1024*1024" dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR)
popd popd
# Move the newly-built .deb packages to the destination directory # Move the newly-built .deb packages to the destination directory

View File

@ -24,7 +24,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% :
stg import -s ../patch/series stg import -s ../patch/series
# Build source and Debian packages # Build source and Debian packages
dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR)
popd popd
# Move the newly-built .deb packages to the destination directory # Move the newly-built .deb packages to the destination directory

View File

@ -14,7 +14,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% :
dpkg-source -x mpdecimal_$(MPDECIMAL_VERSION_FULL).dsc dpkg-source -x mpdecimal_$(MPDECIMAL_VERSION_FULL).dsc
pushd mpdecimal-$(MPDECIMAL_VERSION) pushd mpdecimal-$(MPDECIMAL_VERSION)
dpkg-buildpackage -us -uc -b -j$(SONIC_CONFIG_MAKE_JOBS) dpkg-buildpackage -us -uc -b -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR)
popd popd
mv $* $(DERIVED_TARGETS) $(DEST)/ mv $* $(DERIVED_TARGETS) $(DEST)/

View File

@ -19,7 +19,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% :
git reset --hard debian/$(PYTHON_CLICK_VERSION) git reset --hard debian/$(PYTHON_CLICK_VERSION)
# Build source and Debian packages # Build source and Debian packages
dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR)
popd popd
# Move the newly-built .deb package to the destination directory # Move the newly-built .deb package to the destination directory

View File

@ -32,7 +32,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% :
fi fi
done done
dpkg-buildpackage -rfakeroot -us -uc -b -j$(SONIC_CONFIG_MAKE_JOBS) dpkg-buildpackage -rfakeroot -us -uc -b -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR)
popd popd
cp $(DERIVED_TARGETS) $* $(DEST)/ cp $(DERIVED_TARGETS) $* $(DEST)/

View File

@ -23,7 +23,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% :
stg import -s ../patch/series stg import -s ../patch/series
# Build source and Debian packages # Build source and Debian packages
dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR)
popd popd
# Move the newly-built .deb packages to the destination directory # Move the newly-built .deb packages to the destination directory

View File

@ -16,7 +16,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% :
dpkg-source -x redis_$(REDIS_VERSION_FULL).dsc dpkg-source -x redis_$(REDIS_VERSION_FULL).dsc
pushd redis-$(REDIS_VERSION) pushd redis-$(REDIS_VERSION)
DEB_BUILD_OPTIONS=nocheck dpkg-buildpackage -us -uc -b -j$(SONIC_CONFIG_MAKE_JOBS) DEB_BUILD_OPTIONS=nocheck dpkg-buildpackage -us -uc -b -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR)
popd popd
mv $(DERIVED_TARGETS) $* $(DEST)/ mv $(DERIVED_TARGETS) $* $(DEST)/

View File

@ -31,7 +31,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% :
stg init stg init
stg import -s ../patch-$(SNMPD_VERSION)/series stg import -s ../patch-$(SNMPD_VERSION)/series
fakeroot debian/rules -j$(SONIC_CONFIG_MAKE_JOBS) binary dpkg-buildpackage -rfakeroot -b -d -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR)
popd popd
mv $(DERIVED_TARGETS) $* $(DEST)/ mv $(DERIVED_TARGETS) $* $(DEST)/

View File

@ -18,7 +18,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% :
# Build source and Debian packages # Build source and Debian packages
pushd socat-1.7.3.1 pushd socat-1.7.3.1
patch -p0 < ../enable_readline.patch patch -p0 < ../enable_readline.patch
dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR)
popd popd
# Move the newly-built .deb packages to the destination directory # Move the newly-built .deb packages to the destination directory

View File

@ -22,7 +22,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% :
done; done;
# Build the package # Build the package
dpkg-buildpackage -rfakeroot -b -us -uc dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR)
popd popd

View File

@ -25,7 +25,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% :
cp -a debianpkg debian cp -a debianpkg debian
make -f debian/rules backports make -f debian/rules backports
# new directory to build the package # new directory to build the package
rm -rf frrpkg rm -rf frrpkg
mkdir frrpkg mkdir frrpkg
cd frrpkg cd frrpkg
@ -34,7 +34,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% :
tar xf ../../frr_*sonic.debian8*.debian.tar.xz tar xf ../../frr_*sonic.debian8*.debian.tar.xz
# build package # build package
dpkg-buildpackage -rfakeroot -b -us -uc dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR)
cd .. cd ..
mv $(DERIVED_TARGET) $* $(DEST)/ mv $(DERIVED_TARGET) $* $(DEST)/

View File

@ -18,7 +18,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% :
git am ../0004-Skip-accessing-tacacs-servers-for-local-non-tacacs-u.patch git am ../0004-Skip-accessing-tacacs-servers-for-local-non-tacacs-u.patch
git am ../0005-libnss-Modify-parsing-of-IP-addr-and-port-number-str.patch git am ../0005-libnss-Modify-parsing-of-IP-addr-and-port-number-str.patch
dpkg-buildpackage -rfakeroot -b -us -uc dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR)
popd popd
mv $(DERIVED_TARGETS) $* $(DEST)/ mv $(DERIVED_TARGETS) $* $(DEST)/

View File

@ -9,7 +9,7 @@ DERIVED_TARGETS = libtac2_$(PAM_TACPLUS_VERSION)_amd64.deb \
$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% :
# Obtain pam_tacplus # Obtain pam_tacplus
rm -rf ./pam_tacplus rm -rf ./pam_tacplus
git clone https://github.com/jeroennijhof/pam_tacplus.git git clone https://github.com/jeroennijhof/pam_tacplus.git
pushd ./pam_tacplus pushd ./pam_tacplus
git checkout -f v1.4.1 git checkout -f v1.4.1
@ -20,7 +20,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% :
git apply ../0004-management-vrf-support.patch git apply ../0004-management-vrf-support.patch
git apply ../0005-pam-Modify-parsing-of-IP-address-and-port-number-to-.patch git apply ../0005-pam-Modify-parsing-of-IP-address-and-port-number-to-.patch
dpkg-buildpackage -rfakeroot -b -us -uc dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR)
popd popd
mv $(DERIVED_TARGETS) $* $(DEST)/ mv $(DERIVED_TARGETS) $* $(DEST)/

View File

@ -23,7 +23,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% :
dpkg-source -x thrift_$(THRIFT_VERSION_FULL).dsc dpkg-source -x thrift_$(THRIFT_VERSION_FULL).dsc
pushd thrift-$(THRIFT_VERSION) pushd thrift-$(THRIFT_VERSION)
patch -p1 < ../patch/THRIFT-3577-assertion-failed.patch patch -p1 < ../patch/THRIFT-3577-assertion-failed.patch
DEB_BUILD_OPTIONS=nocheck dpkg-buildpackage -d -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) DEB_BUILD_OPTIONS=nocheck dpkg-buildpackage -d -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR)
popd popd
mv $(DERIVED_TARGETS) $* $(DEST)/ mv $(DERIVED_TARGETS) $* $(DEST)/