Mount devfs inside a chroot
[ikiwiki.git] / docs / developer / PbulkBuilding.mdwn
1 ## Bulk build notes 
2
3 Joerg Sonnenberger's new bulk building interface is located in pkgtools/pbulk.  On pkgbox, this is located in /archive/NetBSD-pkgsrc.
4
5 To do this without affecting the existing pkgsrc setup on the machine you are using, you create a chroot and install pkgsrc twice inside it - once for pbulk and the various support programs, and once for the actual pkgsrc where everything is built.
6
7 These notes are taken from Justin Sherrill's test builds on pkgbox.dragonflybsd.org, and from suggestions from Joerg.  This reflects using version 0.36 of pbulk.
8
9 ### Setting up the chroot 
10
11 If getting rid of an earlier install, delete all the files you can, adjust the permissions on the ones left, and then delete what remains.
12
13     rm -rf /build/pbulk_chroot
14     chflags -R noschg /build/pbulk_chroot
15     rm -rf /build/pbulk_chroot
16
17 Create dir for chroot
18
19     mkdir /build/pbulk_chroot
20
21 Add files to chroot
22
23     cd /usr/src
24
25 If there was no prior buildworld in this , you'll need to do this step 
26
27     make DESTDIR=/build/pbulk_chroot buildworld
28
29 Add world to chroot
30
31     make DESTDIR=/build/pbulk_chroot installworld
32
33 note that this is not /etc, but /usr/src/etc
34
35     cd etc
36     make DESTDIR=/build/pbulk_chroot distribution
37
38 Additional files that will be needed in the chroot
39
40     cp /etc/resolv.conf /build/pbulk_chroot/etc
41
42 Make sure you've loaded the linux module if you don't want to get unnecessary messages about unknown ELF types.
43
44     kldload linux.ko
45
46 Jeremy C. Reed has a large repository of the distfiles for pkgsrc in another directory outside of the chroot; mounting it and adding it to DIST_PATH should make it available, saving the bulk build process (and Matt's bandwidth) from having to download more.
47
48     mkdir /build/pbulk_chroot/archive
49     mount_null /archive /build/pbulk_chroot/archive
50
51 Should be ready to go...
52
53     chroot /build/pbulk_chroot
54     /etc/rc.d/ldconfig start
55
56 Depending on the version of DragonFly you are using, you may need to mount dev fs.
57
58     mount_devfs /dev
59
60 ### Adding pkgsrc bootstrap 
61
62 Everything past this point is in the chroot!
63
64     mkdir /bulklog
65     mkdir /scratch
66     mkdir /distfiles
67     mkdir /packages
68
69 Grab the most recent quarterly release of pkgsrc:
70    
71     setenv CVSROOT anoncvs@anoncvs.NetBSD.org:/cvsroot
72     setenv CVS_RSH ssh
73     cd /usr
74     cvs -q checkout -rpkgsrc-2008Q1 -P pkgsrc
75
76 To update the pkgsrc files later
77
78     cvs -q update -dP
79
80 Put this in /root/mk-base.conf, for use later when building the first bootstrap:
81
82     WRKOBJDIR = /scratch
83     PKGSRCDIR = /usr/pkgsrc
84     DISTDIR = /distfiles
85     DIST_PATH = /archive/distfiles
86     PACKAGES = /packages
87
88     FAILOVER_FETCH= yes
89     _ACCEPTABLE=                    yes
90     ALLOW_VULNERABLE_PACKAGES=      yes
91
92     PKG_DEVELOPER?= yes
93     PKG_DEFAULT_OPTIONS="dri inet6"
94
95 We need to create a clean bootstrap kit for later.  This installs pkgsrc tools into /usr/pkg_bulk, too.
96
97 Keep in mind that if any part of the bootstrap was updated and this is not a from-scratch pbulk setup, you will need to delete all the existing packages in /usr/pkg and in /usr/pkg_bulk using the appropriate pkg_delete.  
98
99     mkdir /usr/pkg_bulk/
100     cd /usr/pkgsrc/bootstrap
101     ./bootstrap --prefix /usr/pkg_bulk --pkgdbdir /usr/pkg_bulk/.pkgdb
102
103     cd /usr/pkgsrc/pkgtools/pbulk
104     env PATH=/usr/pkg_bulk/bin:/usr/pkg_bulk/sbin:${PATH} bmake package
105
106     cd /usr/pkgsrc/bootstrap
107     ./cleanup
108     ./bootstrap --gzip-binary-kit /usr/pkgsrc/bootstrap/bootstrap.tgz --mk-fragment=/root/mk-base.conf
109
110 We need to make a binary kit with the corrected mk.conf so that pbulk is always set up with the right version as it builds/removes/adds packages
111
112     cd /usr/pkgsrc/bootstrap
113     mkdir temp
114     mv bootstrap.tgz temp
115     cd temp
116     tar xf bootstrap.tgz
117     cp /usr/pkg/etc/mk.conf usr/pkg/etc/mk.conf
118     tar hzcf ../bootstrap.tar.gz usr var
119
120 Edit /usr/pkg_bulk/etc/pbulk.conf and change these lines to what is needed.  Be sure to put in a destination for the rsync command, as a side effect of that process is the removal of packages that are not for distribution due to various laws.  If this is being performed on a single machine, nfsmount directories in the chroot so that you can still copy the files around.  The rsync options below assume the packages and report are being copied around on the local machine.
121
122     base_url=http://something/you_should_change_here
123     master_mode=no
124
125     pkg_rsync_args="-av --delete-excluded"
126     pkg_rsync_target="/archive/packages/DragonFly-2.0/pkgsrc-current"
127     report_rsync_args="-avz --delete-excluded"
128     report_rsync_target="/archive/packages/DragonFly-2.0/pbulk_report"
129
130     report_recipients="you@your.email"
131     make=/usr/pkg/bin/bmake
132
133     # optional
134     keep_wrkdir=no
135     keep_prefix=no
136
137 If the system you are building on is a slightly different version than the target for your packages, pkg_add will complain about the difference in uname.  To fix this, change the UNAME_r and UNAME_v environment variables to the desired values before building.
138
139     (before)
140     # uname -v
141     DragonFly 2.1.0-DEVELOPMENT #0: Wed Sep 24 04:26:56 PDT 2008     root@:/usr/obj/usr/src/sys/PKGBOX
142     # uname -r
143     2.1.0-DEVELOPMENT
144
145     # setenv UNAME_v 'DragonFly 2.0.1-RELEASE #0: Wed Sep 24 04:26:56 PDT 2008     root@:/usr/obj/usr/src/sys/PKGBOX'
146     # setenv UNAME_r 2.0.1-RELEASE  
147
148     (after)
149     # uname -v
150     DragonFly 2.0.1-RELEASE #0: Wed Sep 24 04:26:56 PDT 2008     root@:/usr/obj/usr/src/sys/PKGBOX
151     # uname -r
152     2.0.1-RELEASE
153
154 Kick off the bulk build.  It takes a LONG time, so it's worth doing this in a screen session.  Unless you install screen in the same way as pbulk, it won't be available in the chroot, so you may need to get out of the chroot, enter a screen session, and re-enter the chroot before this step.
155
156     /usr/pkg_bulk/bin/bulkbuild
157
158 The line for setting up a rsync server for the mirrors: (do this outside the chroot)
159
160     rsync --daemon --bwlimit#200 --config/usr/pkg/etc/rsync/rsyncd.conf
161
162 If the build stops or pauses or whatever, this line will restart it, for versions 0.28 and older.
163
164     /usr/pkg_bulk/libexec/pbulk/build
165
166 Version 0.29 and later restart the build with this:
167
168     /usr/pkg_bulk/bin/bulkbuild-restart
169