summaryrefslogtreecommitdiff
path: root/contributing.mdwn
blob: d79ca054e4a75d1f8f7a2e5f111cf774246507d5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
[[!meta copyright="Copyright © 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013,
2014, 2015 Free Software Foundation, Inc."]]

[[!meta license="""[[!toggle id="license" text="GFDL 1.2+"]][[!toggleable
id="license" text="Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Free Documentation License, Version 1.2 or
any later version published by the Free Software Foundation; with no Invariant
Sections, no Front-Cover Texts, and no Back-Cover Texts.  A copy of the license
is included in the section entitled [[GNU Free Documentation
License|/fdl]]."]]"""]]

[[!tag stable_URL]]

So, you are interested in contributing to the GNU Hurd project?  Welcome!
Every single contribution is very much encouraged.

There are various ways to contribute; read up on contributing to...

[[!toc levels=4]]

If someone of you is lurking around here and would like to contribute, but
feels she / he could do so better under formal mentoring: please
[[contact_us]], or just speak up at one of the [[regular IRC
meetings|IRC#regular_meetings]]!

We also have a list of [[open_issues]] and one for more elaborate [[project
ideas|community/gsoc/project_ideas]] - the latter originally written for the
[[Google Summer of Code|community/gsoc]], but not exclusively.  Even just
investigating open issues, without being able to fix them, can be useful,
because a issue that has been tracked down often becomes obvious to address for
people who know the stuff -- but these people typically don't have the time
that is needed to track down the issues.


<a name="hurd_on_mach"></a>
# Improve GNU Hurd Running on GNU Mach

The *[[GNU Hurd|hurd]] running on the [[GNU Mach
microkernel|microkernel/mach/gnumach]]* is what is commonly meant when people
are talking about GNU/Hurd systems.

This system has mostly been designed and implemented
[[in the '90s|history]].  It works and is usable.
For example, these web pages have been rendered on a GNU/Hurd system.

You can try it out for yourself: for getting access, installing
[[Debian_GNU/Hurd|hurd/running/debian]] will probably be the easiest and most
feature-complete solution.  If you don't have spare hardware to use for doing
so, you can also get a
[[shell_account_on_a_public_Hurd_machine|public_hurd_boxen]].  Depending on the
things you're going to work on (and on your internet connection), this may be
an easy way of getting used to Hurd systems.  Installing in a virtual machine
is another possibility, see the page about
[[running_a_Hurd_system|hurd/running]] for the full story.
In particular, running a Debian GNU/Hurd [[QEMU image|hurd/running/QEMU]] may
be a viable alternative.

Then you can either play around and eventually strive to do something
useful or -- if you want -- [[ask_us|contact_us]] to assign something to you, depending
on the skills you have and the resources you intend to invest.

Please spend some time with thinking about the items in this [[questionnaire]].

Before you can significantly contribute to the operating system itself, you'll
need to take some time to learn about the system, for example:
[[microkernels for beginners|microkernel/for_beginners]], [[Mach's
concepts|microkernel/mach/concepts]], [[Hurd's concepts|hurd/concepts]], the
*[[hurd/critique]]*.  Until you can understand and do the basic exercises
listed there, you won't be able to significantly contribute to the Hurd.

For more reading resources, please see these web pages, for example,
[[Hurd_documentation|hurd/documentation]] and
[[Mach_documentation|microkernel/mach/documentation]] for links to a bunch of
documents.


## Small hack entries

Here is a list of small hacks, which can serve as entries into the Hurd code for
people who would like to dive into the code but just lack a "somewhere to begin
with".

* Add `UTIME_NOW` and `UTIME_OMIT`.  It is a matter of taking the BSD values, add the `#define`s to the proper header, and implement the support in `*_S_file_utimes` functions.
    See also [[!debbug 762677]].
* Some translators do not support [[hurd/fsysopts]], i.e. support for the
file_get_fs_options and fsys_set_options RPCs.
* Extend `device_read`/`device_write` into supporting > 2TiB disk sizes.
* Make the Hurd [[hurd/console]]'s configuration use [[xkb layout/variant instead of keymap|hurd/console/discussion]].
* Add a [[futex kernel trap|microkernel/mach/gnumach/interface#futex]] to GNU Mach.
This can be useful for nicer locking
primitives, including inter-process primitives. `vm_allocate` can be used as an
example in the `gnumach` source tree for how to add a kernel trap. [[!GNU_Savannah_task 6231]]
* Add NX protection support to GNU Mach.
* Write a partfs translator, to which one gives a disk image, and
which exposes the partitions of the disk image, using parted, and
the parted-based storeio (`settrans -c foos1 /hurd/storeio -T typed
part:1:file:/home/samy/tmp/foo`). This would be libnetfs-based.
* Write [[virtio drivers for KVM|open_issues/virtio#KVM]].
* Port valgrind. There is a whole
[[GSoC proposal|community/gsoc/project_ideas/valgrind]] about this, but the
basic port could be small.
* Move the [[mount/umount|open_issues/glibc#mount]] logic from
`utils/{,u}mount.c` into [[glibc]].
* Fix [[`/proc/self`|hurd/translator/procfs/jkoenig/discussion#self]].
Look at `[glibc]/hurd/lookup-retry.c` for how [[`FS_RETRY_MAGICAL`
lookups|hurd/interface/dir_lookup]] work.
* Add a tool to trace system calls, by using gnumach's Syscall-Emulation, see <http://www.gnu.org/software/hurd/gnumach-doc/Syscall-Emulation.html>
* Improve our [[FUSE library|hurd/libfuse]].
* Add a relatime option to ext2fs.

<a name="porting"></a>
## Porting Packages

Please [[contact_us]] before spending a lot of time on the following porting
tasks: some work may already have been done that you can base your work upon.

For guidelines, please have a look at the dedicated [[porting_page|hurd/porting]].


### Debian GNU/Hurd

Along with the official Debian "wheezy" release (but not as an official Debian
release), in May 2013 the Debian GNU/Hurd team released [[Debian GNU/Hurd
2013|news/2013-05-debian_gnu_hurd_2013]].
There is a goal of getting Debian GNU/Hurd into shape for a technology
preview for integration as a proper Debian release candidate.

The *to do* list is on <http://wiki.debian.org/Debian_GNU/Hurd>.

The following missing packages/missing functionality block a lot of other
packages, and are thus good candidates for porting, in order to increase
archive coverage:

* umount functionality in busybox
* ruby1.9.1

Here is a [[list of packages that need porting|hurd/running/debian/porting]].

You can also just [[install_Debian_GNU/Hurd|hurd/running/debian]] and find what
doesn't work or suit you and try to improve that.

Or, you can pick one from the [list of failing
packages](http://people.debian.org/~sthibault/failed_packages.txt).


## Open Issues

There is a list of [[open_issues]].  This list includes everything from bug
reports to open-ended research questions.


<a name="insta-dev-env"></a>
## Instant Development Environment

<!-- I don't like this being here.  At least not in this form.  This just
duplicates information that is available in other places.  (Or should be
available in other places, in more elaborate form.)

The idea of a one-stop development environment is not bad (I like that), but
I'd do this differently.  For example, we should add some Git submodules to the
master hurd.git repository (which is currently empty), to branches that are
known to build and interface correctly with current GNU/Hurd system
installations (thus including TLS, etc.), and also add in my cross-gnu scripts
and a simple build machinery so this is usable from GNU/Linux (and other
systems), and so on and so forth.

I'll have to think about it some more.

--[[tschwinge]].  -->

*This is a very brief guide to get your development environment set up. Pester ArneBab @ irc.freenode.net on IRC if something does not work :)*
([[!taglink open_issue_documentation]])

* Install qemu-kvm via your distros packages.
* Download the [qemu image](http://people.debian.org/~sthibault/hurd-i386/debian-hurd.img.tar.gz): `wget http://people.debian.org/~sthibault/hurd-i386/debian-hurd.img.tar.gz`
* Unpack it: `tar xf debian-hurd.img.tar.gz`
* Run it: `qemu-kvm -m 512 -no-kvm-irqchip -drive cache=writeback,index=0,media=disk,file=debian-hurd.img` # …irq… is a currently necessary fix due to some changes in Linux. Optionally use `--curses` to keep your keyboard layout. If need be modprobe kvm_amd, kvm intel and kvm to get kvm support (which is much, much faster). See also: [kvm FAQ](http://www.linux-kvm.org/page/FAQ).
* login as root
* `apt-get update`
* `apt-get install -y git mercurial emacs vim`
* `apt-get build-dep -y hurd gnumach`
* `git clone git://git.sv.gnu.org/hurd/hurd.git`
* `git clone git://git.sv.gnu.org/hurd/gnumach.git`
* `git clone git://git.sv.gnu.org/hurd/incubator.git`
* Get more from the [repo list](http://git.savannah.gnu.org/cgit/hurd/).
* Read the docs on these pages.
* Start hacking.
* For shutting down, use `reboot`, then press `c` in grub and issue halt (to avoid filesystem corruption). Adding `--no-reboot` to the qemu line should help, too.


<a name="hurd_on_modern_microkernel"></a>
# Design / Research: GNU Hurd on a Modern Microkernel

Developers [[have_identified|hurd/critique]] a number of problem with the *Hurd on
Mach* system.  Problems, that can not easily be fixed by bug-fixing the
existing code base, but which require design changes -- deep going ones
actually.

As such systems (as the desired one) are not in common use, but are -- if at
all -- research projects, this new *Hurd on a modern microkernel* project
itself is more a research project than a *sit down and implement/code/hack*
project.

If you're interested in contributing in this area, knowing the *Hurd on Mach*
system (see [[above|contributing#hurd_on_mach]]) nevertheless is a
prerequisite.  At least have a deep look at the documentation pointers.  Also
read through the [[HurdNG|hurd/ng]] section.

Please send email to the [[mailing lists/l4-hurd]] mailing list for discussing
this post-Mach system design.


# Documentation


## Technical Writer

Our hackers (programmers) typically do what their kind always does: they code.
What they don't like too much is documenting their wonderful achievements.  On
the other hand, there are people (you?) who enjoy documenting technical
matters, so don't hesitate to [[contact_us]] if technical documentation shall
be your contribution to GNU Hurd development.

A good start is probably to just start using the Hurd, and play with
the translators. In the process you will probably find that some of the
documentations are missing some details, are outdated, etc. That is were you can
start contributing for instance.

As an advice: do not start yet another documentation from scratch. There are
already a lot of tutorials in the wilds, and they are almost all completely
outdated. Rather contribute to the existing official documentation: this wiki,
the documentation in the Hurd source, the Debian Hurd port pages.

## Web Pages

Please read about [[how_to_contribute_to_these_web_pages|web_pages]].


# Final Words -- Difficulties

Please note that doing substantial contributions to a project as big and as
encompassing as the GNU Hurd is not a trivial task.  For working on the GNU
Hurd's inner guts and getting useful work done, you have to plan for a
many-months learning experience which will need sufficient self-motivation.
Working on an advanced operating system kernel isn't something you can do in a
few free minutes -- even less so without any previous [[kernel]] hacking
experience.

Likewise, the Linux kernel maintainers are stating the exactly same
difficulties, which is well presented by Jonathan Corbet in his 2010 Linux
Kernel Summit report for the opening sessions about [*welcoming of
newcomers*](http://lwn.net/Articles/412639/).

But of course, none of this is meant to be dismissive, or to scare you away --
on the contrary: just [[start
using|hurd/running]] the GNU Hurd, and either notice yourself what's not
working as expected, or have a look at one of the [[Open Issues]], and we shall
see if you'll evolve to be the next core Hurd hacker!
You'll *just* have to get excited about it!