~ubuntu-core-dev/ubiquity/trunk

1483 by Colin Watson
* Rewrite doc/README to be reasonably up to date. Among other things, it
1
Ubiquity
2
========
3
4
This is a graphical installer for Ubuntu, written largely in Python, using
5
d-i as a backend for many of its functions. The authors are indebted to the
6
efforts of the Guadalinex project in developing the original
7
"ubuntu-express" code used as a basis for this project.
8
9
Background
10
----------
11
12
Around 2000, the debian-installer (later just "d-i") project started to
13
replace the old Debian "boot-floppies" installer. The goals of this project
14
included long-term maintainability, modularity, and code reuse. After a
15
hiatus during the Debian 3.0 release, this project matured into a usable
16
installer in 2004 in time for, among others, the releases of Debian 3.1 and
17
Ubuntu 4.10. From Ubuntu 4.10 to Ubuntu 5.10, d-i was used as the primary
18
installation program.
19
20
d-i continues to provide flexibility and (for a certain significant class of
21
users) ease of use that a simplified graphical installer will always be
22
hard-pushed to provide. It is therefore important to continue to support it
23
in Ubuntu. From a maintainability point of view, it follows that it is
24
important for any graphical installer supported by Ubuntu to share
25
substantial amounts of code with d-i, particularly where the backend logic
26
is intrinsically difficult and has accumulated large quantities of expertise
27
and bug fixes. Accordingly, Ubiquity is designed to use logic from d-i where
28
possible, and tries to confine itself to being a high-quality frontend.
29
30
(Of course, there remain some areas where d-i does not provide suitable
31
logic, or where its logic has not proven amenable to direct use within
32
Ubiquity, so there is still some backend-style logic and code duplication
33
in Ubiquity. Eventually, as much of this as possible should go away.)
34
35
UI Design
36 by carranza
[project @ 101]
36
---------
37
1483 by Colin Watson
* Rewrite doc/README to be reasonably up to date. Among other things, it
38
The primary focus of Ubiquity's UI is ease of use for new users.
39
Accordingly, it does not try to provide all possible options, deferring
40
advanced installation scenarios to d-i so that it does not have to be all
41
things to all people. See http://wiki.ubuntu.com/UbuntuExpress for the
42
original details of its user interface design.
43
44
Debconf Integration
45
-------------------
46
47
The most challenging part of Ubiquity to understand is undoubtedly its
48
integration with d-i. Before getting to grips with this, I assume that the
49
reader has a basic developer-level grasp of the "debconf" configuration
50
system. Reading the debconf-devel(7) man page is a good idea.
51
52
d-i uses debconf for all user interaction. The extant graphical debconf
53
frontends are functional, but crude from a human interface design
54
perspective; although this could be improved, the problem is to some extent
55
intrinsic because they must generate a user interface based on the questions
56
asked by the confmodule. It is possible to do much better using custom user
57
interface code. However, at present debconf has no support for doing this
58
directly (although cdebconf does).
59
60
To deal with this, Ubiquity uses the noninteractive debconf frontend, and
61
instead uses a layer called the "debconffilter". This sits between d-i code
62
and the debconf frontend, intercepting the debconf protocol, and transforms
63
relevant debconf protocol messages into events which can be handled in much
64
the same way as UI events from widget libraries like GTK+ or Qt. While this
65
requires insider knowledge of the questions which may be asked by each piece
66
of d-i code, which must often be updated as d-i evolves, it seems to be the
67
most practical approach at present.
68
69
Each piece of d-i code used in Ubiquity is accompanied by a "component",
70
written in Python, which defines the backend code to be called and any
71
necessary event handlers. To allow for multiple frontend implementations, it
72
typically calls methods in the frontend when UI operations are needed.
73
74
It is important to remember that each call to component event handlers is
75
blocking (though non-reentrant). If UI interaction is required in order to
76
provide an answer to debconf, this must be handled by calling into suitable
77
frontend functions from the component to wait for the user. The component is
78
responsible for maintaining its own state machine if necessary.
79
80
Partitioning
81
------------
82
2037 by Colin Watson
* Remove the old advanced partitioner.
83
All partitioning is handled by d-i code (partman), with a presentation layer
84
on top. The presentation layer navigates partman's menus under the hood to
85
perform advanced partitioning. See
86
http://wiki.ubuntu.com/Ubiquity/AdvancedPartitionerRewrite for details.
87
88
A graphical disk view has yet to be written for the GTK frontend's advanced
89
partitioner.
1483 by Colin Watson
* Rewrite doc/README to be reasonably up to date. Among other things, it
90
91
Installation
92
------------
93
94
The actual installation takes place by copying the read-only part of the
95
live filesystem. The writable part of the live filesystem (i.e. the running
96
live session) is intentionally not copied, to ensure maximum reproducibility
97
of the installed system. Thus, any customisations applied by the live boot
98
process must be re-applied after the read-only filesystem is copied. The
99
live boot process is responsible for installing hooks in
100
/usr/lib/ubiquity/target-config/ to take care of this.
101
102
After copying the live filesystem, certain unnecessary packages (such as
103
Ubiquity itself) will be removed. The set of packages to be removed is
104
computed by taking those packages present in
105
/cdrom/casper/filesystem.manifest but not present in
106
/cdrom/casper/filesystem.manifest-desktop, and removing any packages
107
explicitly requested for installation by installer code. Language packs for
108
languages which are not to be supported on the installed system will also be
109
removed.
110
1500 by Colin Watson
* Remove /var/log/installer/syslog from all error messages etc., as
111
Logs of the installation will be saved in /var/log/syslog (for messages
112
emitted by Ubiquity itself and messages emitted by d-i code), and
113
/var/log/partman (for a trace of the operation of the automatic
114
partitioner). /var/log/syslog and /var/log/partman are saved in
115
/var/log/installer/ on the installed system.
1483 by Colin Watson
* Rewrite doc/README to be reasonably up to date. Among other things, it
116
117
Customisation
36 by carranza
[project @ 101]
118
-------------
119
1483 by Colin Watson
* Rewrite doc/README to be reasonably up to date. Among other things, it
120
Where d-i code is used, it is generally possible to preseed it to change
121
default behaviour. See the installation guide for details. However, at
122
present Ubiquity will not skip over preseeded steps. This may be fixed in
123
the future.
124
125
The read-only live filesystem should generally be mounted on /rofs.
126
Alternatively, an image may be present as /cdrom/casper/filesystem.cloop,
127
/cdrom/casper/filesystem.squashfs, or (for Guadalinex/Metadistros)
1785.1.1 by Colin Watson
* Document live filesystem manifests and installation from media other
128
/cdrom/META/META.squashfs. Ubuntu currently uses
129
/cdrom/casper/filesystem.squashfs. You can preseed
1601 by Colin Watson
* Document ubiquity/install/filesystem-images in doc/README.
130
ubiquity/install/filesystem-images with a space-separated list of image
131
paths to override this; if you provide more than one image, then they will
132
be overlaid using unionfs.
1483 by Colin Watson
* Rewrite doc/README to be reasonably up to date. Among other things, it
133
1785.1.1 by Colin Watson
* Document live filesystem manifests and installation from media other
134
/cdrom/casper/filesystem.manifest and
135
/cdrom/casper/filesystem.manifest-desktop should be, respectively, a list of
136
packages in the full live filesystem and a list of packages that should be
137
installed in the target system; the format is that produced by running
138
"dpkg-query -W --showformat='${Package} ${Version}\n'". Ubiquity will remove
139
any packages present in filesystem.manifest but not present in
140
filesystem.manifest-desktop after copying the live filesystem. This allows
141
it to ensure that, for example, Ubiquity itself doesn't end up on the target
142
system.
143
1837 by Colin Watson
* doc/README: Add comment about language pack installation following a
144
Language packs for the selected language are installed by default, using the
145
Ubuntu naming scheme of language-pack-$LL and language-support-$LL. If you
146
want to get rid of these (for example because their dependencies are
147
inconvenient), then you can preseed pkgsel/language-packs to the empty
148
string.
149
1770 by Colin Watson
* If /cdrom/.disk/release_notes_url is present, display a link to the
150
If /cdrom/.disk/release_notes_url is present, a link to the release notes
151
will be displayed on the language page. Instances of the string ${LANG} in
152
that URL will be replaced with the locale, with any encoding removed (e.g.
153
en, de, pt_BR, zh_CN).
154
1785.1.1 by Colin Watson
* Document live filesystem manifests and installation from media other
155
If you're installing from a medium other than a CD or DVD (e.g. over NFS),
156
then the path of least resistance is to arrange that something that looks
157
like a CD is available on /cdrom anyway. NFS-mounting an entire CD image is
158
one approach that has worked with relatively little effort, but you could
159
also set up the files listed above in some other way.
160
1600 by Colin Watson
* Add a FAQ about backporting to doc/README.
161
Frequently Asked Questions
162
--------------------------
163
164
Q. Can I backport the version of Ubiquity from the current Ubuntu
165
   development release to the previous stable release?
166
167
A. Not without quite a bit of work. At present, Ubiquity is still a complex
168
   piece of software with several bleeding-edge dependencies, and at the
169
   moment I have no compunctions about making it depend on new packages or
170
   newer versions of existing packages in order to get the job done
171
   properly. In future, things may settle down such that there can be more
172
   compatibility guarantees, particularly if Ubiquity is adopted by other
173
   Debian-based distributions.
174
175
   At the moment, I can think of the following specific issues with
176
   backporting Ubiquity from Ubuntu 6.10 to Ubuntu 6.06:
177
178
     * Ubiquity now uses the new Python policy, which involves a number of
179
       packaging changes and even a couple of code changes that are
180
       incompatible with Ubuntu 6.06. These would need to be reverted.
181
182
     * Ubiquity now uses console-setup as the backend for the keyboard
183
       screen rather than kbd-chooser. console-setup will not work on Ubuntu
184
       6.06, so the kbd-chooser code would need to be resurrected.
185
186
     * Ubiquity's GTK frontend now relies on new features in gparted in
187
       order to fix some user interface bugs.
188
189
     * Ubiquity now integrates with the apport crash reporting facility in
190
       Ubuntu 6.10, which is not available in Ubuntu 6.06. (This would just
191
       be a matter of removing dependencies; it's optional as far as the
192
       code is concerned.)
193
194
     * Ubiquity's debconf template translations now rely on new features in
195
       po-debconf 1.0, which was not available in Ubuntu 6.06.
196
197
   While I'm aware that there were a number of serious issues with the
198
   version of Ubiquity that shipped with Ubuntu 6.06 (many of which were
199
   corrected in Ubuntu 6.06.1), I feel that the right answer to these is to
200
   backport selected fixes to that branch of Ubiquity rather than trying to
201
   backport the whole package.
202
1785.1.2 by Colin Watson
* Extend backporting FAQ in doc/README to cover issues with backporting
203
   Similarly, there are at least the following issues with backporting
204
   Ubiquity from Ubuntu 7.04 to Ubuntu 6.10:
205
206
     * Ubiquity depends on a version of console-setup at least as new as the
207
       one in its own source tree, so the two packages would need to be
208
       backported together. The new version of console-setup in turn relies
209
       on a newer version of xkb-data (although probably not inextricably).
210
211
     * Ubiquity's GTK frontend now uses gtk.LinkButton, which isn't
212
       available in the versions of GTK+/PyGTK in Ubuntu 6.10. Similarly,
213
       you need a more recent version of glade-3 than is available in Ubuntu
214
       6.10 to edit the user interface definition for the GTK frontend.
215
1787 by Colin Watson
correct discussion of automake
216
     * Regenerating Ubiquity's autotools files (configure et al) requires
217
       Automake 1.10, not available in Ubuntu 6.10.
1785.1.2 by Colin Watson
* Extend backporting FAQ in doc/README to cover issues with backporting
218
219
     * Ubiquity's apport crash handler now requires a new Python API
220
       introduced in apport 0.33.
221
1483 by Colin Watson
* Rewrite doc/README to be reasonably up to date. Among other things, it
222
223
Feel free to ask me (Colin Watson <cjwatson@ubuntu.com>) if you have any
224
questions regarding Ubiquity's workings.