SLS 1.05 RELEASE: ----------------- ********************************************************************** Please Note: because of reports that some are having problems with the modular boot kernel, SLS has fallen back to using the standard Linux 1.0 kernel. The kernel source is now also the standard 1.0. the patch file b7/lxdif.tgz can be applied for the modular kernel. Be advised that this patch is huge (almost 1.6Meg). The current modular bootdisk a1.3 is available in the Modules sub-directory. There is also a test a1.3 boot disk in the Test sub-directory, that is in testing by those who reported problems. It's accompanying README should be consulted first. If you have any problems, please direct correspondance to: pmacdona@sanjuan.uvic.ca ********************************************************************** Announcing, the official of the release of SLS 1.05, the Softlanding (Modularized) Linux System. It is a joint announcement of the release of the SLS 1.05, the CD and the kernel modularization patches. Modularization of the kernel is aimed squarely at reducing, and eventually eliminating the requirements for recompiling the kernel, either for changing/modifying device drivers or for dynamic access to infrequently required drivers. More importantly, perhaps, the efforts of individual working groups need no longer affect the development of the kernel proper. In fact, a binary release of the official kernel should now be possible. SLS 1.05 is available for ftp'ing from tsx-11.mit.edu. Additionally, the CD version or floppy or tape distributions can be obtained from Softlanding Software (see below for more info). The CD will begin shipping shortly so all Quarterly subscribers should be receiving their next installment in the next few weeks. SLS 1.05 FEATURES: ------------------ - The Linux kernel 1.0, fully modularized by Softlanding (totalling 63 modules). - Nearly everything is loadable (devices, fs's, network, math, etc) - Many extra loadable modules included (IFS, Double FS, IPX, CD, ...). - A powerful, flexible menu shell (Mesh) written for SLS system admin. - A massive shift to Tcl and Tk apps (like Picasso and XTeXShell). - Idraw and Doc (Interviews) are gone, so is clisp. - Elvis has been supersceded by VIM (which has help and no refresh bug). - Addition of two new shells: tcsh and pdksh. Added Pine as well as elm. - man pages are not preformatted, so as to support Tkman (and printing). - XFree86 2.0, with modified Servers link kit to allow compileless link. - Most binaries updated and libreadline in ftp, bash, the wish shells... - migration to linux-utils 1.5, with modifications to add shadow support. - adoption of /sbin, for that leaner, cleaner /etc look (see below). - Non-destructive installation option (over existing ext2 fs partitions). - Holes are now automatically compressed on install, for "ALL" files. - Network/CD/HD installs now try to do the mount, "before" doing a mke2fs. - Unavoidably, one disk has been added (to 'b') giving 31-5.25 or 26-3.5. CDROM FEATURES: ---------------- The CDROM has the following additional features: - no binaries are located in /etc. - preceding means SLS runs from CD in 400K+ ramdisk (for /etc, /tmp, ...) - Linux source tree with all .o's intact for quick driver mods. - XFree86 2.1 in addition to 2.0 - Contains Andrew, Interviews, Object Builder, etc. - Includes mainstream packages such as mosaic, gopher, archie, etc. - Contains both X and non-X versions of most programs. - A large repository of Tcl/Tk code (most all that is available?). - Contains about twice the source code of the previous release (compressed). Installation options include: - Install directly from CDROM - Install from CD, over the network (3 1/2 boot only) - Install from harddrive, over the network (3 1/2 boot only) - Copy the /install packages to a DOS hard drive for installation - Copy the /install packages to a DOS floppies (both 3.5 and 5.25) - tar the /install packages to Tape for installation Operational modes for the CD include: 1) run from CD, with no writable file space 2) run from CD, with a small (600K+) ramdisk 3) run from CD, with a partition mounted on /local 4) run with installation ramdisk as root and mounting CD on /mnt 5) run with mini install (~15 Meg) and mounting CD on /mnt 6) run with mini install and NFS mounting remote CD on /mnt 7) run with mini install and NFS mounting remote SLS on /mnt Note that options 1), 2) and 4) can be used on machines with no harddrive. Also, with the introduction of the loadable ramdisk, option 1) can be converted into option 2) anytime after bootup, by running "MakeRamDisk". Running from CD, even on diskless machines, is now very practical, because the directories that contain config files are now all contained on a single mount point to either a ramdisk, floppy or regular disk. Unlike the previous SLS CD's, the sources have grown in volume to the point where they must now be distributed as compressed tar archives, in order to fit them all onto the CDROM. "updatedb" has been run on the CD, so any file on the CD can be located in seconds using the "locate" command. From the hard drive you can locate any file containing PATTERN with: locate -d /a/cd/usr/lib/find.codes PATTERN Man pages are provided in both formatted and unformatted format. 1.05 SYNOPSIS: -------------- The primary feature of this release is Linux 1.0 modified to convert nearly all Linux devices and facilities into loadable modules. It is hoped that eventually this will cause the number of kernel patches to diminish, and the current kernel to be split into two pieces: kernel proper and kernel modules. Perhaps an API can even be evolved to reduce dependancies on kernel data structures. Following is a condensed list of the 63 or so modules that have resulted from the SLS kernel modularization: at1700 atixlmouse atp ax25 binfmt_coff binfmt_elf busmouse cdu31a cdu535 d_link dble dscsi dsd dsg dsr dst el1 el3 el7 el9 ext ext2 fdomain floppy g_NCR5380 hp hpfs_fs ifs inet ipx isofs lance lmscd lp math mcd minix msbusmouse msdos ne net_dev nfs panasonic pas16 proc procdev psaux quota ramdisk sbpcd seagate slippp sound sysv t128 tpqic02 ultra ultrastor unix wd wd7000 xd xiafs Central to the feasibility of a modularized kernel is our bootstrap loader which allows bundling modules up into a kernel image permitting even disk drivers to be modularized. This bootloader was implemented as an extension to insmod. There is now only one kernel image: the one on the bootdisk. The kernel on the 3 1/2 is identical to the 5 1/4 except that it bootloads the network and NFS code. But since the Net code is loaded, the only difference is that you have to manually load the network after bootup, if you do an installation from 5 1/4's. Likewise, the 3 1/2 zImage is identical to the 5 1/4 if it is started with the lilo option "exc=unix,net_dev" (see below for details). COPYRIGHT: ---------- As with virtual consoles, ptys, shared libs and other Softlanding contributions, these kernel patches are covered by the same GPL copyright as Linux. Please refer to /usr/src/linux/COPYING for details. Programs/packages in SLS are copyrighted by their respective authors. In all cases, to the best of our knowledge, "we think" none of these restrict commercial redistribution, provided you observe GNU like redistribution policies. SLS system admin and system install specifics, other than the above, are copyright Softlanding Software, whose copyright is the same as GPL, except that you can not rename SLS (say by creating a new distribution using SLS sysadm) without permission. Redistribution, for any other purpose whatsoever is hereby granted. LOADABLE DEVICES: ----------------- Virtually everything that is not part of the intrinsic kernel logic in SLS has now been made loadable. As well as regular devices, such as CD's, parallel ports and mice, all of file systems are now loadable. Ditto for networking code. The unix domain sockets are loadable (perhaps only useful for development). Individual protocols such as IPX and AX25 are now also loadable. So also is the sound code, the Elf and Coff binary formats and the math emulator. The ramdisk is also loadable and unloadable, and so can have it's size set at runtime. Even things you might not consider candidates for loading, like quotas for example, are. So you must load the quota's module first, in order to use quotas. The SCSI devices have also been made loadable, but since SCSI has both low and high level drivers, the concept of composite modules is introduced. Composite modules simply permit a module to add symbols to the kernel symbols list that is exported for module linking. In the case of SCSI, first the generic SCSI code is loaded. Then the low-level (board/ controller) drivers are loaded. Lastly are the high-level (tape/disk/CD) drivers. The last high-level driver loaded is passed an argument telling it that it is last, and so to initialize the scsi subsystem. Failure to detect a board, causes all scsi modules to be deleted. BOOTTIME MODULE LOADING: ------------------------ The other major piece to the puzzle was a bootstrap loader for linux modules, to allows modules to be bundled with a boot image. In essence, the bootstrap loader piggybacks a collection of modules onto the end of the kernel image before it is compressed. At boot time, the modules are initialized and autodetected as usual. In all cases, if prerequisites are not detected at boottime, the module is unloaded, freeing it's memory and resources. For math.o for example, this means that autodetection of a coprocessor automatically unloads the math emulation software. A side benefit of boottime loading is that the call to xxx_setup() does not Result in a kernel patch to init/main.c, because the module loader automatically senses the presence of the xxx_setup() routine and calls it for you with any commandline arguments from the lilo prompt. POSTBOOT MODULE LOADING: ------------------------ Some drivers, such as disk controller code, need to be loaded at boottime, but others, such as Network code can be loaded after bootup. To have the modules loaded automatically for you, you could just do something like the following: move or copy the desired modules from the source tree, or from /install/modules/src to /install/modules/ The following lines, which have been added to the top of /etc/rc.local will auto load them for you. if [ -d /install/modules -a -d /proc/dev ]; then (cd /install/modules; for i in *.o; do insmod $i; done ) fi Interestingly, object files that are loadable modules are no different than ordinary .o's in that they can still be statically linked. When using "make config" on the Linux kernel, there are now four options: include, exclude, loadable and boot-loadable. You can identify loadable modules in "make config" by a "*" in the first column. Selecting 'l' instead of 'y' or 'n' makes the module loadable. Selecting 'm' cause the module to be loaded at boottime before the root fs is mounted. Implementation-wise, loadable modules use the same .o files that the kernel links in. There is no need to recompile the module if you decide to statically link it, rather than load it. See below for more details. PROC/DEV: --------- One other thing that this release adds is optional support for /proc/dev. The purpose of /proc/dev is to allow the kernel to report which devices it presently considers valid. Currently, the device reporting is not yet very accurate, so it is not compiled in by default, but eventually this feature could be used by configuration software, in setting up the system, and in particular, the /dev directory as in AIX. However, the main benefit lies in the dynamic allocation of major or minor device numbers, of which the former are in short supply. A dynamic scheme could have the module loader create the requisite /dev entries. This would also help developers avoid dev collisions. MODULE ARGUMENTS: ----------------- The insmod.c code has also been modified to allow passing arguments to modules using the -a option. This is used by such modules as ramdisk.o, to allow setting the ramdisk size, so a ramdisk can be created and destroyed at any time. Currently, the size can be changed without rebooting by unloading and reloading with a different value. 4096 (4Meg) is the current maximum. There is also a -f option, to force loading even if the version of the module does not match the kernel version. BOOTSTRAP MODULES: ------------------ It became necessary to modify the compressed-image bootup code, because there was no longer room in the < 640K area for the compressed kernel and the gzip code to run. So now the kernel is moved to just below the 2Meg mark before decompression, and the uncompressing data chases the compressed data boundary. CONFIGURATION VIA LILO: ----------------------- A few simple options are currently supported with lilo, to control which the handling of bootstrap loaded modules. The first, the exclude option causes the named modules to be *not* loaded or autodetected. exc=module1,module2,... causes the modules to be disabled and discarded. Since composite module members are checked at load time to ensure that dependant modules are already loaded, you can disable whole hierarchies of modules with a single statement. For example to disable all scsi and all network devices in one fell swoop use exc=net_dev,dscsi On the other hand, you can specify just the modules to include with: inc=module1,module2,...,moduleN This does the opposite of above. Only the modules listed are autodetected. This can limit the sometimes lengthy autodetection sequence to just the installation bootup, After which, bootup should be as fast as a custom compiled kernel. The intent is clearly to reduce, and perhaps someday eliminate, the need for most people to compile the kernel. Another benefit is that autodetection causes some machines to lockup at boottime. This provides a dynamic way to selectively disable modules. DMA MEMORY ISSUES: ------------------ One undesirable feature of current Linux device drivers is that they are allowed to do memory math at init time to allocate themselves some memory. For a few devices (basically only the sound and qic02tape), they require memory that has the same physical and logical address for DMA. The rest can just use the normal memory allocation of the kernel. To this end I have changed all devices to use a dalloc() call instead of memory math. These currently provide roughly the same functionality as the current kernel, but allow for all devices to be loadable as modules. There is also a dmamalloc() call for Tape and Sound, as there has to be a block of contiguous memory to allocate for the device when it is loaded. To control this behaviour, you can use the "mod=" option, whose syntax is: linux mod=DMA,NUM,debug DMA is the amount of dma ram to set aside, NUM is the number of modules you wish to load after boottime before ram is released, and debug gives a verbose printout of the sequence of module initialization. The following statement at the lilo prompt, sets aside the specified amount of memory for boot load modules (from the default of about 256K). linux mod=512 This reserves 512K of ram for modules at boottime. Again, the memory is called dma memory because this type of memory allocation is the only kind that can be used for dma (memory_start math). kmalloc will not work. Normally, any unused portion of the above memory is released by the time init is called, right after bootup. However, if one wishes to load the qic02tape driver or the sound driver after bootup (the only option without recompiling as they are not part of the default kernel), an additional step is required: linux mod=-1,1 This tells the kernel to not release the unused dma memory after bootup but instead allow you to load '1' module before releasing unsed ram. If you want the tape driver as well, and allow for extra ram you would use: linux mod=600,2 etc. Note: DMA requiring modules must then be the FIRST modules loaded after booting. While the preceding may seem somewhat contrived, there may not be a general solution to the problem of allocating a chunk of DMA ram at any arbitrary time without a reboot. Of course, I would be delighted to be proved wrong, but until then, if you need these devices, the best way may be to compile them into the kernel. USING IT: --------- Normally to use a module you "insmod" it. To have it done at boottime for you automatically, you just move or copy it into /install/modules. If you still want to rebuild the kernel, you will need to ensure that you have installed the accompanying module utilities: insmod, rmmod and lsmod. Do a make config as usual, but type 'm' for to bootload a module, or 'l' to have it compiled but not loaded. Then do a 'make dep' as usual. Then type "make mImage". This will make "mImage" which you can boot exactly the same as zImage. After booting, do "lsmod" to see the loaded modules. In later builds, you can control exactly which modules are loaded into the bootstrap, by editing .config, and thus avoid the lengthy make config. Normal builds without modules are supported as usual. FUTURES: -------- The sound code, although loadable, needs to be modified to allow loading individual low-level (board) drivers. Since it also has DMA complications, this was not done for SLS. Sound can really only be loaded at boottime, or by using the "mod=" lilo option, because it needs 1:1 mapped memory for dma. The console, keyboard and serial code (and ipc?) could also be made loadable. Payback is minimal, unless Linux is used in imbedded systems. Better detection of when modules are busy, and hence unloadable, should also be added. A (much) better configuration control mechanism should be put in place. Better memory management could be used, say removing the restriction of aligning modules on page boundaries. In a typical non-SCSI installation of about 10 modules, this could save about 20K (assuming 1/2 page per module). For the bootstrap-loader, rather than add linker logic code to the kernel, the fixup has been done at compile time (using a modified insmod.c from the module package). Perhaps in later implementations this will change, because modules this causes modules to be bigger at boottime. It might be necessary to save room in the boot image as the kernel and or disk modules continues to grow. Future implementations might include auto loading of devices upon open (demand loading) and unloading when idle. The option to install on an existing partition is really designed to allow installation on systems with a big partition HOW TO MODULARIZE A DRIVER: --------------------------- The first requirement to make module foo.o a module, is that it have two functions foo_init() and foo_cleanup(). There must also be the following: #include char foo_version[] = UTS_RELEASE; Finally, memory allocation should not use memory math on mem_start, but should rather use dmalloc() etc, as defined in module.c. Simple huh. Oh, and if you want to pass arguments at init time. there should also be a foo_setup(). Using "insmod -a N module.o" will pass argument N to the module. Currently, only integers are supported. Lastly, if you get an undefined symbol when trying to load a module, it means that you need to add it to kernel/ksyms.S. MESH: ----- Mesh, the Softlanding MEnu SHell, is a cross between a menu system, a file browser and a (somewhat bash-like) shell. It is also designed to serve as the front end to a system administration program, under development. Mesh is designed to reduce the number of keystrokes and be easy to learn. Any normal unix command can be executed from the mesh command line. The current file name can also be referenced by the first %s in the command line. The second %s refers to the destination (other) window, and the third %s, the current window. Additionally, Mesh displays menu items at the bottom of the screen, which can be selected using the Alt-X command, where X is substituted with the first capital letter in the menu title string. Mesh also has popup lists which can be cursored through, or shortcutted by just typing the letter that is capitalized in the label. Mesh doesn't actually have any built in menu items. Rather menus are defined in /etc/meshrc, ~/.meshrc, and/or are specified with the -menu argument. At any time, you can use Alt-Z to return to the top level menu. Other behaviour of note includes: When you just hit enter at a file, the default action is executed. The default action is based upon the file suffix as defined by the Suffix settings in .meshrc. Note that if no extension is matched, the last defined Suffix entry gets used, usually the program "less". When you hit enter the first match is executed. Or, Typing just the command '1' causes it to skip the first match. '2' skips the first 2 matches etc. Note that control-k is considered a shortcut for '1', or skip 1. In all cases, failure to match causes the last or default Suffix command to be executed. Additionally, if a file is executable, and it has no extension matching default rule, then you can execute it with control-k. You can see what suffix defaults the current file matches using the .Setup.Keys command. Powerful as it is, Mesh is soon to be overhauled to use Tcl, for greater flexibility, configurability, and generality. MAN PAGES: ---------- The change of direction of not preformatting the man pages has come about primarily for two reasons. First and foremost, Tkman an X based manual page reader that now comes with SLS requires unformatted pages to work properly. This reader which offers hypertext, section parsing, history and much more makes reading man pages a real joy compared to the old more or less approach. It would also be nice to see a text based version of this reader RSN. Secondly, numerous people pointed out that trying to print preformatted man pages caused most printers to complain (well barf actually). And even if you got it to work, it looked lousy. All you got was typewriter font, and all the page numbers didn't line up on page boundries, etc, etc. Anyways, formatting usually takes only a second or two on most machines. BUGS/WARNINGS: -------------- Unloading modules is currently not guarrented to clean up everything properly for all devices. Individual drivers need perhaps more attention. The source to picasso has been included because it has a fair bit of C++ code, and because there is a bug under Linux/Tk with image rotate and stretch. The compiler must be installed in order to use X-windows, in order to link the X servers. This saves around 3 Meg in the distribution. The option to install on an existing partition is really designed to allow installation on systems with a big partition containing data (like /home) that should be preserved. AVAILABILITY: ------------- SLS is available on floppies (31 5.25 floppies or 26 3.5 floppies), QIC150 or CDROM from the address below for a flat rate distribution fee of US $99 ($125 Canadian) + $15 shipping and handling. Mail payment, either cheque or money order, in advance, to Softlanding. Visa and Mastercard are also accepted. The SLS CDROM contains the full source tree and a 60+ page user manual "Using SLS". A quarterly CD (4 CD's over 1 year) is available for US $199 (255 Canadian) + $15 S&H. Quantity discounts are also available for resellers. When ordering floppies, ensure that you specify the bootdisk type (3 1/2 or 5 1/4). Softlanding also offers support subscriptions for SLS as follows: Individual support, (one user, one machine) is $99 per year. Group support, primarily for resellers and reseller/corporate, $999 per Softlanding Software PO Box 48054 - 3575 Douglas St, Victoria, BC, Canada V8Z-7HS Phone (604) 592-0188 FAX (604) 595-5820 See Softlanding for a gentle touch down from a DOS bailout.