6e6ab3a4fd
- Имена папок: тестовый контур — igate_exchange_test, боевой — igate_exchange (было igate_exchange и igate_exchange_prod); bj переименовывает открытые по прежней схеме сам — при сверке, в первый раз через 30 с после запуска. - После сохранения — все открытые папки с контуром: \\IP\igate_exchange_test (тестовый TEST3), \\IP\igate_exchange (боевой). - Закрыть папки — Samba выключается (сервер не отвечает по SMB, пока папок нет). - Установщик (bj-installer, preseed Debian, слой пакетов образа Ubuntu): samba, winbind, libnss-winbind — заранее, чтобы в закрытом контуре папки открывались без интернета; необязательной частью (нет на диске и нет сети — установка bj продолжается); службы выключены до открытия папок. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
73 lines
4.9 KiB
Bash
Executable File
73 lines
4.9 KiB
Bash
Executable File
#!/bin/bash
|
|
# Слой обновлений для образа Bridge&Join на Ubuntu 22.04: всё, что вышло для 22.04 после выпуска
|
|
# 22.04.5, ставится в образ при сборке — установка тогда докачивает только вышедшее после сборки.
|
|
#
|
|
# sudo deploy/iso/build-ubuntu-updates-layer.sh <ubuntu-22.04.x-live-server-amd64.iso> <выходной каталог>
|
|
#
|
|
# Результат в выходном каталоге:
|
|
# ubuntu-server-minimal.ubuntu-server.bj.squashfs (+ .size, .manifest) — слой поверх «Ubuntu Server»:
|
|
# full-upgrade + ядро linux-generic (ядра в слоях Ubuntu нет, его ставит отдельный шаг установки);
|
|
# установщик Ubuntu собирает систему из слоёв по цепочке имён (minimal → ubuntu-server → bj),
|
|
# оригинальные слои и среда самого установщика не меняются;
|
|
# debs/ — пакеты, которые ставит bj-installer (PostgreSQL, Java, pcscd…), со всеми зависимостями,
|
|
# которых нет в системе: при первой загрузке они ставятся с диска, а не из сети.
|
|
# Нужны root (монтирование, chroot), squashfs-tools, xorriso и доступ к archive.ubuntu.com.
|
|
# Образ стоит пересобирать раз в месяц, чтобы слой не устаревал.
|
|
set -euo pipefail
|
|
SRC=${1:?ubuntu-22.04.x-live-server-amd64.iso}
|
|
OUT=${2:?выходной каталог}
|
|
[ "$(id -u)" = 0 ] || { echo "нужен root"; exit 1; }
|
|
for c in mksquashfs xorriso; do command -v $c >/dev/null || { echo "нужен $c"; exit 1; }; done
|
|
# пакеты — как в bj-installer (stepPackages); Java 17 — служба подписи собрана под неё (в 22.04 по умолчанию 11)
|
|
BJ_PKGS="ca-certificates curl postgresql postgresql-client openjdk-17-jre-headless pcscd python3 smbclient gnome-keyring dbus xvfb xauth libsecret-tools unzip samba winbind libnss-winbind"
|
|
LAYER=ubuntu-server-minimal.ubuntu-server.bj.squashfs
|
|
|
|
mkdir -p "$OUT"
|
|
W=$(mktemp -d "$OUT/work.XXXXXX")
|
|
M="$W/merged"
|
|
cleanup() {
|
|
for d in dev/pts dev proc sys run; do mountpoint -q "$M/$d" 2>/dev/null && umount -l "$M/$d" || true; done
|
|
for d in "$M" "$W/l2" "$W/l1"; do mountpoint -q "$d" 2>/dev/null && umount -l "$d" || true; done
|
|
rm -rf "$W"
|
|
}
|
|
trap cleanup EXIT
|
|
mkdir -p "$W/l1" "$W/l2" "$W/upper" "$W/wk" "$M"
|
|
xorriso -osirrox on -indev "$SRC" \
|
|
-extract /casper/ubuntu-server-minimal.squashfs "$W/minimal.squashfs" \
|
|
-extract /casper/ubuntu-server-minimal.ubuntu-server.squashfs "$W/server.squashfs" >/dev/null 2>&1
|
|
mount -o loop,ro "$W/minimal.squashfs" "$W/l1"
|
|
mount -o loop,ro "$W/server.squashfs" "$W/l2"
|
|
mount -t overlay overlay -o "lowerdir=$W/l2:$W/l1,upperdir=$W/upper,workdir=$W/wk" "$M"
|
|
mount --bind /dev "$M/dev"; mount --bind /dev/pts "$M/dev/pts"
|
|
mount -t proc proc "$M/proc"; mount -t sysfs sys "$M/sys"
|
|
mount -t tmpfs tmpfs "$M/run"
|
|
# DNS в chroot: resolv.conf в Ubuntu — ссылка в /run (tmpfs, в слой не попадает)
|
|
mkdir -p "$M/run/systemd/resolve"; grep '^nameserver' /etc/resolv.conf > "$M/run/systemd/resolve/stub-resolv.conf"
|
|
# службы в chroot не запускать
|
|
printf '#!/bin/sh\nexit 101\n' > "$M/usr/sbin/policy-rc.d"; chmod 755 "$M/usr/sbin/policy-rc.d"
|
|
|
|
in_chroot() { chroot "$M" /usr/bin/env -i PATH=/usr/sbin:/usr/bin:/sbin:/bin DEBIAN_FRONTEND=noninteractive LANG=C.UTF-8 "$@"; }
|
|
APT="apt-get -y -q -o Dpkg::Options::=--force-confold -o Dpkg::Options::=--force-confdef"
|
|
echo "== apt update"; in_chroot apt-get -q update
|
|
echo "== full-upgrade"; in_chroot $APT full-upgrade
|
|
echo "== ядро"; in_chroot $APT install --no-install-recommends linux-generic
|
|
in_chroot apt-get clean
|
|
echo "== пакеты bj (только скачать)"
|
|
in_chroot $APT install --download-only --no-install-recommends $BJ_PKGS
|
|
rm -rf "$OUT/debs"; mkdir -p "$OUT/debs"
|
|
cp "$M"/var/cache/apt/archives/*.deb "$OUT/debs/"
|
|
in_chroot apt-get clean
|
|
in_chroot dpkg-query -W -f '${Package}\t${Version}\n' > "$OUT/${LAYER%.squashfs}.manifest"
|
|
|
|
# убрать следы сборки: policy-rc.d, списки пакетов, кэш, журналы
|
|
rm -f "$M/usr/sbin/policy-rc.d"
|
|
rm -rf "$M"/var/lib/apt/lists/* "$M"/var/cache/apt/*.bin "$M"/var/log/apt/* "$M"/tmp/* 2>/dev/null || true
|
|
for d in dev/pts dev proc sys run; do umount -l "$M/$d"; done
|
|
umount "$M"
|
|
|
|
echo "== слой"
|
|
rm -f "$OUT/$LAYER"
|
|
mksquashfs "$W/upper" "$OUT/$LAYER" -comp xz -xattrs -noappend -no-progress >/dev/null
|
|
du -sb "$W/upper" | cut -f1 > "$OUT/${LAYER%.squashfs}.size"
|
|
echo "Слой: $OUT/$LAYER ($(du -h "$OUT/$LAYER" | cut -f1)), пакетов bj: $(ls "$OUT/debs" | wc -l) ($(du -sh "$OUT/debs" | cut -f1)), ядро: $(grep -P '^linux-image-[0-9]' "$OUT/${LAYER%.squashfs}.manifest" | cut -f1 | tr '\n' ' ')"
|