chiark / gitweb /
81c811f3ad62aaaf0e658520bc59f7046f6706eb
[distorted-chroot] / mess / maint / mkbuildchroot
1 #! /bin/sh -e
2
3 vg=vg-$(hostname)
4 lvsz=-L8g
5 mirror=http://deb.debian.org/debian/
6 myarch=$(dpkg-architecture -qDEB_HOST_ARCH) qemup=nil; unset myqarch
7 eval $(apt-config -c /usr/local.schroot/config/apt/conf.d/90local \
8   shell http_proxy Acquire::http::proxy)
9 case ${http_proxy+t} in t) export http_proxy ;; esac
10
11 badp=nil forcep=nil dbsopts= crossp=nil; unset qemu
12 while getopts "a:e:fm:q:Qv:z:x" opt; do
13   case $opt in
14     a) myarch=$OPTARG ;;
15     f) forcep=t ;;
16     m) mirror=$OPTARG ;;
17     q) myqarch=$OPTARG ;;
18     Q) qemup=t dbsopts=--foreign ;;
19     v) vg=$OPTARG ;;
20     x) crossp=t ;;
21     z) lvsz=-$OPTARG ;;
22     *) badp=t ;;
23   esac
24 done
25 shift $(( $OPTIND - 1 ))
26 case $# in 0) badp=t ;; esac
27 case $badp in
28   t)
29     cat >&2 <<EOF
30 usage: $0 [-fxQ] [-a MYARCH] [-m MIRROR] [-q MYQARCH] [-v VG] [-z LVSZ]
31         DIST-ARCH ...
32 EOF
33     exit 1
34     ;;
35 esac
36 case ${myqarch+t} in t) ;; *) myqarch=$myarch ;; esac
37 for arg in "$@"; do
38   case $arg in *-*-*) echo >&2 "$0: bad chroot name \`$arg'"; exit 1 ;; esac
39 done
40 if [ ! -d /dev/$vg/ ]; then echo >&2 "$0: no volume group \`$vg'"; exit 1; fi
41
42 for arg in "$@"; do
43   d=${arg%-*} a=${arg#*-}
44   mnt=/mnt/chroot/$d-$a
45   mkdir -p $mnt
46   if mountpoint -q $mnt; then umount $mnt; fi
47   if [ -b /dev/$vg/$d-$a ]; then
48     case $forcep in
49       nil) echo >&2 "$0: volume \`$d-$a' already exists"; exit 1 ;;
50       t) lvremove -f $vg/$d-$a ;;
51     esac
52   fi
53   lvcreate --yes $lvsz -n$arg $vg
54   mkfs -j -L$arg /dev/$vg/$arg
55   mount -orelatime,data=writeback,commit=3600,barrier=0 /dev/$vg/$arg $mnt/
56   mkdir -m755 $mnt/fs/
57   chmod 750 $mnt/
58   pkgs=ccache,eatmydata,fakeroot,libfile-fcntllock-perl,locales,tzdata
59   case $crossp in nil) pkgs=$pkgs,build-essential ;; esac
60   eatmydata debootstrap $dbsopts --arch=$a --variant=minbase --include=$pkgs \
61     $d $mnt/fs/ $mirror
62   case $qemup in
63     t)
64       case $a in
65         armel | armhf) qarch=arm ;;
66         arm64) qarch=aarch64 ;;
67         amd64) qarch=x86_64 ;;
68         i386) qarch=i386 ;;
69         *) echo >&2 "$0: no qemu arch for $a"; exit 1 ;;
70       esac
71       qemu=qemu-$qarch-static
72       install /usr/local.schroot/cross/$d-$myqarch/QEMU/$qemu $mnt/fs/usr/bin/
73       chroot $mnt/fs/ /debootstrap/debootstrap --second-stage
74       ln -sf /usr/local.schroot/cross/$d-$myqarch/QEMU/$qemu $mnt/fs/usr/bin/
75       ;;
76   esac
77   cd $mnt/fs/usr/
78   rm -rf local/; ln -s local.schroot/$a local
79   cd $mnt/fs/etc/apt/
80   rm -rf apt.conf sources.list
81   ln -s /usr/local.schroot/config/apt/conf.d/10sbuild apt.conf.d/
82   ln -s /usr/local.schroot/config/apt/conf.d/90local apt.conf.d/
83   ln -s /usr/local.schroot/config/apt/sources.$d sources.list
84   cat >apt.conf.d/20arch <<EOF
85 ### -*-conf-*-
86
87 APT {
88         Architecture "$a";
89 };
90 EOF
91   cd $mnt/fs/etc/
92   cp /etc/locale.gen /etc/timezone ./
93   tz=$(cat timezone); ln -sf /usr/share/zoneinfo/$tz localtime
94   ln -sf /proc/mounts mtab
95   cd $mnt/fs/etc/default/
96   cp /etc/default/locale .
97   cd $mnt/fs/usr/sbin/
98   cat >policy-rc.d <<EOF
99 #! /bin/sh
100 echo >&2 "policy-rc.d: Services disabled by policy."
101 exit 101
102 EOF
103   chmod +x policy-rc.d
104   cd $mnt/fs/etc/ld.so.conf.d/
105   cat >libc.conf <<EOF
106 # libc default configuration
107 EOF
108   cat >zzz-local.conf <<EOF
109 ### -*-conf-*-
110 ### Local hack to make /usr/local/ late.
111 /usr/local/lib
112 EOF
113   cd /
114   umount $mnt/
115   case $qemup in
116     t)
117       schroot -uroot -csource:$d-$a -- eatmydata sh -e -c "
118         if dpkg-divert >/dev/null 2>&1 --no-rename --help
119         then no_rename=--no-rename
120         else no_rename=
121         fi
122
123         dpkg-divert --package install-cross-tools \$no_rename \
124           --divert /usr/bin/$qemu.$a --add /usr/bin/$qemu"
125       /usr/local.schroot/maint/install-cross-tools -a$myarch -q$myqarch $d-$a
126       ;;
127   esac
128   schroot -uroot -csource:$d-$a -- eatmydata sh -e -c '
129         apt-get update
130         apt-get -y upgrade
131         locale-gen
132         ldconfig
133         apt-get -y autoremove
134         apt-get clean'
135 done