Early boot

From OLPC
Revision as of 16:54, 15 August 2007 by CScott (talk | contribs) (Dump our early boot design into the wiki)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
  This page is monitored by the OLPC team.


Pencil.png NOTE: The contents of this page are not set in stone, and are subject to change!

This page is a draft in active flux ...
Please leave suggestions on the talk page.

Pencil.png

Draft of early boot upgrade/init procedures designed by Michael Stone and C. Scott Ananian.

[initrd]
v
python2.5 (pid 1)
v
network_setup(), mount usb/sd, etc
v
antitheft client (ATC)
 olpc.atc.run(fqdn of schoolserver, callback)

(sometime later, or immediately if already activated)
v
callback (as pid 2)
v
mount /sysroot, unmount usb/sd
copy /security/lease to /sysroot/security/lease if first boot
parse chosen/bootpath, swing /p/current
v
make minimal userland context (mount --move /sysroot /)
 vserver (protect PID 1, RTC <- vserver delta time)
v
with open('/sbin/olpc-init.py') as f:
 str = f.read()
eval(str)
--------------------> debian w/ developer key:
|                      def run():
|                        os.exec('/sbin/init')
xo boot:
$current = last part of /pristine/current symlink
mnt /home /run/$current/home
mnt /security /run/$current/security
mnt /pristine /run/$current/pristine
chroot /run/$current (mount --move ?)
v
with open('/sbin/olpc-init.py') as f:
 str = f.read()
eval(str)
---------------------> debian w/o developer key (in run)
|
pyinit + rainbow stuff (take over legacy init's job)
 fork run-parts (/etc/inittab stuff)
 listen for shutdown, etc.
 vserver (- CONTEXT)


---------------------------------
P_SF_RUN:
 off = allow mod = run from /run/X
 on  = pristine  = run from /run/X

switch on->off: set the unlink flags on /run
      off->on:  create immutably-tagged /run/a,b from /pristine/a,b

---------------------------
directories in root:
 /sys, /proc, /ofw   vfs
 /pristine/a
 /pristine/b
 /pristine/current -> /pristine/a (say)
 /run/a
 /run/b
 /security
 /home
 /sbin/olpc-init.py
 /boot -> /pristine/current/boot
 /boot-alt -> /pristine/alt/boot

--------------------------
Upgrade procedure, creating new b from a (w.l.o.g)
 Rainbow: (ATC gives <version> <hash> <priority>)
  0. swing /pristine/alt to /pristine/a
  1. delete /pristine/b
  2. Invoke 'olpc-updater <version>'
     in new container:
           /current (ro-bind mount from /pristine/a)
           /upgrade (initially empty)
 OLPC updater:
  3. clone /current to /upgrade
  4. upgrade /upgrade by hook or crook
  5. exit
 Rainbow:
  6. Verify $container/upgrade matches <hash>
  7. Move $container/upgrade to /pristine/b (atomic!)
  8. Swing /pristine/current to /pristine/b (atomic!)
  9. If <priority> reboot.
-----------------------