711 lines
		
	
	
	
		
			25 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			711 lines
		
	
	
	
		
			25 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| <!-- $Id: linuxemu.sgml,v 1.24 1998-09-11 17:22:49 jkh 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
 | |
| &rel.current;-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.
 | |
| 
 | |
| 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.  In FreeBSD 2.2.1-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.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/rc.conf, you need the following line:
 | |
| <tscreen>
 | |
| <verb>
 | |
| linux_enable=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_enable}" = X"YES" ]; then
 | |
|         echo -n ' linux';               linux > /dev/null 2>&1
 | |
| 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/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.  Also, expect some programs to complain about 
 | |
| incorrect minor versions of the system libraries.  In general, however,
 | |
| 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:  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
 | |
| the application 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 to 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 and you do not need to
 | |
| worry about it.
 | |
| 
 | |
| <sect2><heading>Configuring the ld.so -- for FreeBSD 2.2-RELEASE and 
 | |
| later</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 and should be 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; 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. Supposing 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. The library needed is shown in majorname
 | |
| and 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>Installing Linux ELF binaries</heading>
 | |
| <p>ELF binaries sometimes require an extra step of ``branding''.
 | |
| If you attempt to run  an unbranded ELF binary, you will get an error 
 | |
| message like the following:
 | |
| 
 | |
| <verb>
 | |
| % ./my-linux-elf-binary
 | |
| ELF binary type not known
 | |
| Abort
 | |
| %
 | |
| </verb>
 | |
| 
 | |
| <p>To help the FreeBSD kernel distinguish between a FreeBSD ELF binary from a
 | |
| a Linux one, use the <htmlurl url="http://www.freebsd.org/cgi/man.cgi?brandelf"
 | |
| name="brandelf(1)"> utility:
 | |
| <verb>
 | |
| % brandelf -t Linux my-linux-elf-binary
 | |
| </verb>
 | |
| 
 | |
| <p>The GNU toolchain now places the appropriate branding information 
 | |
| into ELF binaries automatically, so you should be needing to do
 | |
| this step increasingly rarely in the future.
 | |
| 
 | |
| <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 or later, 
 | |
| you 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/unix/linux
 | |
| 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;
 | |
| 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 the install defaults provided, 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
 | |
| execute 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 will use the same
 | |
| directories that had been created for math.install.
 | |
| When it finishes, 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 also want to 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!   :-) 
 |