home *** CD-ROM | disk | FTP | other *** search
/ Chip 2003 April / Chip_2003-04_cd1.bin / zkuste / mini / download / lnx-bbc-1.618.iso / bbc-guide.txt next >
Text File  |  2001-08-16  |  14KB  |  285 lines

  1. The organization of the BBC's contents
  2. --------------------------------------
  3.  
  4. Version 0.339 (for BBC 1.618)
  5. by Seth Schoen
  6.  
  7.  
  8. Introduction
  9. ------------
  10.  
  11. This is intended to be useful to you if you want to understand or modify
  12. the LNX-BBC Bootable Business Card -- for example, to create an
  13. updated or custom version.
  14.  
  15. If you just want to use the BBC as it exists, without trying to customize
  16. it or develop your own bootable CD, then this document is not intended for
  17. you.  Someone soon will write a document on "How to use the BBC" (the
  18. text version of CREDITS-README.txt is the best current approximation); we
  19. would welcome contributions of documentation by BBC users.
  20.  
  21. It is my intention to produce an "Illustrious Compendium of BBC Lore"
  22. document which explains obscure facts about individual pieces of the system
  23. and about the configuration of software included here.  That will take
  24. longer and has not even been begun yet.  I hope that this file is useful
  25. in the meantime for would-be BBC modifiers and contributors.
  26.  
  27.  
  28. Modifying the BBC
  29. -----------------
  30.  
  31. We should note that there is no single unified source tree for the BBC
  32. (unfortunately).  Of course, we will provide source code for any component
  33. of the BBC -- upstream maintainers' sources, and our modifications, if we
  34. have made any.  However, current BBC development proceeds by having a
  35. binary tree into which packages are copied after they are compiled.  This
  36. is the "preferred form" for BBC development as a whole (from the point of
  37. view of the GNU GPL's legal language, not from the point of view of
  38. engineering).
  39.  
  40. That is to say that, if you want to modify the BBC, the binary tree (not
  41. like a "binary tree" in computer science, just a directory tree full of
  42. binary executables) is the most useful thing for you to have.
  43.  
  44. One interesting consequence of this is that you can test a lot of things
  45. on the BBC using the chroot(8) command:
  46.  
  47.     chroot /cloop /bin/sh -i
  48.  
  49. where "/cloop" is the path to the cloop tree on your development system.
  50. This doesn't provide an _exact_ facsimile of the BBC run-time environment
  51. (for example, all of /dev is missing, as is /proc, and /etc will be different
  52. from the run-time version!), but it will be pretty close.  Beware of possible
  53. differences.
  54.  
  55. Unfortunately, you generally can't compile inside of the BBC environment;
  56. you'll have to compile things outside and then copy them into the BBC
  57. tree -- making sure that you link against dynamic libraries which are the
  58. same as or compatible with those included in your BBC tree's /usr/lib.
  59.  
  60.  
  61. CD layout
  62. ---------
  63.  
  64. Key: "DEV" means where something exists in our development environment;
  65. our "loopback mounts" are standard configurations by which a filesystem can
  66. be loopback mounted if we need to access or change its contents (but these
  67. mounts are not performed by default in the development environment).  "BOOT"
  68. describes the location or function of something when the Bootable Business
  69. Card is actually booted on a system.
  70.  
  71. Our development environment has a "/mnt/loop1" directory where lnx.img is
  72. mounted, and a "/mnt/loop2" where root.bin is mounted.  There is a script
  73. to mount these two files and a script to unmount them.  (Doing that is not
  74. quite trivial because the "real" root.bin is actually a gzipped file
  75. _inside of_ lnx.img -- as you can see below.  Therefore, we need to mount
  76. /mnt/loop1, decompress root.bin.gz, save the resulting root.bin somewhere,
  77. and then loopback mount it on /mnt/loop2.  When we're all done, we need
  78. to unmount /mnt/loop2, compress root.bin to get a new root.bin.gz, copy
  79. that into /mnt/loop1, and then unmount /mnt/loop1.)
  80.  
  81. Here's how the CD is laid out:
  82.  
  83. CD-R
  84. \_ iso9660 fs ("lnx-n.iso") -- DEV: contents of "/cdrom"; BOOT: mounted
  85.    as /mnt/cdrom-real
  86.    \_ El Torito boot image ("lnx.img")
  87.       \_ msdos filesystem -- DEV: contents of lnx.img loopback mount; BOOT:
  88.          El Torito-compliant BIOS boots and transfers control to SYSLINUX
  89.          \_ SYSLINUX boot loader and configuration files
  90.          \_ compressed Linux kernel image ("linux")
  91.          \_ compressed initial ramdisk image ("root.bin", really "root.bin.gz")
  92.             \_ ext2 filesystem -- DEV: contents of root.bin loopback mount;
  93.                BOOT: mounted on / as RAM disk and remains mounted indefinitely
  94.                \_ init shell script ("/sbin/init"), a Bourne shell script
  95.                   which runs as PID 1 and handles finding and mounting CD-R,
  96.                   finding and mounting CD filesystem via cloop.o, renaming
  97.                   some directories, spawning getty processes, etc.
  98.                \_ minimal system boot libraries, binaries (BusyBox), devices,
  99.                   and mount points (originally based on Debian slink boot
  100.                   floppy) -- BOOT: used and then renamed to /lib (entirely
  101.                   unused except ld-linux.so.2), /sbin.defunct, and /bin.defunct
  102.                   once /mnt/cdrom is mounted
  103.    \_ compressed block device image ("singularity")
  104.       \_ ext2 filesystem -- DEV: contents of "/cloop"; BOOT: mounted on
  105.          "/mnt/cdrom" and a symlink points from /usr to /mnt/cdrom
  106.          \_ all run-time libraries, binaries, kernel modules, configuration
  107.             files, etc.
  108.    \_ insmod (static binary) -- BOOT: used by init script to load cloop.o
  109.    \_ cloop.o (kernel module) -- BOOT: used by init script; allows kernel to
  110.       read compressed contents of "singularity"
  111.    \_ other files (not used after boot; mainly for Windows users), e.g.
  112.       RAWRITE2, GZIP, and LOADLIN DOS executables, and some documentation
  113.  
  114.  
  115. Guide to init script
  116. --------------------
  117.  
  118. In the BBC, /sbin/init is a Bourne shell script on the RAM disk (inside of
  119. root.bin) which is run with a copy of ash which is also inside the RAM
  120. disk.  During normal use, this shell script never exits.  (Having init be
  121. a shell script is different from normal Unix practice, where init is
  122. generally a C program, which is configured via /etc/inittab.  The BBC system
  123. has nothing corresponding to /etc/inittab; configuration changes are made
  124. directly inside the script.  This also implies that the BBC has nothing
  125. corresponding to runlevels; while it is running, it is _always_ in the
  126. equivalent of single-user mode, even though it may start gettys, networking,
  127. and X11.)
  128.  
  129. init's main task is to find and mount the CD-ROM and then mount the compressed
  130. filesystem image within the CD-ROM.  All of the most essential parts of the
  131. script are dedicated to this task.  init tries to find an IDE or SCSI device
  132. which can be mounted as a CD-ROM (as an iso9660 filesystem); when one is
  133. found and recognized as a BBC, it is mounted on /mnt/cdrom-real.  (This
  134. indicates that the filesystem mounted there is the actual iso9660 filesystem
  135. physically stored on the CD-ROM.)  Then the singularity is run, which results
  136. in a short shell script at the beginning of singularity loading the cloop
  137. module and telling it to take the singularity as its compressed block device
  138. image.
  139.  
  140. Next, init mounts /dev/cloop (the uncompressed version of singularity, as
  141. provided by the cloop kernel module) as an ext2fs on /mnt/cdrom.  This
  142. directory is the same as /usr, so that /usr/bin and /usr/lib are actually
  143. /mnt/cdrom/bin and /mnt/cdrom/lib, respectively.
  144.  
  145. Once /mnt/cdrom is mounted, many more programs are available, and init will
  146. perform a few clean-up tasks to cause libraries and programs to be taken
  147. from /usr/lib and /usr/bin by default, instead of from the old /lib and /bin,
  148. which are in the RAM disk, and which contain the BusyBox utilities and
  149. libraries.
  150.  
  151. After performing a few more system initialization tasks (including an attempt
  152. to mount read-only any partition mentioned in /proc/partitions which contains
  153. an ext2fs), init runs a few gettys and enters a loop by which these gettys
  154. will be respawned.  init stays in this loop for as long as the system is
  155. running.  init does not take any part in system shutdown, which is entirely
  156. handled by the "reboot" command.
  157.  
  158.  
  159. How a BBC is built
  160. ------------------
  161.  
  162. We have a script called "create_iso" (formerly "burn") which creates a new
  163. "singularity" file from the contents of /cloop, then copies that new
  164. singularity into /cdrom.  A current lnx.img is already inside of /cdrom, so we
  165. then call mkisofs with appropriate options to create an ISO image from the
  166. /cdrom tree.
  167.  
  168. The singularity creation is probably the most obscure part of this
  169. process.  It's handled by first creating a large empty file, then doing
  170. an mke2fs to create a filesystem therein, then copying all of the files
  171. in /cloop into that filesystem, and then running create_compressed_fs to
  172. compress the entire filesystem into a cloop image which can be read by
  173. Rusty's kernel module cloop.o (now maintained by Klaus).
  174.  
  175. The build process is actually very simple (although the various checks and
  176. details involved may appear confusing).  It's trickier to keep track of
  177. all the of the loopback mounts that are involved if you want to modify
  178. lnx.img or (more typically) root.bin.  This is because root.bin is a
  179. compressed filesystem inside a filesystem inside a filesystem.  So we have
  180. to loopback mount lnx.img, find root.bin inside, zcat root.bin, mount the
  181. uncompressed version, make changes, unmount root.bin, gzip it, and unmount
  182. lnx.img.  See how much more involved that is than actually building a
  183. BBC?
  184.  
  185.  
  186. How the old Debian installer worked
  187. -----------------------------------
  188.  
  189. This section is not here yet.
  190.  
  191. (I don't think you really want to know, anyway.  It was an awful hack -- I
  192. should know because I did it.  It involves an exec, chroot, and exec again
  193. within init, after loopback mounting a floppy image in a fake root
  194. filesystem!)
  195.  
  196.  
  197. How the new Debian installer works
  198. ----------------------------------
  199.  
  200. We have a compressed image of (essentially) the filesystem from a Debian
  201. installer floppy.  (The compressed image is /usr/share/dbootstrap/root.bin.)
  202. The installer script (called "dbootstrap.sh") decompresses this and then does
  203. a loopback mount of the floppy filesystem on /mnt/tmp2.
  204.  
  205. Next, it does a chroot into /mnt/tmp2 and runs a script which will do a
  206. few setup steps before running "dbootstrap", the standard Debian installer.
  207. The old Debian installer could install the base system from our CD-ROM;
  208. the new installer requires a network connection (which is supposed to be
  209. set up _beforehand_, with our trivial-net-setup program) and downloads
  210. the Debian base system from servers on the Internet.
  211.  
  212.  
  213. Proposed changes to boot sequence
  214. ---------------------------------
  215.  
  216. (Just to keep you informed, so you don't get confused in the future if we
  217. decide to do any of these things.  Or, if you want an interesting project
  218. to experiment with.  We welcome your contributions, and of course you are
  219. also free to create your own bootable CD project.)
  220.  
  221. If you don't need cloop, you can modify init to mount the whole CD on
  222. /mnt/cdrom-real or to use a standard loopback mount of an uncompressed
  223. filesystem with "mount -o loop".  We will never do this because we need
  224. compression to fit everything on a 50 MB CD-R blank.
  225.  
  226. We might replace cloop with one of its friendly rivals such as cramfs
  227. or cbd, depending on performance and portability.  Probably we will use
  228. a cloop-compressed romfs instead of a cloop-compressed ext2fs, because
  229. we can't write to cloop-compressed filesystems anyway, and romfs
  230. compresses better.
  231.  
  232. We might use devfs, or at least take the device nodes out of the root
  233. filesystem image on the disk and instead create them at boot time with a
  234. makedev script run from init.  (The size of the filesystem inside lnx.img
  235. cannot exceed 1.44 MB, per El Torito requirements.  Space is therefore
  236. a premium within the root filesystem, because it, gzipped, together with
  237. the kernel and SYSLINUX, may not exceed this limit.)
  238.  
  239. We might use monte and (to make things even more complicated) boot a tiny
  240. kernel with only IDE and SCSI support, which mounts the CD, locates a
  241. suitable kernel from among several provided there, and then reboots the system
  242. using that particular kernel.  (monte is capable of rebooting a running system
  243. into an arbitrary kernel image, very much like LOADLIN for DOS.)  That
  244. kernel would then mount the CD, locate appropriate kernel modules to match
  245. system hardware, and load them.
  246.  
  247. This scheme would also facilitate network booting, which is something we
  248. would very much like to add.
  249.  
  250. We will probably put / on a ramfs when we go to 2.4.
  251.  
  252.  
  253. How to modify the BBC in small ways
  254. -----------------------------------
  255.  
  256. (1) For a burn onto a full-size CD, you can add uncompressed data in a new
  257.     subdirectory of /cdrom, and then that data will be available in the
  258.     corresponding directory under /mnt/cdrom-real when the system boots.
  259.  
  260. (2) You can modify /sbin/init inside the lnx.img loopback mount to change
  261.     how the system behaves when it boots.
  262.  
  263. (3) To add new software to the regular BBC, copy binaries into /cloop/bin,
  264.     making sure that they work with the shared libraries in /cloop/lib.
  265.     (These become /usr/bin and /usr/lib on the running system, respectively;
  266.     the running system's original /bin and /lib are only used during boot.)
  267.  
  268. (4) To change the kernel image, replace "linux" in the lnx.img loopback mount.
  269.     You will also have to worry about the modules under /cloop/lib/modules.
  270.     Module autoprobing mostly does not work right, so you might want to fix
  271.     that bug or make the init script probe for modules.
  272.  
  273. (5) If you want things to happen at boot time but don't have space inside
  274.     lnx.img, just create a script or other program in /cloop/bin with the
  275.     files you need, and call that from within /sbin/init once /mnt/cdrom
  276.     has been mounted.  There's _tons_ of space within /cloop compared to
  277.     the amount of space available within lnx.img!  (The RAM disk is
  278.     supposedly 1000 KB, but of course you can't actually use all of that
  279.     because we want to leave some free space on / at boot time, and
  280.     because only free space compresses well enough to fit that much inside
  281.     a 1.44 MB lnx.img.)
  282.  
  283.     In addition, you can now create things in /auto on the CD-ROM which will
  284.     run at boot time.  See the README in that directory for more information.
  285.