diff options
Diffstat (limited to 'share/doc/handbook/linuxemu.sgml')
-rw-r--r-- | share/doc/handbook/linuxemu.sgml | 700 |
1 files changed, 0 insertions, 700 deletions
diff --git a/share/doc/handbook/linuxemu.sgml b/share/doc/handbook/linuxemu.sgml deleted file mode 100644 index cca6541..0000000 --- a/share/doc/handbook/linuxemu.sgml +++ /dev/null @@ -1,700 +0,0 @@ -<!-- $Id: linuxemu.sgml,v 1.18 1997/03/19 03:15:43 obrien Exp $ --> -<!-- The FreeBSD Documentation Project --> - -<chapt><heading>Linux Emulation<label id="linuxemu"></heading> - -<p><em>Contributed by &a.handy and &a.rich;</em> - -<sect><heading>How to install the Linux emulator</heading> - -<p>Linux emulation in FreeBSD has reached a point where it is possible -to run a large fraction of Linux binaries in both a.out and ELF -format. The linux emulation in the 2.1-STABLE branch is capable of -running Linux DOOM and Mathematica; the version present in -FreeBSD-2.2-RELEASE is vastly more capable and runs all these as well as -Quake, Abuse, IDL, netrek for Linux and a whole host of other -programs. - -There are some Linux-specific operating system features that are not -supported on FreeBSD. Linux binaries will not work on FreeBSD if they -use the Linux /proc filesystem (which is different from the optional -FreeBSD /proc filesystem) or i386-specific calls, such as enabling -virtual 8086 mode. - -<p>To tell whether your kernel is configured for Linux -compatibility simply run any Linux binary. If it -prints the error message -<tscreen> -<verb> -linux-executable: Exec format error. Wrong Architecture. -</verb> -</tscreen> -then you do not have linux compatibility support and -you need to configure and install a new kernel. - -Depending on which version of FreeBSD you are running, how you get -Linux-emulation up will vary slightly: - -<sect1><heading>Installing Linux Emulation in 2.1-STABLE</heading> - -<p>The GENERIC kernel in 2.1-STABLE is not configured for linux -compatibility so you must reconfigure your kernel for it. There -are two ways to do this: 1. linking the emulator statically in the -kernel itself and 2. configuring your kernel to dynamically load the -linux loadable kernel module (LKM). - -<p>To enable the emulator, add the following to your configuration file -(c.f. /sys/i386/conf/LINT): -<tscreen> -<verb> -options COMPAT_LINUX -</verb> -</tscreen> -If you want to run doom or other applications -that need shared memory -also add the following. -<tscreen> -<verb> -options SYSVSHM -</verb> -</tscreen> -The linux system calls require 4.3BSD system call compatibility. So -make sure you have the following. -<tscreen> -<verb> -options "COMPAT_43" -</verb> -</tscreen> - -If you prefer to statically link the emulator in the kernel rather than -use the loadable kernel module (LKM), then add -<tscreen> -<verb> -options LINUX -</verb> -</tscreen> -Then run config and install the new kernel as described in the -<ref id="kernelconfig" name="kernel configuration"> section. - -If you decide to use the LKM you must also install the loadable -module. A mismatch of versions between the kernel and loadable -module can cause the kernel to crash, so the safest thing to do is to -reinstall the LKM when you install the kernel. -<tscreen> -<verb> -% cd /usr/src/lkm/linux -% make all install -</verb> -</tscreen> -Once you have installed the kernel and the LKM, you can invoke -`linux' as root to load the LKM. -<tscreen> -<verb> -% linux -Linux emulator installed -Module loaded as ID 0 -% -</verb> -</tscreen> -To see whether the LKM is loaded, run `modstat'. -<tscreen> -<verb> -% modstat -Type Id Off Loadaddr Size Info Rev Module Name -EXEC 0 3 f0baf000 0018 f0bb4000 1 linux_emulator -% -</verb> -</tscreen> -You can cause the LKM to be loaded when the system boots in either of -two ways. On FreeBSD 2.2-RELEASE and 2.1-STABLE enable it in -/etc/sysconfig -<tscreen> -<verb> -linux=YES -</verb> -</tscreen> -by changing it from NO to YES. FreeBSD 2.1 RELEASE and earlier do not -have such a line and on those you will need to edit /etc/rc.local to -add the following line. -<tscreen> -<verb> -linux -</verb> -</tscreen> - -<sect1><heading>Installing Linux Emulation in 2.2-RELEASE and later</heading> - -<p>It is no longer necessary to specify ``options LINUX'' -or ``options COMPAT_LINUX''. Linux emulation is done with an LKM -(``Loadable Kernel Module'') so it can be installed on the fly without -having to reboot. You will need the following things in your startup files, -however: -<enum> -<item> In /etc/sysconfig, you need the following line: -<tscreen> -<verb> -linux=YES -</verb> -</tscreen> -<item> This, in turn, triggers the following action in /etc/rc.i386: -<tscreen> -<verb> -# Start the Linux binary emulation if requested. -if [ "X${linux}" = X"YES" ]; then - echo -n ' '; linux - # XXX BOGUS - Linux script shouldn't make any output on success -fi -</verb> -</tscreen> -</enum> - -<p>If you want to verify it is running, modstat will do that: -<tscreen> -<verb> -% modstat -Type Id Off Loadaddr Size Info Rev Module Name -EXEC 0 4 f09e6000 001c f09ec010 1 linux_mod -% -</verb> -</tscreen> -However, there have been reports that this fails on some 2.2-RELEASE and -later systems. If for some reason you cannot load the linux -LKM, then statically link the emulator in the kernel by adding -<tscreen> -<verb> -options LINUX -</verb> -</tscreen> -to your kernel config file. Then run config and install the new -kernel as described in the <ref id="kernelconfig" name="kernel -configuration"> section. - -<sect1><heading>Installing Linux Runtime Libraries</heading> - -<sect2><heading>Installing using the linux_lib port</heading> - -<p>Most linux applications use shared libraries, so you are still not -done until you install the shared libraries. It is possible to do -this by hand, however, it is vastly simpler to just grab the -linux_lib port: -<tscreen> -<verb> -% cd /usr/ports-current/emulators/linux_lib -% make all install -</verb> -</tscreen> - -and you should have a working linux emulator. Legend (and the mail -archives :-) seems to hold that Linux emulation works best with -linux binaries linked against the ZMAGIC libraries; QMAGIC libraries -(such as those used in Slackware V2.0) may tend to give the -Linuxulator heartburn. As of this writing (March 1996) ELF emulation -is still in the formulative stages but seems to work pretty well. Also, -expect some programs to complain about incorrect minor versions. In -general this does not seem to be a problem. - -<sect2><heading>Installing libraries manually</heading> - -<p>If you do not have the ``ports'' distribution, you can install the -libraries by hand instead. You will need the Linux shared libraries -that the program depends on and the runtime linker. Also, you will -need to create a "shadow root" directory, /compat/linux, for Linux -libraries on your FreeBSD system. Any shared libraries opened by -Linux programs run under FreeBSD will look in this tree first. So, if -a Linux program loads, for example, /lib/libc.so, FreeBSD will first -try to open /compat/linux/lib/libc.so, and if that does not exist then -it will try /lib/libc.so. Shared libraries should be installed in the -shadow tree /compat/linux/lib rather than the paths that the Linux -ld.so reports. - - -FreeBSD-2.2-RELEASE and later works slightly differently with respect to -/compat/linux. On -CURRENT, all files, not just libraries, are -searched for from the ``shadow root'' /compat/linux. - -Generally, you will need to look for the shared libraries that Linux -binaries depend on only the first few times that you install a Linux -program on your FreeBSD system. After a while, you will have a sufficient -set of Linux shared libraries on your system to be able to run newly -imported Linux binaries without any extra work. - -<sect2><heading>How to install additional shared libraries</heading> - -<p>What if you install the linux_lib port and your application still -complains about missing shared libraries? How do you know which -shared libraries Linux binaries need, and where to get them? -Basically, there are 2 possibilities (when following these -instructions: you will need to be root on your FreeBSD system to do -the necessary installation steps). - -<p>If you have access to a Linux system, see what shared libraries -it needs, and copy them to your FreeBSD system. Example: you have -just ftp'ed the Linux binary of Doom. Put it on the Linux -system you have access to, and check which shared libraries it -needs by running `ldd linuxxdoom': - -<tscreen> -<verb> -% ldd linuxxdoom -libXt.so.3 (DLL Jump 3.1) => /usr/X11/lib/libXt.so.3.1.0 -libX11.so.3 (DLL Jump 3.1) => /usr/X11/lib/libX11.so.3.1.0 -libc.so.4 (DLL Jump 4.5pl26) => /lib/libc.so.4.6.29 -</verb> -</tscreen> - -<p>You would need go get all the files from the last column, and -put them under /compat/linux, with the names in the first column -as symbolic links pointing to them. This means you eventually have -these files on your FreeBSD system: -<tscreen> -<verb> -/compat/linux/usr/X11/lib/libXt.so.3.1.0 -/compat/linux/usr/X11/lib/libXt.so.3 -> libXt.so.3.1.0 -/compat/linux/usr/X11/lib/libX11.so.3.1.0 -/compat/linux/usr/X11/lib/libX11.so.3 -> libX11.so.3.1.0 -/compat/linux/lib/libc.so.4.6.29 -/compat/linux/lib/libc.so.4 -> libc.so.4.6.29 -</verb> -</tscreen> - -<p>Note that if you already have a Linux shared library with a -matching major revision number to the first column of the 'ldd' -output, you will not need to copy the file named in the last column to -your system, the one you already have should work. It is advisable to -copy the shared library anyway if it is a newer version, though. You -can remove the old one, as long as you make the symbolic link point to -the new one. So, if you have these libraries on your system: -<tscreen> -<verb> -/compat/linux/lib/libc.so.4.6.27 -/compat/linux/lib/libc.so.4 -> libc.so.4.6.27 -</verb> -</tscreen> - -and you find a new binary that claims to require a later version -according to the output of ldd: -<tscreen> -<verb> -libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29 -</verb> -</tscreen> - -If it is only one or two versions out of date in the in the trailing -digit then do not worry about copying /lib/libc.so.4.6.29 too, because -the program should work fine with the slightly older version. -However, if you like you can decide to replace the libc.so anyway, and -that should leave you with: -<tscreen> -<verb> -/compat/linux/lib/libc.so.4.6.29 -/compat/linux/lib/libc.so.4 -> libc.so.4.6.29 -</verb> -</tscreen> - -<p>Please note that the symbolic link mechanism is <em>only</em> -needed for Linux binaries, the FreeBSD runtime linker takes care of -looking for matching major revision numbers itself, you do not need to -worry about that. - -<sect2><heading>Configuring the ld.so -- for FreeBSD 2.2-RELEASE only</heading> - -<p>This section applies only to FreeBSD 2.2-RELEASE and later. Those running -2.1-STABLE should skip this section. - -<p>Finally, if you run FreeBSD 2.2-RELEASE you must make sure that you -have the Linux runtime linker and its config files on your system. You -should copy these files from the Linux system to their appropriate -place on your FreeBSD system (to the /compat/linux tree): -<tscreen> -<verb> -/compat/linux/lib/ld.so -/compat/linux/etc/ld.so.config -</verb> -</tscreen> - -<p>If you do not have access to a Linux system, you should get the -extra files you need from various ftp sites. Information on where to -look for the various files is appended below. For now, let us assume -you know where to get the files. - -<p> -Retrieve the following files (all from the same ftp site to avoid any -version mismatches), and install them under /compat/linux -(i.e. /foo/bar is installed as /compat/linux/foo/bar): -<tscreen> -<verb> -/sbin/ldconfig -/usr/bin/ldd -/lib/libc.so.x.y.z -/lib/ld.so -</verb> -</tscreen> - -<p>ldconfig and ldd do not necessarily need to be under /compat/linux, -you can install them elsewhere in the system too. Just make sure they -do not conflict with their FreeBSD counterparts. A good idea would be -to install them in /usr/local/bin as ldconfig-linux and ldd-linux. -<p> -Create the file /compat/linux/etc/ld.so.conf, containing the -directories in which the Linux runtime linker should look -for shared libs. It is a plain text file, containing a directory -name on each line. /lib and /usr/lib are standard, you could -add the following: -<tscreen> -<verb> -/usr/X11/lib -/usr/local/lib -</verb> -</tscreen> - -<p>When a linux binary opens a library such as /lib/libc.so the -emulator maps the name to /compat/linux/lib/libc.so internally. All -linux libraries should be installed under /compat/linux (e.g. -/compat/linux/lib/libc.so, /compat/linux/usr/X11/lib/libX11.so, etc.) -in order for the emulator to find them. - -<p>Those running FreeBSD 2.2-RELEASE should run the Linux ldconfig program. -<tscreen> -<verb> -% cd /compat/linux/lib -% /compat/linux/sbin/ldconfig -</verb> -</tscreen> - -<p>Ldconfig is statically linked, so it does not need any shared -libraries to run. It creates the file /compat/linux/etc/ld.so.cache -which contains the names of all the shared libraries. It should rerun -to recreate this file whenever you install additional shared -libraries. - -On 2.1-STABLE do not install /compat/linux/etc/ld.so.cache or run -ldconfig because in 2.1-STABLE the syscalls are implemented -differently and ldconfig is not needed or used. - -<p>You should now be set up for Linux binaries which only need a -shared libc. You can test this by running the Linux ldd on -itself. Suppose that you have it installed as ldd-linux, it should -produce something like: -<tscreen> -<verb> -% ldd-linux `which ldd-linux` -libc.so.4 (DLL Jump 4.5pl26) => /lib/libc.so.4.6.29 -</verb> -</tscreen> - -<p>This being done, you are ready to install new Linux binaries. -Whenever you install a new Linux program, you should check if it needs -shared libraries, and if so, whether you have them installed in the -/compat/linux tree. To do this, you run the Linux version ldd on the -new program, and watch its output. ldd (see also the manual page for -ldd(1)) will print a list of shared libraries that the program depends -on, in the form majorname (jumpversion) => fullname. - -<p>If it prints "not found" instead of fullname it means that you -need an extra library. Which library this is, is shown in majorname, -which will be of the form libXXXX.so.N You will need to find a -libXXXX.so.N.mm on a Linux ftp site, and install it on your -system. The XXXX (name) and N (major revision number) should match; -the minor number(s) mm are less important, though it is advised to -take the most recent version. - -<sect1><heading>Configuring the host name resolver</heading> - -<p>If DNS does not work or you get the messages -<tscreen> -<verb> -resolv+: "bind" is an invalid keyword -resolv+: "hosts" is an invalid keyword -</verb> -</tscreen> - -then you need to configure a /compat/linux/etc/host.conf file -containing: -<tscreen> -<verb> -order hosts, bind -multi on -</verb> -</tscreen> - -where the order here specifies that /etc/hosts is searched first and -DNS is searched second. When /compat/linux/etc/host.conf is not -installed linux applications find FreeBSD's /etc/host.conf and -complain about the incompatible FreeBSD syntax. You should remove -`bind,' if you have not configured a name-server using the -/etc/resolv.conf file. - -<p>Lastly, those who run 2.1-STABLE need to set an the -RESOLV_HOST_CONF environment variable so that applications will know -how to search the host tables. If you run FreeBSD 2.2-RELEASE can -skip this. For the /bin/csh shell use: -<tscreen> -<verb> -setenv RESOLV_HOST_CONF /compat/linux/etc/host.conf -</verb> -</tscreen> - -For /bin/sh use: -<tscreen> -<verb> -RESOLV_HOST_CONF=/compat/linux/etc/host.conf; export RESOLV_HOST_CONF -</verb> -</tscreen> - -<sect1><heading>Finding the necessary files</heading> - -<p>Note: the information below is valid as of the time this document -was written, but certain details such as names of ftp sites, -directories and distribution names may have changed by the time you -read this. - -<p>Linux is distributed by several groups that make their own set -of binaries that they distribute. Each distribution has its own -name, like ``Slackware'' or ``Yggdrasil''. The distributions are -available on a lot of ftp sites. Sometimes the files are unpacked, -and you can get the individual files you need, but mostly they -are stored in distribution sets, usually consisting of subdirectories -with gzipped tar files in them. The primary ftp sites for the -distributions are: -<verb> -sunsite.unc.edu:/pub/Linux/distributions -tsx-11.mit.edu:/pub/linux/distributions -</verb> - -<p> -Some European mirrors: -<verb> -ftp.luth.se:/pub/linux/distributions -ftp.demon.co.uk:/pub/linux/distributions -src.doc.ic.ac.uk:/packages/linux/distributions -</verb> - -<p>For simplicity, let us concentrate on Slackware here. This -distribution consists of a number of subdirectories, containing -separate packages. Normally, they are controlled by an install -program, but you can retrieve files "by hand" too. First of all, you -will need to look in the "contents" subdir of the distribution. You -will find a lot of small text files here describing the contents of the -separate packages. The fastest way to look something up is to retrieve -all the files in the contents subdirectory, and grep through them for -the file you need. Here is an example of a list of files that you -might need, and in which contents-file you will find it by grepping -through them: -<tabular ca=ll> -Library <colsep>Package <rowsep> -ld.so <colsep>ldso <rowsep> -ldconfig <colsep>ldso <rowsep> -ldd <colsep>ldso <rowsep> -libc.so.4 <colsep>shlibs <rowsep> -libX11.so.6.0 <colsep>xf_lib <rowsep> -libXt.so.6.0 <colsep>xf_lib <rowsep> -libX11.so.3 <colsep>oldlibs <rowsep> -libXt.so.3 <colsep>oldlibs <rowsep> -</tabular> - -<p>So, in this case, you will need the packages ldso, shlibs, xf_lib -and oldlibs. In each of the contents-files for these packages, look -for a line saying ``PACKAGE LOCATION'', it will tell you on which `disk' -the package is, in our case it will tell us in which subdirectory we -need to look. For our example, we would find the following locations: -<tabular ca=ll> -Package <colsep>Location <rowsep> -ldso <colsep>diska2 <rowsep> -shlibs <colsep>diska2 <rowsep> -oldlibs <colsep>diskx6 <rowsep> -xf_lib <colsep>diskx9 <rowsep> -</tabular> - -<p>The locations called ``diskXX'' refer to the ``slakware/XX'' -subdirectories of the distribution, others may be found in the -``contrib'' subdirectory. In this case, we could now retrieve the -packages we need by retrieving the following files (relative to -the root of the Slackware distribution tree): -<tscreen> -<verb> -slakware/a2/ldso.tgz -slakware/a2/shlibs.tgz -slakware/x6/oldlibs/tgz -slakware/x9/xf_lib.tgz -</verb> -</tscreen> - -<p>Extract the files from these gzipped tarfiles in your -/compat/linux directory (possibly omitting or afterwards -removing files you do not need), and you are done. - -<p><bf>See also:</bf> -<verb> -ftp.freebsd.org:pub/FreeBSD/2.0.5-RELEASE/xperimnt/linux-emu/README - -/usr/src/sys/i386/ibcs2/README.iBCS2 -</verb> - -<sect><heading>How to Install Mathematica on FreeBSD<label id="mathematica"></heading> - -<p><em>Contributed by &a.rich and &a.chuck</em> - -This document shows how to install the Linux binary -distribution of Mathematica 2.2 on FreeBSD 2.1. - -<p>Mathematica supports Linux but not FreeBSD as it stands. So once -you have configured your system for Linux compatibility you have most -of what you need to run Mathematica. - -<p>For those who already have the student edition of -Mathematica for DOS the cost of upgrading to the Linux -version at the time this was written, March 1996, was -$45.00. It can be ordered directly from Wolfram at -(217) 398-6500 and paid for by credit card. - -<sect1><heading>Unpacking the Mathematica distribution</heading> -<p>The binaries are currently distributed by Wolfram on CDROM. -The CDROM has about a dozen tar files, each of which is a binary -distribution for one of the supported architectures. The one -for Linux is named LINUX.TAR. You can, for example, unpack this -into /usr/local/Mathematica: -<tscreen> -<verb> -% cd /usr/local -% mkdir Mathematica -% cd Mathematica -% tar -xvf /cdrom/LINUX.TAR -</verb> -</tscreen> - -<sect1><heading>Obtaining your Mathematica Password</heading> -<p>Before you can run Mathematica you will have to obtain -a password from Wolfram that corresponds to your -`machine ID.' - -<p>Once you have installed the linux compatibility runtime -libraries and unpacked the mathematica you can obtain -the `machine ID' by running the program `mathinfo' in -the Install directory. -<tscreen> -<verb> -% cd /usr/local/Mathematica/Install -% mathinfo -LINUX: 'ioctl' fd=5, typ=0x89(), num=0x27 not implemented -richc.isdn.bcm.tmc.edu 9845-03452-90255 -% -</verb> -</tscreen> -So, for example, the `machine ID' of `richc' is `9845-03452-90255'. -You can ignore the message about the ioctl that is not -implemented. It will not prevent Mathematica from running -in any way and you can safely ignore it, though you -will see the message every time you run Mathematica. - -<p>When you register with Wolfram, either by email, phone -or fax, you will give them the 'machine ID' and they will -respond with a corresponding password consisting of -groups of numbers. You need to add them both along -with the machine name and license number in your -mathpass file. - -You can do this by invoking: -<tscreen> -<verb> -% cd /usr/local/Mathematica/Install -% math.install -</verb> -</tscreen> -It will ask you to enter your license number and the -Wolfram supplied password. If you get them mixed up or -for some reason the math.install fails, That is OK, -because you can simply edit the file 'mathpass' in this -same directory to correct the info manually. - -<p>After getting past the password, math.install will ask -you if you accept their canned install defaults, or if -you want to use your own. If you are like us and -distrust all install programs, you probably want to -specify the actual directories. Beware. Although the -math.install program asks you to specify directories, -it will not create them for you, so you should perhaps -have a second window open with another shell so that -you can create them before you give them to the install -program. Or, if it fails, you -can create the directories and then restart the -math.install program. The directories we chose to -create beforehand and specify to math.install were: -<tscreen> -<verb> -/usr/local/Mathematica/bin for binaries -/usr/local/Mathematica/man/man1 for man pages -/usr/local/Mathematica/lib/X11 for the XKeysymb file -</verb> -</tscreen> -You can also tell it to use /tmp/math.record for the -system record file, where it puts logs of sessions. -After this math.install will continue on to -unpacking things and placing everything where it should -go. - -<p>The Mathematica Notebook feature is included separately, -as the X Front End, and you have to install it separately. -To get the X Front End stuff correctly installed, cd -into the /usr/local/Mathematica/FrontEnd directory and -executed the ./xfe.install shell script. You will have -to tell it where to put things, but you do not have to -create any directories because it uses all the same -directories that had been created for math.install. -When it finished, there should be a new shell script in -/usr/local/Mathematica/bin called "mathematica". - -<p>Lastly, you need to modify each of the shell scripts that -Mathematica has installed. At the beginning of every shell script in -/usr/local/Mathematica/bin add the following line: -<tscreen> -<verb> -XKEYSYMDB=/usr/local/Mathematica/lib/X11/XKeysymDB; export XKEYSYMDB -</verb> -</tscreen> -This tells Mathematica were to find its own version of the key -mapping file XKeysymDB. Without this you will get pages of error -messages about missing key mappings. - -On 2.1-STABLE you need to add the following as well: -<tscreen> -<verb> -RESOLV_HOST_CONF=/compat/linux/etc/host.conf; export RESOLV_HOST_CONF -</verb> -</tscreen> -This tells Mathematica to use the linux version of host.conf. This -file has a different syntax from FreeBSD's host.conf, so you will get an -error message about /etc/host.conf if you leave this out. - -<p>You might want to also modify your /etc/manpath.config file -to read the new man directory, and you may need to edit your -~/.cshrc file to add /usr/local/Mathematica/bin -to your path. - -<p>That is about all it takes, With this you should be able -to type "mathematica" and get a really slick looking -Mathematica Notebook screen up. Mathematica has included -the Motif user interfaces, but it is compiled in statically, -so you do not need the Motif libraries. Good luck doing this -yourself! - -<sect1><heading>Bugs</heading> - -<p>The Notebook front end is known to hang sometimes when reading -notebook files with an error messages similar to: -<tscreen> -<verb> -File .../Untitled-1.mb appears to be broken for OMPR.257.0 -</verb> -</tscreen> - -We have not found the cause for this, but it only affects the -Notebook's X Window front end, not the mathematica engine itself. So -the command line interface invoked by 'math' is unaffected by this -bug. - -<sect1><heading>Acknowledgments</heading> - -<p>A well-deserved thanks should go to &a.sos; and &a.peter; -who made linux emulation what it is today, and Michael Smith who -drove these two guys like dogs to get it to the point where it runs -Linux binaries better than linux! :-) |