Compare commits

..

24 Commits
0.16.1 ... 0.17

Author SHA1 Message Date
5902f987cc Merge branch 's6-typo-fix' of artix/artools into master 2020-01-26 00:32:46 +01:00
bfa888251e s6: fix a typo 2020-01-24 20:47:58 -06:00
0ecfa1a0f6 Merge branch 's6-fixes' of artix/artools into master 2020-01-24 18:47:07 +01:00
e60180ebdb s6: manually rebuild s6-linux-init binaries
Since the s6-linux-init package is more generic now and has no special
compile options, the binaries need to be rebuilt while making the
liveiso so it works correctly.
2020-01-24 10:59:07 -06:00
20b65d06c8 pkg: use zst 2020-01-11 02:59:10 +01:00
c7728c2e5b start 0.17 2020-01-11 02:58:40 +01:00
a0ca1ab3a4 update makepkg.conf 2020-01-10 23:03:18 +01:00
911a0fff36 buildiso: fix grub theme paths 2019-12-15 23:30:31 +01:00
f80c51e8d3 buildiso: fix umount on error 2019-12-15 23:00:17 +01:00
1e948b3ef5 buildiso: fix cal unpackfs path 2019-12-14 23:14:47 +01:00
bf0a9bc7fc don't create dirs in load_config 2019-12-13 22:50:58 +01:00
a4a690951c set extglob 2019-12-13 21:06:22 +01:00
e05765269e buildiso: fix msg 2019-12-13 18:59:50 +01:00
3df364189b mkchrootpkg: apply arch patch 2019-12-13 18:59:27 +01:00
974df38738 iso (#23) 2019-12-13 18:06:47 +01:00
7b831d8867 arch patches (#22) 2019-12-13 17:51:20 +01:00
7bf4dff1a1 buildiso: add grub kopt msg 2019-11-27 09:55:35 +01:00
529e73e2ab buildiso: add dracut support 2019-11-19 21:41:49 +01:00
7be420a24f buildiso: set proper device label for rw 2019-11-19 14:55:31 +01:00
cd76f7d3cf buildiso: use md5 for img sums 2019-11-19 01:10:58 +01:00
918b95db58 initcpio: fix pxe 2019-11-19 01:10:17 +01:00
77c464d603 initcpio (#21) 2019-11-18 21:06:16 +01:00
55945b8975 refact (#20) 2019-11-17 21:59:25 +01:00
f83cc2a4a8 lib & var cleaning 2019-11-12 10:19:28 +01:00
41 changed files with 605 additions and 439 deletions

View File

@@ -1,4 +1,4 @@
VERSION=0.16
VERSION=0.17
CHROOT_VERSION=0.10
@@ -27,7 +27,7 @@ BASE_LIBS = \
BASE_UTIL = lib/util-base.sh
BASE_DATA = \
$(wildcard data/base/pacman*.conf)
$(wildcard data/pacman/pacman*.conf)
PKG_CONF = \
data/conf/artools-pkg.conf
@@ -95,7 +95,7 @@ PKG_LIBS = \
PKG_UTIL = lib/util-pkg.sh
PKG_DATA = \
data/pkg/makepkg.conf
data/pacman/makepkg.conf
PATCHES = \
$(wildcard data/patches/*.patch)
@@ -116,8 +116,6 @@ ISO_LIBS = \
ISO_UTIL = lib/util-iso.sh
ISO_DATA = \
data/iso/mkinitcpio.conf
DIRMODE = -dm0755
FILEMODE = -m0644
@@ -211,9 +209,6 @@ install_iso: install_cpio
install $(FILEMODE) $(ISO_UTIL) $(DESTDIR)$(LIBDIR)/$(TOOLS)
install $(FILEMODE) $(ISO_LIBS) $(DESTDIR)$(LIBDIR)/$(TOOLS)/iso
install $(DIRMODE) $(DESTDIR)$(DATADIR)/$(TOOLS)
install $(FILEMODE) $(ISO_DATA) $(DESTDIR)$(DATADIR)/$(TOOLS)
install: install_base install_pkg install_iso
.PHONY: all clean install install_base install_pkg install_iso

View File

@@ -46,6 +46,7 @@ newroot=/mnt
hostcache=0
copykeyring=1
copymirrorlist=1
pacmode=-Sy
usage() {
echo "usage: ${0##*/} [options] root [packages...]"
@@ -54,6 +55,7 @@ usage() {
echo " -G Avoid copying the host's pacman keyring to the target"
echo " -i Avoid auto-confirmation of package selections"
echo " -M Avoid copying the host's mirrorlist to the target"
echo ' -U Use pacman -U to install packages'
echo " -h Print this help message"
echo ''
echo ' basestrap installs packages to the specified new root directory.'
@@ -65,7 +67,7 @@ usage() {
orig_argv=("$0" "$@")
opts=':C:cGiM'
opts=':C:cGiMU'
while getopts ${opts} arg; do
case "${arg}" in
@@ -74,6 +76,7 @@ while getopts ${opts} arg; do
i) interactive=1 ;;
G) copykeyring=0 ;;
M) copymirrorlist=0 ;;
U) pacmode=-U ;;
:) echo "invalid argument ${arg}:$OPTARG"; usage 1;;
?) usage 0 ;;
esac
@@ -109,7 +112,7 @@ if (( copykeyring ));then
fi
msg2 'Installing packages to %s' "$newroot"
if ! pacman -r "$newroot" -Sy "${pacman_args[@]}"; then
if ! unshare --fork --pid pacman -r "$newroot" $pacmode "${pacman_args[@]}"; then
die 'Failed to install packages to new root'
fi

View File

@@ -86,15 +86,13 @@ done
while read -r line; do
mapfile -t lines < <($pacconf_cmd --config "${pac_conf:-$working_dir/etc/pacman.conf}" \
--repo $line Server | sed -r 's#(.*/)[^/]+/os/.+#\1$repo/os/$arch#')
if [[ ${lines[0]} != ${host_mirrors[0]} ]]; then
for line in "${lines[@]}"; do
if [[ $line = file://* ]]; then
line=${line#file://}
in_array "$line" "${cache_dirs[@]}" || cache_dirs+=("$line")
fi
done
fi
--repo $line Server | sed -r 's#(.*/)[^/]+/os/.+#\1#')
for line in "${lines[@]}"; do
if [[ $line = file://* ]]; then
line=${line#file://}
in_array "$line" "${cache_dirs[@]}" || cache_dirs+=("$line")
fi
done
done < <($pacconf_cmd --config "${pac_conf:-$working_dir/etc/pacman.conf}" --repo-list)
copy_hostconf () {

View File

@@ -15,6 +15,7 @@
. @libdir@/artools/util-base.sh
working_dir=''
umode=''
files=()
chroot_args=()
@@ -22,6 +23,7 @@ chroot_args=()
usage() {
echo "Usage: ${0##*/} [options] working-dir package-list..."
echo ' options:'
echo ' -U Use pacman -U to install packages'
echo ' -C <file> Location of a pacman config file'
echo ' -M <file> Location of a makepkg config file'
echo ' -c <dir> Set pacman cache'
@@ -33,10 +35,11 @@ usage() {
orig_argv=("$0" "$@")
opts='hC:M:c:f:s'
opts='hUC:M:c:f:s'
while getopts ${opts} arg; do
case "${arg}" in
U) umode=U ;;
C) pacman_conf="$OPTARG" ;;
M) makepkg_conf="$OPTARG" ;;
c) cache_dir="$OPTARG" ;;
@@ -45,8 +48,10 @@ while getopts ${opts} arg; do
h|?) usage ;;
*) error "invalid argument '%s'" "$arg"; usage ;;
esac
chroot_args+=("-$arg")
[[ -v OPTARG ]] && chroot_args+=("$OPTARG")
if [[ $arg != U ]]; then
chroot_args+=("-$arg")
[[ -v OPTARG ]] && chroot_args+=("$OPTARG")
fi
done
shift $(($OPTIND - 1))
@@ -88,7 +93,7 @@ for f in "${files[@]}"; do
cp "$f" "$working_dir$f"
done
basestrap -Mc ${pacman_conf:+-C "$pacman_conf"} "$working_dir" \
basestrap -${umode}Mc ${pacman_conf:+-C "$pacman_conf"} "$working_dir" \
${cache_dirs[@]/#/--cachedir=} "$@" || die 'Failed to install all packages'
printf '%s.UTF-8 UTF-8\n' en_US de_DE > "$working_dir/etc/locale.gen"

View File

@@ -14,6 +14,8 @@
. @libdir@/artools/util-iso.sh
prepare_artools
gen_iso_fn(){
local vars=("artix") name
vars+=("${PROFILE}")
@@ -48,12 +50,17 @@ prepare_build(){
iso_label="ARTIX_$(date +%Y%m)"
basestrap_args+=(-C ${pacman_conf})
work_dir=${CHROOTS_ISO}/${PROFILE}/${ARCH}
work_dir=${CHROOTS_ISO}/${PROFILE}/artix
prepare_dir "${ISO_POOL}"
iso_dir="${ISO_POOL}/${PROFILE}"
iso_root=${CHROOTS_ISO}/${PROFILE}/iso
live_dir=/LiveOS
mnt_dir=${CHROOTS_ISO}/${PROFILE}/mnt
prepare_dir "${mnt_dir}"
prepare_dir "${iso_dir}"
prepare_dir "${iso_root}"
@@ -72,6 +79,44 @@ display_settings(){
show_profile
}
mk_squash(){
local timer=$(get_timer)
make_sfs "${work_dir}/rootfs"
[[ -d "${work_dir}/livefs" ]] && make_sfs "${work_dir}/livefs"
show_elapsed_time "${FUNCNAME}" "${timer}"
}
mk_iso(){
touch "${iso_root}/.artix"
msg "Making bootable image"
# Sanity checks
[[ ! -d "${iso_root}" ]] && return 1
if [[ -f "${iso_dir}/${iso_file}" ]]; then
msg2 "Removing existing bootable image..."
rm -rf "${iso_dir}/${iso_file}"
fi
assemble_iso
chown -R "${OWNER}:$(id --group ${OWNER})" "${iso_dir}"
}
mk_boot(){
local timer=$(get_timer)
run_safe "make_bootfs"
run_safe "make_grub"
show_elapsed_time "${FUNCNAME}" "${timer}"
}
mk_chroots(){
local timer=$(get_timer)
load_pkgs "${ROOT_LIST}" "${INITSYS}"
run_safe "make_rootfs"
if [[ -n ${LIVE_LIST} ]]; then
load_pkgs "${LIVE_LIST}" "${INITSYS}"
run_safe "make_livefs"
fi
show_elapsed_time "${FUNCNAME}" "${timer}"
}
build(){
msg "Start building [%s]" "${PROFILE}"
if ${clean_first};then
@@ -92,28 +137,45 @@ build(){
rm -rf --one-file-system "${iso_root}"
fi
if ${iso_only}; then
[[ ! -d ${work_dir} ]] && die "Create images: %s -p %s -x" "${cmd}" "${PROFILE}"
compress_images
exit 1
fi
if ${images_only}; then
prepare_images
warning "Continue compress: %s -p %s -zc ..." "${cmd}" "${PROFILE}"
exit 1
else
prepare_images
compress_images
fi
case true in
${chroot_only})
mk_chroots
warning "Continue squash: %s -p %s -sc ..." "${cmd}" "${PROFILE}"
exit 1
;;
${boot_only})
mk_boot
warning "Continue iso: %s -p %s -zc ..." "${cmd}" "${PROFILE}"
exit 1
;;
${squash_only})
mk_squash
warning "Continue boot: %s -p %s -bc ..." "${cmd}" "${PROFILE}"
exit 1
;;
${iso_only})
[[ ! -d ${work_dir} ]] && die "Create chroot: %s -p %s -x" "${cmd}" "${PROFILE}"
mk_iso
;;
*)
mk_chroots
mk_boot
mk_squash
mk_iso
;;
esac
msg "Finished building [%s]" "${PROFILE}"
show_elapsed_time "${FUNCNAME}" "${timer_start}"
}
clean_first=true
pretend=false
images_only=false
chroot_only=false
iso_only=false
persist=false
use_dracut=false
squash_only=false
boot_only=false
basestrap_args=(-GMc)
cmd=${0##*/}
@@ -129,13 +191,16 @@ usage() {
echo " [default: ${ISO_POOL}]"
echo ' -i <name> Init system to use'
echo " [default: ${INITSYS}]"
echo ' -g <key> The gpg key for sfs signing'
echo ' -g <key> The gpg key for img signing'
echo " [default: ${GPG_KEY}]"
echo ' -m Set SquashFS image mode to persistence'
echo ' -c Disable clean work dir'
echo ' -x Build images only'
echo ' -x Build chroot only'
echo ' -s Squash chroot only'
echo ' -b Generate iso boot only'
echo ' -z Generate iso only'
echo ' Requires pre built images (-x)'
echo ' -d Use dracut instead of mkinitcpio for iso initramfs'
echo ' -q Query settings and pretend build'
echo ' -h This help'
echo ''
@@ -145,7 +210,7 @@ usage() {
orig_argv=("$0" "$@")
opts='p:r:t:i:g:czxmqh'
opts='p:r:t:i:g:czsbxmdqh'
while getopts "${opts}" arg; do
case "${arg}" in
@@ -155,9 +220,12 @@ while getopts "${opts}" arg; do
i) INITSYS="$OPTARG" ;;
g) GPG_KEY="$OPTARG" ;;
c) clean_first=false ;;
x) images_only=true ;;
x) chroot_only=true ;;
z) iso_only=true ;;
s) squash_only=true ;;
b) boot_only=true ;;
m) persist=true ;;
d) use_dracut=true ;;
q) pretend=true ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;

View File

@@ -14,6 +14,8 @@
. @libdir@/artools/util-iso.sh
prepare_artools
connect(){
echo "${ACCOUNT}@${FILE_HOST}:${FILE_HOME}"
}

View File

@@ -14,6 +14,8 @@
. /usr/lib/artools/util-pkg.sh
prepare_artools
batch_move() {
local name="${1:-pkg_moves}"
local pkglist=${TREE_DIR_ARTIX}/$name.list

View File

@@ -14,6 +14,8 @@
. @libdir@/artools/util-pkg.sh
prepare_artools
create_first=false
rebuild=false
no_check=false
@@ -90,7 +92,7 @@ if ${create_first} || [[ ! -d "${CHROOTS_PKG}/${repo}-${ARCH}" ]];then
lock_close 9
rm -rf --one-file-system "${CHROOTS_PKG}/${repo}-${ARCH}"
mkdir -p "${CHROOTS_PKG}/${repo}-${ARCH}"
(umask 0022; mkdir -p "${CHROOTS_PKG}/${repo}-${ARCH}")
setarch "${ARCH}" mkchroot \
-C "${pacman_conf}" \
-M "${makepkg_conf}" \

View File

@@ -14,6 +14,8 @@
. @libdir@/artools/util-pkg.sh
prepare_artools
patch_pkg(){
local pkg="$1"
case $pkg in

View File

@@ -16,22 +16,7 @@
shopt -s extglob
# Source makepkg.conf; fail if it is not found
if [[ -r '/etc/makepkg.conf' ]]; then
# shellcheck source=makepkg-x86_64.conf
source '/etc/makepkg.conf'
else
die '/etc/makepkg.conf not found!'
fi
# Source user-specific makepkg.conf overrides
if [[ -r "${XDG_CONFIG_HOME:-$HOME/.config}/pacman/makepkg.conf" ]]; then
# shellcheck source=/dev/null
source "${XDG_CONFIG_HOME:-$HOME/.config}/pacman/makepkg.conf"
elif [[ -r "$HOME/.makepkg.conf" ]]; then
# shellcheck source=/dev/null
source "$HOME/.makepkg.conf"
fi
load_makepkg_config
usage() {
cat <<- _EOF_

View File

@@ -14,6 +14,8 @@
. @libdir@/artools/util-pkg.sh
prepare_artools
get_path(){
local repo="$1" pkg=trunk/PKGBUILD
if [[ $repo != trunk ]]; then

View File

@@ -14,6 +14,8 @@
. @libdir@/artools/util-pkg.sh
prepare_artools
compare(){
local pkgpath="$1" group="$2"
local pkg=${pkgpath##*/}
@@ -85,7 +87,7 @@ compare(){
is_db_entry() {
local pkgname="$1" repo="$(arch2artix $2)"
if [[ -d ${USER_CACHE_DIR}/${LINKSDBEXT}/${ARCH}/$repo/$pkgname ]];then
if [[ -d ${db_cache_dir}/${LINKSDBEXT}/${ARCH}/$repo/$pkgname ]];then
return 0
fi
return 1
@@ -127,7 +129,7 @@ check_db(){
update_db_cache(){
msg "Updating database cache"
for repo in "${searchrepos[@]}"; do
local cachedir=${USER_CACHE_DIR}/${LINKSDBEXT}/${ARCH}/${repo}
local cachedir=${db_cache_dir}/${LINKSDBEXT}/${ARCH}/${repo}
rm -rf "$cachedir"
mkdir -p "$cachedir"
msg2 "%s" "$repo"
@@ -140,7 +142,7 @@ update_db_cache(){
query_db() {
for repo in "${searchrepos[@]}"; do
local prefix=
local db=${USER_CACHE_DIR}/${LINKSDBEXT}/${ARCH}/${repo}/
local db=${db_cache_dir}/${LINKSDBEXT}/${ARCH}/${repo}/
if [[ -d ${db} ]]; then
while read -rd '' pkg; do
read -r match
@@ -185,6 +187,8 @@ show_version_table(){
done
}
db_cache_dir="${XDG_CACHE_HOME:-$USER_HOME/.cache}/artools"
load_makepkg_config
unstable=false

View File

@@ -14,12 +14,15 @@
. @libdir@/artools/util-pkg.sh
prepare_artools
find_cached_pkgfile() {
local searchdirs=("$PKGDEST" "$PWD") results=()
local pkg="$1"
local search=${pkg%.*}
for dir in "${searchdirs[@]}"; do
[[ -d $dir ]] || continue
results+=$(find "$dir" -type f -name "$pkg")
results+=$(find "$dir" -type f -name "$search.*" ! -path '*.sig')
done
case ${#results[*]} in
0)

View File

@@ -12,7 +12,6 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
. @libdir@/artools/util-base.sh
. @libdir@/artools/util-pkg.sh
set -e

View File

@@ -398,13 +398,27 @@ if (( ret != 0 )); then
else
if (( run_checkpkg )); then
msg "Running checkpkg"
msg2 "Downloading current versions"
if pacman --noconfirm -Swdd --logfile /dev/null "${pkgnames[@]}"; then
msg2 "Checking packages"
sudo -u "$makepkg_user" checkpkg --rmdir --warn
else
warning "Skipped checkpkg due to missing packages"
# sync off-site databases for up-to-date queries
trap 'rm -rf $dbpath; cleanup' EXIT INT TERM QUIT
dbpath=$(mktemp -d --tmpdir makechrootpkg-database.XXXXXXXXXX)
mkdir -p "$dbpath"
pacman -Sy --dbpath "$dbpath" --logfile /dev/null
# query current package locations
remotepkgs=($(pacman -Sddp --dbpath "$dbpath" --logfile /dev/null "${pkgnames[@]}"))
if (( $? )); then
warning "Skipped checkpkg due to missing repo packages"
exit 0
fi
# download package files if any non-local location exists
for remotepkg in "${remotepkgs[@]}"; do
[[ $remotepkg == file://* ]] && continue
msg2 "Downloading current versions"
pacman --noconfirm -Swdd --dbpath "$dbpath" --logfile /dev/null "${pkgnames[@]}"
break
done
msg2 "Checking packages"
sudo -u "$makepkg_user" checkpkg --rmdir --warn
fi
true
fi

View File

@@ -11,7 +11,7 @@
# possible values: openrc, runit, s6
# INITSYS="openrc"
# gpg key; leave empty or commented to skip sfs signing
# gpg key; leave empty or commented to skip img signing
# GPG_KEY=""
# set upload bandwidth limit in kB/s

View File

@@ -1,5 +0,0 @@
MODULES=(loop dm-snapshot)
HOOKS=(base udev artix_shutdown artix artix_loop_mnt artix_pxe_common artix_pxe_http artix_pxe_nbd artix_pxe_nfs artix_kms modconf block filesystems keyboard keymap)
COMPRESSION="xz"

View File

@@ -132,7 +132,7 @@ DBGSRCDIR="/usr/src/debug"
COMPRESSGZ=(gzip -c -f -n)
COMPRESSBZ2=(bzip2 -c -f)
COMPRESSXZ=(xz -c -z -)
COMPRESSZST=(zstd -c -z -q -)
COMPRESSZST=(zstd -c -T0 --ultra -20 -)
COMPRESSLRZ=(lrzip -q)
COMPRESSLZO=(lzop -q)
COMPRESSZ=(compress -c -f)
@@ -143,7 +143,7 @@ COMPRESSLZ=(lzip -c -f)
# EXTENSION DEFAULTS
#########################################################################
#
PKGEXT='.pkg.tar.xz'
PKGEXT='.pkg.tar.zst'
SRCEXT='.src.tar.gz'
# vim: set ft=sh ts=2 sw=2 et:

View File

@@ -8,36 +8,36 @@ _mnt_dmsnapshot() {
local ro_dev ro_dev_size rw_dev
ro_dev=$(losetup --find --show --read-only "${img}")
echo ${ro_dev} >> /run/artix/used_block_devices
echo ${ro_dev} >> ${live_root}/used_block_devices
ro_dev_size=$(blockdev --getsz ${ro_dev})
if [[ "${cow_persistent}" == "P" ]]; then
if [[ -f "/run/artix/cowspace/${cow_directory}/${img_name}.cow" ]]; then
msg ":: Found '/run/artix/cowspace/${cow_directory}/${img_name}.cow', using as persistent."
if [[ -f "${cow}/${cow_directory}/${img_name}.cow" ]]; then
msg ":: Found '${cow}/${cow_directory}/${img_name}.cow', using as persistent."
else
msg ":: Creating '/run/artix/cowspace/${cow_directory}/${img_name}.cow' as persistent."
truncate -s "${cow_spacesize}" "/run/artix/cowspace/${cow_directory}/${img_name}.cow"
msg ":: Creating '${cow}/${cow_directory}/${img_name}.cow' as persistent."
truncate -s "${cow_spacesize}" "${cow}/${cow_directory}/${img_name}.cow"
fi
else
if [[ -f "/run/artix/cowspace/${cow_directory}/${img_name}.cow" ]]; then
msg ":: Found '/run/artix/cowspace/${cow_directory}/${img_name}.cow' but non-persistent requested, removing."
rm -f "/run/artix/cowspace/${cow_directory}/${img_name}.cow"
if [[ -f "${cow}/${cow_directory}/${img_name}.cow" ]]; then
msg ":: Found '${cow}/${cow_directory}/${img_name}.cow' but non-persistent requested, removing."
rm -f "${cow}/${cow_directory}/${img_name}.cow"
fi
msg ":: Creating '/run/artix/cowspace/${cow_directory}/${img_name}.cow' as non-persistent."
truncate -s "${cow_spacesize}" "/run/artix/cowspace/${cow_directory}/${img_name}.cow"
msg ":: Creating '${cow}/${cow_directory}/${img_name}.cow' as non-persistent."
truncate -s "${cow_spacesize}" "${cow}/${cow_directory}/${img_name}.cow"
fi
rw_dev=$(losetup --find --show "/run/artix/cowspace/${cow_directory}/${img_name}.cow")
echo ${rw_dev} >> /run/artix/used_block_devices
rw_dev=$(losetup --find --show "${cow}/${cow_directory}/${img_name}.cow")
echo ${rw_dev} >> ${live_root}/used_block_devices
dmsetup create ${dm_snap_name} --table "0 ${ro_dev_size} snapshot ${ro_dev} ${rw_dev} ${cow_persistent} ${cow_chunksize}"
if [[ "${cow_persistent}" != "P" ]]; then
rm -f "/run/artix/cowspace/${cow_directory}/${img_name}.cow"
rm -f "${cow}/${cow_directory}/${img_name}.cow"
fi
_mnt_dev "/dev/mapper/${dm_snap_name}" "${mnt}" "-w" "defaults"
echo $(readlink -f /dev/mapper/${dm_snap_name}) >> /run/artix/used_block_devices
echo $(readlink -f /dev/mapper/${dm_snap_name}) >> ${live_root}/used_block_devices
}
# args: source, newroot, mountpoint
@@ -45,8 +45,8 @@ _mnt_overlayfs() {
local src="${1}"
local newroot="${2}"
local mnt="${3}"
local work_dir="/run/artix/overlay_root/work"
local upper_dir="/run/artix/overlay_root/upper"
local work_dir="${overlay_root}/work"
local upper_dir="${overlay_root}/upper"
mkdir -p "${upper_dir}" "${work_dir}"
@@ -63,15 +63,15 @@ _mnt_sfs() {
if [[ "${copytoram}" == "y" ]]; then
msg -n ":: Copying squashfs image to RAM..."
if ! "${oper}" "${img}" "/run/artix/copytoram/${img_fullname}" ; then
echo "ERROR: while copy '${img}' to '/run/artix/copytoram/${img_fullname}'"
if ! "${oper}" "${img}" "${cp2ram}/${img_fullname}" ; then
echo "ERROR: while copy '${img}' to '${cp2ram}/${img_fullname}'"
launch_interactive_shell
fi
img="/run/artix/copytoram/${img_fullname}"
img="${cp2ram}/${img_fullname}"
msg "done."
fi
sfs_dev=$(losetup --find --show --read-only "${img}")
echo ${sfs_dev} >> /run/artix/used_block_devices
echo ${sfs_dev} >> ${live_root}/used_block_devices
_mnt_dev "${sfs_dev}" "${mnt}" "-r" "defaults"
}
@@ -105,8 +105,8 @@ _mnt_dev() {
_verify_checksum() {
local _status
cd "/run/artix/bootmnt/${artixbasedir}/${arch}"
sha512sum -c $1.sha512 > /tmp/checksum.log 2>&1
cd "${bootmnt}/${root}"
sha512sum -c $1.img.sha512 > /tmp/checksum.log 2>&1
_status=$?
cd "${OLDPWD}"
return ${_status}
@@ -114,20 +114,19 @@ _verify_checksum() {
_verify_signature() {
local _status
cd "/run/artix/bootmnt/${artixbasedir}/${arch}"
gpg --homedir /gpg --status-fd 1 --verify $1.sfs.sig 2>/dev/null | grep -qE '^\[GNUPG:\] GOODSIG'
cd "${bootmnt}/${root}"
gpg --homedir /gpg --status-fd 1 --verify $1.img.sig 2>/dev/null | grep -qE '^\[GNUPG:\] GOODSIG'
_status=$?
cd "${OLDPWD}"
return ${_status}
}
run_hook() {
[[ -z "${arch}" ]] && arch="$(uname -m)"
[[ -z "${copytoram_size}" ]] && copytoram_size="75%"
[[ -z "${artixbasedir}" ]] && artixbasedir="artix"
[[ -z "${root}" ]] && root="LiveOS"
[[ -z "${dm_snap_prefix}" ]] && dm_snap_prefix="arch"
[[ -z "${artixdevice}" ]] && artixdevice="/dev/disk/by-label/${artixlabel}"
[[ -z "${dm_snap_prefix}" ]] && dm_snap_prefix="artix"
[[ -z "${artixdevice}" ]] && artixdevice="/dev/disk/by-label/${label}"
[[ -z "${cow_spacesize}" ]] && cow_spacesize="256M"
[[ -z "${overlay_root_size}" ]] && overlay_root_size="75%"
@@ -141,109 +140,135 @@ run_hook() {
fi
[[ -z "${cow_flags}" ]] && cow_flags="defaults"
[[ -z "${cow_directory}" ]] && cow_directory="persistent_${artixlabel}/${arch}"
[[ -z "${cow_directory}" ]] && cow_directory="persistent_${label}"
[[ -z "${cow_chunksize}" ]] && cow_chunksize="8"
[[ -z "${overlay}" ]] && overlay=""
lower_dir=''
live_root="/run/artix"
bootmnt="${live_root}/bootmnt"
overlay_root="${live_root}/overlay_root"
cow="${live_root}/cowspace"
cp2ram="${live_root}/copytoram"
# set mount handler for artix
mount_handler="artix_mount_handler"
}
_check_sum() {
local fs="${1}"
if [[ -f "${bootmnt}/${root}/${fs}.img" ]]; then
if [[ -f "${bootmnt}/${root}/${fs}.img.md5" ]]; then
msg -n ":: Self-test requested, please wait..."
if _verify_checksum "${fs}"; then
msg "done. Checksum is OK, continue booting."
else
echo "ERROR: one or more files are corrupted"
echo "see /tmp/checksum.log for details"
launch_interactive_shell
fi
else
echo "ERROR: checksum=y option specified but ${root}/${fs}.img.md5 not found"
launch_interactive_shell
fi
fi
}
_check_sig() {
local fs="${1}"
if [[ -f "${bootmnt}/${root}/${fs}.img" ]]; then
if [[ -f "${bootmnt}/${root}/${fs}.img.sig" ]]; then
msg -n ":: Signature verification requested, please wait..."
if _verify_signature "${fs}"; then
msg "done. Signature is OK, continue booting."
else
echo "ERROR: one or more files are corrupted"
launch_interactive_shell
fi
else
echo "ERROR: verify=y option specified but ${root}/${fs}.img.sig not found"
launch_interactive_shell
fi
fi
}
_gen_arg() {
local arg="${1}"
echo "${lower_dir:-}${lower_dir:+:}${arg}"
}
_mount_root_overlayfs() {
local sfs="${1}"
local src="${bootmnt}/${root}"
local dest_sfs="${live_root}/sfs"
local dest_img="${live_root}/img"
if [[ -f "${src}/${sfs}.img" ]]; then
_mnt_sfs "${src}/${sfs}.img" "${dest_sfs}/${sfs}"
local find_img="${dest_sfs}/${sfs}/LiveOS/${sfs}.img"
if [[ -f "${find_img}" ]]; then
mkdir -p ${dest_img}
lower_dir=$(_gen_arg "${dest_img}/${sfs}")
_mnt_dmsnapshot "${find_img}" "${dest_img}/${sfs}"
else
lower_dir=$(_gen_arg "${dest_sfs}/${sfs}")
fi
fi
}
# This function is called normally from init script, but it can be called
# as chain from other mount handlers.
# args: /path/to/newroot
artix_mount_handler() {
local newroot="${1}"
if ! mountpoint -q "/run/artix/bootmnt"; then
_mnt_dev "${artixdevice}" "/run/artix/bootmnt" "-r" "defaults"
if ! mountpoint -q "${bootmnt}"; then
_mnt_dev "${artixdevice}" "${bootmnt}" "-r" "defaults"
if [[ "${copytoram}" != "y" ]]; then
echo $(readlink -f ${artixdevice}) >> /run/artix/used_block_devices
echo $(readlink -f ${artixdevice}) >> ${live_root}/used_block_devices
fi
fi
if [[ "${checksum}" == "y" ]]; then
for fs in rootfs livefs;do
if [[ -f "/run/artix/bootmnt/${artixbasedir}/${arch}/${fs}.sfs" ]]; then
if [[ -f "/run/artix/bootmnt/${artixbasedir}/${arch}/${fs}.sha512" ]]; then
msg -n ":: Self-test requested, please wait..."
if _verify_checksum "${fs}"; then
msg "done. Checksum is OK, continue booting."
else
echo "ERROR: one or more files are corrupted"
echo "see /tmp/checksum.log for details"
launch_interactive_shell
fi
else
echo "ERROR: checksum=y option specified but ${artixbasedir}/${arch}/${fs}.sha512 not found"
launch_interactive_shell
fi
fi
done
_check_sum "rootfs"
[[ -n "${overlay}" ]] && _check_sum "${overlay}"
fi
if [[ "${verify}" == "y" ]]; then
for fs in rootfs livefs;do
if [[ -f "/run/artix/bootmnt/${artixbasedir}/${arch}/${fs}.sfs" ]]; then
if [[ -f "/run/artix/bootmnt/${artixbasedir}/${arch}/${fs}.sfs.sig" ]]; then
msg -n ":: Signature verification requested, please wait..."
if _verify_signature "${fs}"; then
msg "done. Signature is OK, continue booting."
else
echo "ERROR: one or more files are corrupted"
launch_interactive_shell
fi
else
echo "ERROR: verify=y option specified but ${artixbasedir}/${arch}/${fs}.sfs.sig not found"
launch_interactive_shell
fi
fi
done
_check_sig "rootfs"
[[ -n "${overlay}" ]] && _check_sig "${overlay}"
fi
if [[ "${copytoram}" == "y" ]]; then
msg ":: Mounting /run/artix/copytoram (tmpfs) filesystem, size=${copytoram_size}"
mkdir -p /run/artix/copytoram
mount -t tmpfs -o "size=${copytoram_size}",mode=0755 copytoram /run/artix/copytoram
msg ":: Mounting ${cp2ram} (tmpfs) filesystem, size=${copytoram_size}"
mkdir -p ${cp2ram}
mount -t tmpfs -o "size=${copytoram_size}",mode=0755 copytoram ${cp2ram}
fi
if [[ -n "${cow_device}" ]]; then
_mnt_dev "${cow_device}" "/run/artix/cowspace" "-r" "${cow_flags}"
echo $(readlink -f ${cow_device}) >> /run/artix/used_block_devices
mount -o remount,rw "/run/artix/cowspace"
_mnt_dev "${cow_device}" "${cow}" "-r" "${cow_flags}"
echo $(readlink -f ${cow_device}) >> ${live_root}/used_block_devices
mount -o remount,rw "${cow}"
else
msg ":: Mounting /run/artix/cowspace (tmpfs) filesystem, size=${cow_spacesize}..."
mkdir -p /run/artix/cowspace
mount -t tmpfs -o "size=${cow_spacesize}",mode=0755 cowspace /run/artix/cowspace
msg ":: Mounting ${cow} (tmpfs) filesystem, size=${cow_spacesize}..."
mkdir -p ${cow}
mount -t tmpfs -o "size=${cow_spacesize}",mode=0755 cowspace ${cow}
fi
mkdir -p -m 0700 "/run/artix/cowspace/${cow_directory}"
mkdir -p -m 0700 "${cow}/${cow_directory}"
msg -n ":: Mounting overlay root (tmpfs) filesystem, size=${overlay_root_size}..."
mkdir -p /run/artix/overlay_root
mount -t tmpfs -o "size=${overlay_root_size}",mode=0755 overlay_root /run/artix/overlay_root
mkdir -p ${overlay_root}
mount -t tmpfs -o "size=${overlay_root_size}",mode=0755 overlay_root ${overlay_root}
local src="/run/artix/bootmnt/${artixbasedir}/${arch}"
local dest_sfs="/run/artix/sfs" dest_img="/run/artix/img"
local lower_dir
for sfs in livefs rootfs;do
if [[ -f "${src}/${sfs}.sfs" ]]; then
_mnt_sfs "${src}/${sfs}.sfs" "${dest_sfs}/${sfs}"
if [[ -f "${dest_sfs}/${sfs}/${sfs}.img" ]]; then
mkdir -p ${dest_img}
lower_dir=${lower_dir:-}${lower_dir:+:}"${dest_img}/${sfs}"
_mnt_dmsnapshot "${dest_sfs}/${sfs}/${sfs}.img" "${dest_img}/${sfs}"
else
lower_dir=${lower_dir:-}${lower_dir:+:}"${dest_sfs}/${sfs}"
fi
fi
done
[[ -n "${overlay}" ]] && _mount_root_overlayfs "${overlay}"
_mount_root_overlayfs "rootfs"
_mnt_overlayfs "${lower_dir}" "${newroot}" "/"
if [[ "${copytoram}" == "y" ]]; then
umount -d /run/artix/bootmnt
mkdir -p /run/artix/bootmnt/${artixbasedir}/${arch}
mount -o bind /run/artix/copytoram /run/artix/bootmnt/${artixbasedir}/${arch}
umount -d ${bootmnt}
mkdir -p ${bootmnt}/${root}
mount -o bind ${cp2ram} ${bootmnt}/${root}
fi
}

View File

@@ -14,15 +14,15 @@ artix_loop_mount_handler () {
local _dev_loop
msg ":: Setup a loop device from ${img_loop} located at device ${img_dev}"
_mnt_dev "${img_dev}" "/run/artix/img_dev" "-r" "${img_flags}"
_mnt_dev "${img_dev}" "${live_root}/img_dev" "-r" "${img_flags}"
if [[ "${copytoram}" != "y" ]]; then
echo $(readlink -f ${img_dev}) >> /run/artix/used_block_devices
echo $(readlink -f ${img_dev}) >> ${live_root}/used_block_devices
fi
if _dev_loop=$(losetup --find --show --read-only "/run/artix/img_dev/${img_loop}"); then
if _dev_loop=$(losetup --find --show --read-only "${live_root}/img_dev/${img_loop}"); then
artixdevice="${_dev_loop}"
else
echo "ERROR: Setting loopback device for file '/run/artix/img_dev/${img_loop}'"
echo "ERROR: Setting loopback device for file '${live_root}/img_dev/${img_loop}'"
launch_interactive_shell
fi
@@ -30,6 +30,6 @@ artix_loop_mount_handler () {
if [[ "${copytoram}" == "y" ]]; then
losetup -d ${_dev_loop} 2>/dev/null
umount /run/artix/img_dev
umount ${live_root}/img_dev
fi
}

View File

@@ -17,13 +17,13 @@ run_hook() {
# Fetch a file with CURL
#
# $1 URL
# $2 Destination directory inside httpspace/${artixbasedir}
# $2 Destination directory inside httpspace/${root}
_curl_get() {
local _url="${1}"
local _dst="${2}"
msg ":: Downloading '${_url}'"
if ! curl -L -f -o "/run/artix/httpspace/${artixbasedir}${_dst}/${_url##*/}" --create-dirs "${_url}"; then
if ! curl -L -f -o "${live_root}/httpspace/${root}${_dst}/${_url##*/}" --create-dirs "${_url}"; then
echo "ERROR: Downloading '${_url}'"
echo " Falling back to interactive prompt"
echo " You can try to fix the problem manually, log out when you are finished"
@@ -31,29 +31,33 @@ _curl_get() {
fi
}
_get_sfs() {
local _sfs="${2}"
local _src=${artix_http_srv}${root}
if [[ ! -z "$( curl -s --head "${_src}/${_sfs}.img" | grep "OK" )" ]]; then
_curl_get "${_src}/${_sfs}.img" "/"
if [[ "${checksum}" == "y" ]]; then
_curl_get "${_src}/${_sfs}.md5" "/"
fi
if [[ "${verify}" == "y" ]]; then
_curl_get "${_src}/${_sfs}.img.sig" "/"
fi
fi
}
artix_pxe_http_mount_handler () {
newroot="${1}"
msg ":: Mounting /run/artix/httpspace (tmpfs) filesystem, size='${artix_http_spc}'"
mkdir -p "/run/artix/httpspace"
mount -t tmpfs -o size="${artix_http_spc}",mode=0755 httpspace "/run/artix/httpspace"
msg ":: Mounting ${live_root}/httpspace (tmpfs) filesystem, size='${artix_http_spc}'"
mkdir -p "${live_root}/httpspace"
mount -t tmpfs -o size="${artix_http_spc}",mode=0755 httpspace "${live_root}/httpspace"
local _src=${artix_http_srv}${artixbasedir}/${arch}
_get_sfs "rootfs"
[[ -n "${overlay}" ]] && _mount_root_overlayfs "${overlay}"
for sfs in livefs rootfs;do
if [[ ! -z "$( curl -s --head "${_src}/${sfs}.sfs" | grep "OK" )" ]]; then
_curl_get "${_src}/${sfs}.sfs" "/${arch}"
if [[ "${checksum}" == "y" ]]; then
_curl_get "${_src}/${sfs}.md5" "/${arch}"
fi
if [[ "${verify}" == "y" ]]; then
_curl_get "${_src}/${sfs}.sfs.sig" "/${arch}"
fi
fi
done
mkdir -p "/run/artix/bootmnt"
mount -o bind /run/artix/httpspace /run/artix/bootmnt
mkdir -p "${bootmnt}"
mount -o bind ${live_root}/httpspace ${bootmnt}
artix_mount_handler ${newroot}
}

View File

@@ -12,10 +12,10 @@ run_hook() {
artix_nfs_mount_handler() {
newroot="${1}"
mkdir -p "/run/artix/bootmnt"
mkdir -p "${bootmnt}"
msg ":: Mounting '${artix_nfs_srv}'"
# Do not put "${artix_nfs_opt}" nfsmount fails!
if ! nfsmount ${artix_nfs_opt} "${artix_nfs_srv}" "/run/artix/bootmnt"; then
if ! nfsmount ${artix_nfs_opt} "${artix_nfs_srv}" "${bootmnt}"; then
echo "ERROR: Mounting '${artix_nfs_srv}'"
echo " Falling back to interactive prompt"
echo " You can try to fix the problem manually, log out when you are finished"

View File

@@ -5,8 +5,7 @@ mkdir /oldrun
mount -n --move /oldroot/run /oldrun
# Unmount all mounts now.
#umount $(mount | awk '$3 ~/^\/oldroot/ {print $3}' | sort -r)
umount $(mount | awk '$3 ~/^\/oldroot/ {if($3 != "/run/artix/bootmnt") print $3}' | sort -r)
umount $(mount | awk '$3 ~/^\/oldroot/ {print $3}' | sort -r)
# Remove all dm-snapshot devices.
dmsetup remove_all
@@ -26,7 +25,7 @@ if [[ ! -d /oldrun/artix/copytoram ]]; then
if [[ -d /oldrun/artix/img_dev ]]; then
umount /oldrun/artix/img_dev
else
umount /oldrun/artix/bootmnt
umount /oldrun/bootmnt
fi
fi

View File

@@ -15,7 +15,7 @@
# export LC_MESSAGES=C
export LANG=C
if [[ -t 2 ]]; then
if [[ -t 2 && "$TERM" != dumb ]]; then
colorize
else
declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW=''

View File

@@ -42,6 +42,12 @@ add_svc_s6(){
fi
done
chroot $mnt s6-rc-bundle -c /etc/s6/rc/compiled add $rlvl $valid
# rebuild s6-linux-init binaries
chroot $mnt rm -r /etc/s6/current
chroot $mnt s6-linux-init-maker -1 -N -f /etc/s6/skel -G "/usr/bin/agetty -L -8 tty1 115200" -c /etc/s6/current /etc/s6/current
chroot $mnt mv /etc/s6/current/bin/init /etc/s6/current/bin/s6-init
chroot $mnt cp -a /etc/s6/current/bin /usr
}
set_xdm(){
@@ -139,6 +145,21 @@ write_postcfg(){
printf '%s' "${yaml}"
}
write_unpackfs() {
local yaml=$(write_yaml_header)
yaml+=$(write_yaml_map 0 'unpack')
# if ${persist}; then
# yaml+=$(write_yaml_seq_map 2 'source' '"/run/artix/bootmnt/LiveOS/rootfs.img"')
# yaml+=$(write_yaml_map 4 'sourcefs' '"ext4"')
# else
yaml+=$(write_yaml_seq_map 2 'source' '"/run/artix/bootmnt/LiveOS/rootfs.img"')
yaml+=$(write_yaml_map 4 'sourcefs' '"squashfs"')
# fi
yaml+=$(write_yaml_map 4 'destination' '""')
yaml+=$(write_empty_line)
printf '%s' "${yaml}"
}
configure_calamares(){
local mods="$1/etc/calamares/modules"
if [[ -d "$mods" ]];then
@@ -146,12 +167,13 @@ configure_calamares(){
write_users_conf > "$mods"/users.conf
write_services_"${INITSYS}"_conf "$mods"
write_postcfg > "$mods"/postcfg.conf
write_unpackfs > "$mods"/unpackfs.conf
sed -e "s|services-openrc|services-${INITSYS}|" \
-i "$1"/etc/calamares/settings.conf
fi
}
configure_image(){
configure_chroot(){
local fs="$1"
msg "Configuring [%s]" "${fs##*/}"
configure_hosts "$fs"
@@ -163,3 +185,40 @@ configure_image(){
write_live_session_conf > "$fs/etc/artools/live.conf"
msg "Done configuring [%s]" "${fs##*/}"
}
clean_up_chroot(){
local path mnt="$1"
msg2 "Cleaning [%s]" "${mnt##*/}"
path=$mnt/boot
if [[ -d "$path" ]]; then
find "$path" -name 'initramfs*.img' -delete &> /dev/null
fi
path=$mnt/var/lib/pacman/sync
if [[ -d $path ]];then
find "$path" -type f -delete &> /dev/null
fi
path=$mnt/var/cache/pacman/pkg
if [[ -d $path ]]; then
find "$path" -type f -delete &> /dev/null
fi
path=$mnt/var/log
if [[ -d $path ]]; then
find "$path" -type f -delete &> /dev/null
fi
path=$mnt/var/tmp
if [[ -d $path ]];then
find "$path" -mindepth 1 -delete &> /dev/null
fi
path=$mnt/tmp
if [[ -d $path ]];then
find "$path" -mindepth 1 -delete &> /dev/null
fi
find "$mnt" -name *.pacnew -name *.pacsave -name *.pacorig -delete
if [[ -f "$mnt/boot/grub/grub.cfg" ]]; then
rm $mnt/boot/grub/grub.cfg
fi
if [[ -f "$mnt/etc/machine-id" ]]; then
rm $mnt/etc/machine-id
fi
}

View File

@@ -12,42 +12,8 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
prepare_initcpio(){
msg2 "Copying initcpio ..."
local dest="$1"
cp /etc/initcpio/hooks/artix* $dest/etc/initcpio/hooks
cp /etc/initcpio/install/artix* $dest/etc/initcpio/install
cp /etc/initcpio/artix_shutdown $dest/etc/initcpio
}
prepare_initramfs(){
local mnt="$1"
cp ${DATADIR}/mkinitcpio.conf $mnt/etc/mkinitcpio-artix.conf
if [[ "${PROFILE}" != 'base' ]];then
sed -e 's/artix_pxe_common artix_pxe_http artix_pxe_nbd artix_pxe_nfs //' -i $mnt/etc/mkinitcpio-artix.conf
fi
if [[ -n ${GPG_KEY} ]]; then
su ${OWNER} -c "gpg --export ${GPG_KEY} >/tmp/GPG_KEY"
exec 17<>/tmp/GPG_KEY
fi
local _kernel=$(<$mnt/usr/src/linux/version)
ARTIX_GNUPG_FD=${GPG_KEY:+17} artools-chroot $mnt \
/usr/bin/mkinitcpio -k ${_kernel} \
-c /etc/mkinitcpio-artix.conf \
-g /boot/initramfs.img
if [[ -n ${GPG_KEY} ]]; then
exec 17<&-
fi
if [[ -f /tmp/GPG_KEY ]]; then
rm /tmp/GPG_KEY
fi
}
prepare_boot_extras(){
local src="$1" dest="$2"
local src="$1" dest=${iso_root}/boot
for u in intel amd;do
cp $src/boot/$u-ucode.img $dest/$u-ucode.img
@@ -58,18 +24,121 @@ prepare_boot_extras(){
cp $src/usr/share/licenses/common/GPL2/license.txt $dest/memtest.COPYING
}
##################dracut##################
prepare_initramfs_dracut(){
local mnt="$1"
local kver=$(<"$mnt"/usr/src/linux/version)
printf "%s\n" 'add_dracutmodules+=" dmsquash-live"' > "$mnt"/etc/dracut.conf.d/50-live.conf
msg "Starting build: %s" "${kver}"
artools-chroot "$mnt" dracut -fqM /boot/initramfs.img "$kver"
msg "Image generation successful"
cp "$mnt"/boot/initramfs.img "${iso_root}"/boot/initramfs-"${ARCH}".img
prepare_boot_extras "$mnt"
}
configure_grub_dracut(){
msg "Configuring grub kernel options ..."
local kopts=(
"root=live:LABEL=${iso_label}"
'rd.live.squashimg=rootfs.img'
'rd.live.image'
'rootflags=auto'
)
[[ "${PROFILE}" != 'base' ]] && kopts+=("rd.live.join=livefs.img")
local ro_opts=()
local rw_opts=()
# 'rd.writable.fsimg=1'
sed -e "s|@kopts@|${kopts[*]}|" \
-e "s|@ro_opts@|${ro_opts[*]}|" \
-e "s|@rw_opts@|${rw_opts[*]}|" \
-i ${iso_root}/boot/grub/kernels.cfg
}
#############################################
write_mkinitcpio_conf() {
msg2 "Writing mkinitcpio.conf ..."
local conf="$1/etc/mkinitcpio-artix.conf"
printf "%s\n" 'MODULES=(loop dm-snapshot)' > $conf
printf "%s\n" 'COMPRESSION="xz"' >> $conf
if [[ "${PROFILE}" == 'base' ]];then
printf "%s\n" 'HOOKS=(base udev artix_shutdown artix artix_loop_mnt
artix_pxe_common artix_pxe_http artix_pxe_nbd artix_pxe_nfs
artix_kms modconf block filesystems keyboard keymap)' >> $conf
else
printf "%s\n" 'HOOKS=(base udev artix_shutdown artix artix_loop_mnt
artix_kms modconf block filesystems keyboard keymap)' >> $conf
fi
}
prepare_initcpio(){
msg2 "Copying initcpio ..."
local dest="$1"
cp /etc/initcpio/hooks/artix* $dest/etc/initcpio/hooks
cp /etc/initcpio/install/artix* $dest/etc/initcpio/install
cp /etc/initcpio/artix_shutdown $dest/etc/initcpio
}
prepare_initramfs(){
local mnt="$1"
prepare_initcpio "$mnt"
write_mkinitcpio_conf "$mnt"
if [[ -n ${GPG_KEY} ]]; then
su ${OWNER} -c "gpg --export ${GPG_KEY} >/tmp/GPG_KEY"
exec 17<>/tmp/GPG_KEY
fi
local _kernel=$(<"$mnt"/usr/src/linux/version)
ARTIX_GNUPG_FD=${GPG_KEY:+17} artools-chroot "$mnt" \
/usr/bin/mkinitcpio -k ${_kernel} \
-c /etc/mkinitcpio-artix.conf \
-g /boot/initramfs.img
if [[ -n ${GPG_KEY} ]]; then
exec 17<&-
fi
if [[ -f /tmp/GPG_KEY ]]; then
rm /tmp/GPG_KEY
fi
cp $mnt/boot/initramfs.img ${iso_root}/boot/initramfs-${ARCH}.img
prepare_boot_extras "$mnt"
}
configure_grub(){
sed -e "s|@iso_label@|${iso_label}|" -i ${iso_root}/boot/grub/kernels.cfg
msg "Configuring grub kernel options ..."
local ro_opts=()
local rw_opts=()
local kopts=("label=${iso_label}")
[[ "${PROFILE}" != 'base' ]] && kopts+=('overlay=livefs')
sed -e "s|@kopts@|${kopts[*]}|" \
-e "s|@ro_opts@|${ro_opts[*]}|" \
-e "s|@rw_opts@|${rw_opts[*]}|" \
-i ${iso_root}/boot/grub/kernels.cfg
}
prepare_grub(){
local platform=i386-pc img='core.img' prefix=/boot/grub
local lib=$1/usr/lib/grub theme=$2/usr/share/grub
local lib="$1"/usr/lib/grub
local theme="$1"/usr/share/grub
local livecfg="$2"/usr/share/grub
local grub=${iso_root}/boot/grub efi=${iso_root}/efi/boot
prepare_dir ${grub}/${platform}
cp ${theme}/cfg/*.cfg ${grub}
cp ${livecfg}/cfg/*.cfg ${grub}
cp ${lib}/${platform}/* ${grub}/${platform}
@@ -92,8 +161,9 @@ prepare_grub(){
grub-mkimage -d ${grub}/${platform} -o ${efi}/${img} -O ${platform} -p ${prefix} iso9660
prepare_dir ${grub}/themes
cp -r ${theme}/themes/artix ${grub}/themes/
cp -r ${theme}/{locales,tz} ${grub}
cp -r ${theme}/themes/artix ${grub}/themes
cp -r ${livecfg}/{locales,tz} ${grub}
if [[ -f /usr/share/grub/unicode.pf2 ]];then
msg2 "Copying %s ..." "unicode.pf2"
@@ -103,7 +173,7 @@ prepare_grub(){
grub-mkfont -o ${grub}/unicode.pf2 /usr/share/fonts/misc/unifont.bdf
fi
local size=4M mnt="${mnt_dir}/efiboot" efi_img="${iso_root}/efi.img"
local size=4M mnt="${mnt_dir}/efiboot" efi_img="${iso_root}/boot/efi.img"
msg2 "Creating fat image of %s ..." "${size}"
truncate -s ${size} "${efi_img}"
mkfs.fat -n ARTIX_EFI "${efi_img}" &>/dev/null

View File

@@ -13,88 +13,100 @@
# GNU General Public License for more details.
make_sig () {
local idir="$1" file="$2"
local file="$1"
msg2 "Creating signature file..."
cd "$idir"
chown "${OWNER}:$(id --group ${OWNER})" "$idir"
su ${OWNER} -c "gpg --detach-sign --default-key ${GPG_KEY} $file.sfs"
chown -R root "$idir"
cd ${iso_root}${live_dir}
chown "${OWNER}:$(id --group ${OWNER})" "${iso_root}${live_dir}"
su ${OWNER} -c "gpg --detach-sign --default-key ${GPG_KEY} $file"
chown -R root "${iso_root}${live_dir}"
cd ${OLDPWD}
}
make_checksum(){
local idir="$1" file="$2"
msg2 "Creating sha512sum ..."
cd $idir
sha512sum $file.sfs > $file.sha512
local file="$1"
msg2 "Creating md5sum ..."
cd ${iso_root}${live_dir}
md5sum $file > $file.md5
cd ${OLDPWD}
}
make_ext_img(){
local src="$1"
local size=32G
local mnt="${mnt_dir}/${src##*/}"
mkdir -p ${work_dir}/embed${live_dir}
local extimg=${work_dir}/embed${live_dir}/${src##*/}.img
msg2 "Creating ext4 image of %s ..." "${size}"
truncate -s ${size} "${extimg}"
local ext4_args=()
ext4_args+=(-O ^has_journal,^resize_inode -E lazy_itable_init=0 -m 0)
mkfs.ext4 ${ext4_args[@]} -F "${extimg}" &>/dev/null
tune2fs -c 0 -i 0 "${extimg}" &> /dev/null
mount_img "${extimg}" "${mnt}"
msg2 "Copying %s ..." "${src}/"
cp -aT "${src}/" "${mnt}/"
umount_img "${mnt}"
}
has_changed(){
local src="$1" dest="$2"
if [[ -f "${dest}" ]]; then
local has_changes=$(find ${src} -newer ${dest})
if [[ -n "${has_changes}" ]]; then
msg2 "Possible changes for %s ..." "${src}"
msg2 "%s" "${has_changes}"
msg2 "SquashFS image %s is not up to date, rebuilding..." "${dest}"
rm "${dest}"
else
msg2 "SquashFS image %s is up to date, skipping." "${dest}"
return 1
fi
fi
}
# $1: image path
make_sfs() {
local src="$1"
if [[ ! -e "${src}" ]]; then
error "The path %s does not exist" "${src}"
local sfs_in="$1"
if [[ ! -e "${sfs_in}" ]]; then
error "The path %s does not exist" "${sfs_in}"
retrun 1
fi
local timer=$(get_timer) dest=${iso_root}/artix/${ARCH}
local name=${1##*/}
local sfs="${dest}/${name}.sfs"
mkdir -p ${dest}
msg "Generating SquashFS image for %s" "${src}"
if [[ -f "${sfs}" ]]; then
local has_changed_dir=$(find ${src} -newer ${sfs})
msg2 "Possible changes for %s ..." "${src}" >> /tmp/buildiso.debug
msg2 "%s" "${has_changed_dir}" >> /tmp/buildiso.debug
if [[ -n "${has_changed_dir}" ]]; then
msg2 "SquashFS image %s is not up to date, rebuilding..." "${sfs}"
rm "${sfs}"
mkdir -p ${iso_root}${live_dir}
local img_name=${sfs_in##*/}.img
local img_file=${sfs_in}.img
local sfs_out="${iso_root}${live_dir}/${img_name}"
if has_changed "${sfs_in}" "${sfs_out}"; then
msg "Generating SquashFS image for %s" "${sfs_in}"
local mksfs_args=()
if ${persist};then
make_ext_img "${sfs_in}"
mksfs_args+=("${work_dir}/embed")
else
msg2 "SquashFS image %s is up to date, skipping." "${sfs}"
return
mksfs_args+=("${sfs_in}")
fi
mksfs_args+=("${sfs_out}")
mksfs_args+=(-comp xz -b 256K -Xbcj x86 -noappend)
mksquashfs "${mksfs_args[@]}"
if ! ${use_dracut}; then
make_checksum "${img_name}"
if [[ -n ${GPG_KEY} ]];then
make_sig "${img_name}"
fi
fi
${persist} && rm -r "${work_dir}/embed"
fi
if ${persist};then
local size=32G
local mnt="${mnt_dir}/${name}"
msg2 "Creating ext4 image of %s ..." "${size}"
truncate -s ${size} "${src}.img"
local ext4_args=()
ext4_args+=(-O ^has_journal,^resize_inode -E lazy_itable_init=0 -m 0)
mkfs.ext4 ${ext4_args[@]} -F "${src}.img" &>/dev/null
tune2fs -c 0 -i 0 "${src}.img" &> /dev/null
mount_img "${work_dir}/${name}.img" "${mnt}"
msg2 "Copying %s ..." "${src}/"
cp -aT "${src}/" "${mnt}/"
umount_img "${mnt}"
fi
msg2 "Creating SquashFS image, this may take some time..."
local mksfs_args=()
if ${persist};then
mksfs_args+=(${work_dir}/${name}.img)
else
mksfs_args+=(${src})
fi
mksfs_args+=(${sfs} -noappend)
local highcomp="-b 256K -Xbcj x86" comp='xz'
mksfs_args+=(-comp ${comp} ${highcomp})
mksquashfs "${mksfs_args[@]}"
make_checksum "${dest}" "${name}"
${persist} && rm "${src}.img"
if [[ -n ${GPG_KEY} ]];then
make_sig "${dest}" "${name}"
fi
show_elapsed_time "${FUNCNAME}" "${timer_start}"
}
get_disturl(){
@@ -124,10 +136,11 @@ assemble_iso(){
-c boot.catalog \
-no-emul-boot -boot-load-size 4 -boot-info-table --grub2-boot-info \
-eltorito-alt-boot \
-append_partition 2 0xef ${iso_root}/efi.img \
-append_partition 2 0xef ${iso_root}/boot/efi.img \
-e --interval:appended_partition_2:all:: -iso_mbr_part_type 0x00 \
-no-emul-boot \
-iso-level 3 \
-o ${iso_dir}/${iso_file} \
${iso_root}/
}

View File

@@ -37,7 +37,7 @@ track_fs() {
mount "$@" && FS_ACTIVE_MOUNTS=("$5" "${FS_ACTIVE_MOUNTS[@]}")
}
mount_overlay(){
mount_overlayfs(){
FS_ACTIVE_MOUNTS=()
local lower= upper="$1" work="$2"
mkdir -p "${mnt_dir}/work"
@@ -52,7 +52,7 @@ mount_overlay(){
track_fs -t overlay overlay -olowerdir="$lower",upperdir="$upper",workdir="${mnt_dir}/work" "$upper"
}
umount_overlay(){
umount_overlayfs(){
if [[ -n ${FS_ACTIVE_MOUNTS[@]} ]];then
info "overlayfs umount: [%s]" "${FS_ACTIVE_MOUNTS[@]}"
umount "${FS_ACTIVE_MOUNTS[@]}"

View File

@@ -19,7 +19,7 @@ error_function() {
error "A failure occurred in %s()." "$func"
plain "Aborting..."
fi
umount_overlay
umount_overlayfs
umount_img
exit 2
}
@@ -41,7 +41,7 @@ run_safe() {
trap_exit() {
local sig=$1; shift
error "$@"
umount_overlay
umount_overlayfs
trap -- "$sig"
kill "-$sig" "$$"
}
@@ -54,27 +54,6 @@ prepare_traps(){
# trap 'trap_exit USR1 "$(gettext "An unknown error has occurred. Exiting...")"' ERR
}
# Build ISO
make_iso() {
msg "Start [Build ISO]"
touch "${iso_root}/.artix"
for sfs_dir in $(find "${work_dir}" -maxdepth 1 -type d); do
if [[ "${sfs_dir}" != "${work_dir}" ]]; then
make_sfs "${sfs_dir}"
fi
done
msg "Making bootable image"
# Sanity checks
[[ ! -d "${iso_root}" ]] && return 1
if [[ -f "${iso_dir}/${iso_file}" ]]; then
msg2 "Removing existing bootable image..."
rm -rf "${iso_dir}/${iso_file}"
fi
assemble_iso
msg "Done [Build ISO]"
}
copy_overlay(){
local src="$1" dest="$2"
if [[ -e "$src" ]];then
@@ -83,43 +62,6 @@ copy_overlay(){
fi
}
clean_up_image(){
local path mnt="$1"
msg2 "Cleaning [%s]" "${mnt##*/}"
path=$mnt/boot
if [[ -d "$path" ]]; then
find "$path" -name 'initramfs*.img' -delete &> /dev/null
fi
path=$mnt/var/lib/pacman/sync
if [[ -d $path ]];then
find "$path" -type f -delete &> /dev/null
fi
path=$mnt/var/cache/pacman/pkg
if [[ -d $path ]]; then
find "$path" -type f -delete &> /dev/null
fi
path=$mnt/var/log
if [[ -d $path ]]; then
find "$path" -type f -delete &> /dev/null
fi
path=$mnt/var/tmp
if [[ -d $path ]];then
find "$path" -mindepth 1 -delete &> /dev/null
fi
path=$mnt/tmp
if [[ -d $path ]];then
find "$path" -mindepth 1 -delete &> /dev/null
fi
find "$mnt" -name *.pacnew -name *.pacsave -name *.pacorig -delete
if [[ -f "$mnt/boot/grub/grub.cfg" ]]; then
rm $mnt/boot/grub/grub.cfg
fi
if [[ -f "$mnt/etc/machine-id" ]]; then
rm $mnt/etc/machine-id
fi
}
make_rootfs() {
if [[ ! -e ${work_dir}/rootfs.lock ]]; then
msg "Prepare [Base installation] (rootfs)"
@@ -131,9 +73,9 @@ make_rootfs() {
copy_overlay "${ROOT_OVERLAY}" "${rootfs}"
[[ -z ${LIVE_LIST} ]] && configure_image "${rootfs}"
[[ -z ${LIVE_LIST} ]] && configure_chroot "${rootfs}"
clean_up_image "${rootfs}"
clean_up_chroot "${rootfs}"
: > ${work_dir}/rootfs.lock
@@ -148,17 +90,17 @@ make_livefs() {
prepare_dir "${livefs}"
mount_overlay "${livefs}" "${work_dir}"
mount_overlayfs "${livefs}" "${work_dir}"
basestrap "${basestrap_args[@]}" "${livefs}" "${packages[@]}"
copy_overlay "${LIVE_OVERLAY}" "${livefs}"
configure_image "${livefs}"
configure_chroot "${livefs}"
umount_overlay
umount_overlayfs
clean_up_image "${livefs}"
clean_up_chroot "${livefs}"
: > ${work_dir}/livefs.lock
@@ -169,23 +111,22 @@ make_livefs() {
make_bootfs() {
if [[ ! -e ${work_dir}/bootfs.lock ]]; then
msg "Prepare [/iso/boot]"
local boot="${iso_root}/boot"
prepare_dir "${boot}"
prepare_dir "${iso_root}/boot"
cp ${work_dir}/rootfs/boot/vmlinuz* ${boot}/vmlinuz-${ARCH}
cp ${work_dir}/rootfs/boot/vmlinuz* ${iso_root}/boot/vmlinuz-${ARCH}
local bootfs="${work_dir}/bootfs"
mount_overlay "${bootfs}" "${work_dir}"
mount_overlayfs "${bootfs}" "${work_dir}"
prepare_initcpio "${bootfs}"
prepare_initramfs "${bootfs}"
if ${use_dracut}; then
prepare_initramfs_dracut "${bootfs}"
else
prepare_initramfs "${bootfs}"
fi
cp ${bootfs}/boot/initramfs.img ${boot}/initramfs-${ARCH}.img
prepare_boot_extras "${bootfs}" "${boot}"
umount_overlay
umount_overlayfs
rm -R ${bootfs}
: > ${work_dir}/bootfs.lock
@@ -202,30 +143,13 @@ make_grub(){
prepare_grub "${work_dir}/rootfs" "$layer"
configure_grub
if ${use_dracut}; then
configure_grub_dracut
else
configure_grub
fi
: > ${work_dir}/grub.lock
msg "Done [/iso/boot/grub]"
fi
}
compress_images(){
local timer=$(get_timer)
run_safe "make_iso"
chown -R "${OWNER}:$(id --group ${OWNER})" "${iso_dir}"
show_elapsed_time "${FUNCNAME}" "${timer}"
}
prepare_images(){
local timer=$(get_timer)
load_pkgs "${ROOT_LIST}" "${INITSYS}"
run_safe "make_rootfs"
if [[ -n ${LIVE_LIST} ]]; then
load_pkgs "${LIVE_LIST}" "${INITSYS}"
run_safe "make_livefs"
fi
run_safe "make_bootfs"
run_safe "make_grub"
show_elapsed_time "${FUNCNAME}" "${timer}"
}

View File

@@ -12,6 +12,8 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
shopt -s extglob
get_compliant_name(){
local gitname="$1"
case $gitname in
@@ -145,7 +147,7 @@ find_cached_package() {
for dir in "${searchdirs[@]}"; do
[[ -d $dir ]] || continue
for pkg in "$dir"/*.pkg.tar.?z; do
for pkg in "$dir"/*.pkg.tar?(.!(sig|*.*)); do
[[ -f $pkg ]] || continue
# avoid adding duplicates of the same inode
@@ -155,7 +157,7 @@ find_cached_package() {
# split apart package filename into parts
pkgbasename=${pkg##*/}
pkgbasename=${pkgbasename%.pkg.tar.?z}
pkgbasename=${pkgbasename%.pkg.tar*}
arch=${pkgbasename##*-}
pkgbasename=${pkgbasename%-"$arch"}

View File

@@ -20,26 +20,23 @@ DATADIR=${DATADIR:-'@datadir@/artools'}
LIBDIR=${LIBDIR:-'@libdir@/artools'}
SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'}
OWNER=${SUDO_USER:-$USER}
if [[ -n $SUDO_USER ]]; then
eval "USER_HOME=~$SUDO_USER"
else
USER_HOME=$HOME
fi
USER_CONF_DIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/artools"
for baselib in ${LIBDIR}/base/*.sh; do
. $baselib
done
load_user_info(){
OWNER=${SUDO_USER:-$USER}
if [[ -n $SUDO_USER ]]; then
eval "USER_HOME=~$SUDO_USER"
else
USER_HOME=$HOME
fi
XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-$USER_HOME/.config}"
USER_CONF_DIR="${XDG_CONFIG_HOME}/artools"
prepare_artools(){
prepare_dir "${WORKSPACE_DIR}"
prepare_dir "${USER_CONF_DIR}"
USER_CACHE_DIR="${XDG_CACHE_HOME:-$USER_HOME/.cache}/artools"
}
load_base_config(){
@@ -50,18 +47,13 @@ load_base_config(){
[[ -r "$conf" ]] && . "$conf"
ARCH=$(uname -m)
CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'}
WORKSPACE_DIR=${WORKSPACE_DIR:-"/home/${OWNER}/artools-workspace"}
prepare_dir "${WORKSPACE_DIR}"
return 0
}
load_user_info
load_base_config "${USER_CONF_DIR}" || load_base_config "${SYSCONFDIR}"

View File

@@ -30,8 +30,6 @@ load_iso_config(){
ISO_POOL=${ISO_POOL:-"${WORKSPACE_DIR}/iso"}
prepare_dir "${ISO_POOL}"
PROFILE='base'
ISO_VERSION=${ISO_VERSION:-"$(date +%Y%m%d)"}

View File

@@ -43,6 +43,7 @@ load_pkg_config(){
packages-kernel
packages-openrc
packages-runit
packages-s6
packages-xorg
packages-python
packages-perl