BBS水木清华站∶精华区
发信人: linuxrat (叫我老鼠错不了), 信区: Linux
标 题: Linux under FreeBSD[Forward]
发信站: BBS 水木清华站 (Mon Jan 3 15:07:35 2000)
Original URL: http://www.samag.com/linux/articles/v09/i01/a1.shtml
===============Begin============================
Linux under FreeBSD
Michael Lucas
_________________________________________________________________
lucas
________________________________________________________
FreeBSD has several options for using software from other platforms,
such as Wine for Win32 and dosemu for DOS. BSDI, NetBSD, and OpenBSD
binaries will run unmodified, and source code from many UNIX or Linux
programs can be compiled without modification on FreeBSD.
Additionally, FreeBSD includes kernel modules for Linux, SCO, and
SVR4. These modules allow you to run unmodified binaries for these
platforms on your FreeBSD machine. FreeBSD's Linux module works well
enough that several commercial software packages for Linux have been
included in the FreeBSD ports system. Similarly, this article was
written on Sun StarOffice 5.1 for Linux, on my FreeBSD-current box.
Because the last version of RealVideo for FreeBSD is version 3.0, I
run RealVideo 5.0 for Linux.
In FreeBSD 3.3-stable or higher, Linux mode has two components: the
kernel system call module, and the runtime environment.
The Linux Kernel Module
The kernel-loadable module, or KLM, supports Linux-specific system
calls. You can determine whether the Linux KLM is loaded on your
system by using:
#kldstat -v | grep linux
2 1 0xc08dc000 e000 linux.ko
15 linuxelf
16 linuxaout
#
(kldstat -v provides other useful information about your kernel, and
is generally informative on any FreeBSD system.) If the module is not
loaded, you can load it by becoming root and typing:
# linux
You can make this automatic at boot by setting linux_enable="YES" in
/etc/rc.conf. Strictly speaking, you don't have to compile a custom
kernel to support the Linux module. You'll be more satisfied with your
results, however, if your kernel includes the following options:
options "P1003_1B" #POSIX infrastructure
options "_KPOSIX_PRIORITY_SCHEDULING" #Built-in POSIX priority scheduling
options "_KPOSIX_VERSION=199309L" #POSIX version kernel is built for
options SYSVSHM #System V shared memory
options SYSVMSG #System V semaphores
options SYSVSEM #System V messaging
options USER_LDT #allow user-level control of i386 ldt
For full instructions on building a custom kernel, check:
http://www.FreeBSD.org/handbook/handbook50.html
If you have the FreeBSD docs installed on your local system, see:
/usr/share/doc/handbook/handbook50.html
The kernel emulator does have a small overhead, but it is negligible.
If you're interested in the details and don't feel like reading the
source code, search for "overhead" in the freebsd-emulation mailing
list archives (http://www.FreeBSD.org/search/).
Runtime Environment
Dynamically linked Linux binaries expect to have certain libraries
available. Linux has a variety of library sets, such as libc4, libc5,
and glibc2. Additionally, some Linux programs expect to have
particular Linux userland programs available (sh, test, etc.) Because
FreeBSD uses the same codebase as original UNIX, whereas Linux was
written from scratch, these may not be 100% compatible. A selection of
Linux userland utilities can also be helpful, especially when dealing
with closed-source commercial software products.
The dynamic libraries and Linux userland utilities are available as a
port. Look under /usr/ports/emulators/linux_base for the latest stable
version. Install these as you would any other port:
#cd /usr/ports/emulators/linux_base
#make install
The port installs a subset of Red Hat Linux's userland under
/compat/linux.
The original source files (or "distfiles", in FreeBSD parlance) are
quite large. You will probably want to load these from a FreeBSD CD, a
Red Hat CD, or from behind a large Internet circuit. If you're
downloading over a 56 Kb modem, I'd recommend doing this when you
don't plan to use your 'Net connection for several hours. The
linux_base port installs everything under /compat/linux. If you're
curious, do an ls:
#ls
bin boot etc lib mnt proc sbin usr var
#
This looks suspiciously like a subset of the root directory.
/compat/linux contains resources for Linux binaries that expect to
find different resources than those available on a FreeBSD machine.
While it's not chrooted, it's built in a similar manner.
For example, on a Linux machine the file /etc/nsswitch.conf contains
vital configuration information. FreeBSD keeps that information
elsewhere. Any program run under Linux mode will check
/compat/linux/etc for a system config file, and then fall back to
/etc.
Linux Distributions and Emulation
At the moment, FreeBSD's Linux mode is based on Red Hat 5.2. (RedHat
6.0 emulation is in -current, and should be backported to -stable by
the time you read this.) This doesn't mean that you can't use software
designed for other distributions, however.
Using a particular Red Hat distribution simply indicates the level of
Linux kernel and userland library support available in your FreeBSD
system. Red Hat 5.2 uses libc5, glibc2, and Linux kernel 2.0.36.
RedHat 6.0 uses glibc2.1 and kernel 2.2.5. Linux software that will
run under these libraries, and this kernel will work in FreeBSD's
Linux mode.
Running Linux Apps
When you have the linux_base port installed, and kldstat -v shows the
Linux module is running, just run your Linux program from a command
prompt.
Adding Linux Libraries
FreeBSD's install routines and ports system take care of almost all
the ugly details of configuring shared libraries, insulating the
administrator from the majority of these issues. This system does not
cover software from other operating systems running under kernel
modules. Linux systems tend to accumulate shared libraries like pocket
lint. Eventually, you'll need to add additional Linux shared libraries
to your system.
The Linux emulator has its own ldconfig, /compat/linux/sbin/ldconfig,
and its own ld.so.conf file, /compat/linux/etc/ld.so.conf. If you look
at this file, you'll see:
#more ld.so.conf
/usr/X11R6/lib
/usr/i486-linux-libc5/lib
#
These are the directories where the module will look for Linux
libraries, in addition to /lib and /usr/lib. Despite the initial
slash, these directory names are all under /compat/linux. I recommend
installing additional libraries under /compat/linux/usr/local/lib.
Edit /compat/linux/etc/ldconfig.conf to add this path. When you have
large programs that include many libraries of their own, you might
wish to create new directories for those shared libraries. My
/compat/linux/etc/ld.so.conf looks like:
#more ld.so.conf
/usr/local/lib
/usr/local/lib/soffice
/usr/X11R6/lib
/usr/i486-linux-libc5/lib
/usr/openwin/lib
#
Whenever you add new libraries, rerun /compat/linux/sbin/ldconfig.
This rereads the directories in the configuration file and updates the
list of available libraries. Be sure you run
/compat/linux/sbin/ldconfig, and not FreeBSD's /sbin/ldconfig. Not
only will the FreeBSD ldconfig not accomplish what you want, you'll
find yourself either digging through /etc/rc.* scripts to learn how to
properly reconfigure your shared library cache or simply rebooting in
annoyance.
When a Linux program fails because it cannot find a library, check to
be sure you have the library. If you don't have it, call up your
favorite Internet search engine and fetch a copy. Install it in
/compat/linux/usr/local/lib, run Linux ldconfig, and you'll be up and
running.
Alternately, you can use the environment variable LD_LIBRARY_PATH to
tell a shell to check a particular directory for libraries (see man 8
ldconfig). Many problems can be caused by the indiscriminate use of
LD_LIBRARY_PATH, however, so you're better off editing
/usr/compat/linux/etc/ld.so.conf.
Installing Linux Software as FreeBSD Ports
Some Linux software packages are available via FreeBSD's ports system.
One well-known example is WordPerfect 8. If you become root, cd
/usr/ports/editors/wordperfect, and type make, you will get:
#make
===> wordperfect-8.0 'The source to this
port may not be automatically fetched due
to licensing restrictions. You MUST fetch
the source manually after reading and
agreeing to the license at:
http://linux.corel.com/linux8/download.htm
Once GUILG00.GZ has been downloaded, move
it to /usr/ports/distfiles and then restart
this build.'.
#
In this case, FreeBSD's automatic fetch mechanism won't work -
WordPerfect's distribution terms require the user to agree to a
license before downloading. Go to the Web page, accept their terms,
and download WordPerfect. Install the file in /usr/ports/distfiles,
return to /usr/ports/editors/wordperfect, and type make. The port will
automatically install WordPerfect for you.
Linux Packages
One of the tools linux_base installs is Red Hat's RPM. You can use
this to install RPMs on your FreeBSD machine. When using RPMs, you
will want to be certain to install the software under /compat/linux.
Because of FreeBSD's monolithic upgrade procedure (see my article
"Maintaining Patch Levels in Open-Source BSDs, Sys Admin, September
1999), any RPM components that overwrite system components will be
blown away the next time you upgrade. If you overwrite the wrong
files, your system might even become unbootable. To install an RPM,
do:
rpm -i -ignoreos -dbpath /var/lib/rpm -root \
/compat/linux [package]
Add other RPM flags as desired. Of course, RPM packages are completely
separate from FreeBSD's usual package system. Do not expect to be able
to pkg_delete these; you will need to use rpm to handle them.
Be very careful in your use of RPM; if you accidentally overwrite part
of your FreeBSD installation with Linux binaries, you can expect to
find yourself booting off CD-ROM to restore your system. (The Linux
module is good, but not that good.) If you're using a Linux program
built into a FreeBSD package, such as linux_glide, you can use the
standard FreeBSD pkg_add pkgname.
Manual Installations
Even with FreeBSD's excellent package management, some software has to
be installed the hard way, by hand. I'll use Sun's StarOffice 5.1 as
an example. Rather than provide a specific set of instructions on how
to install this particular application, we'll troubleshoot a typical
closed-source, Linux-binary software installation.
You can download StarOffice at www.stardivision.com. A full download
runs about 70 megs, so you might wish to spend the $10 for a CD-ROM.
Copy the file so51a_lnx_01.tar to your home directory and untar it.
After decompressing, cd so51inst/bin and run ./setup. At this point,
you might get a warning about /tmp being full. StarOffice is a huge
office suite. If you run out of space, you will need to repoint your
tmp directory. The easiest way to do this is with the environment
variable $TMPDIR. Point TMPDIR at a directory with a lot of space, and
try again.
You'll see:
#./setup
./setup: Window manager didn't set icon sizes - using default.
/tmp/sv001.tmp/setup.bin: error in loading shared libraries
libvos517li.so: cannot open shared object file: No such file or directory
#
This is a shared library problem, as described above. You can simply
do:
#LD_LIBRARY_PATH=/tmp/sv001.tmp ; export LD_LIBRARY_PATH
Rerun the setup routine. This time, it will open a nice GUI window,
ask you some questions, and install itself. After the install, look in
"Office51/bin" under your home directory. Typing ./soffice& will bring
up StarOffice. I use a simple shell script:
#!/bin/sh
/home/mwlucas/Office51/bin/soffice&
If you are interested in server applications, you should take a look
at "How to run Oracle for Linux on FreeBSD," available at:
http://www.scc.nl/~marcel/howto-oracle.html
Problems
Any number of things can go wrong with a software install, let alone
one running on a platform it wasn't built for. Some programs will
require branding before you can run them. Branding a binary leaves an
ELF comment that the kernel uses to choose an ABI. brandelf
programname will tell you which ABI a program thinks it needs. You can
use brandelf -t linux programname to manually point a binary at the
Linux module. (SysV binaries do not use branding.)
If the program complains about unsupported functions, check your
kernel config. Do you have the POSIX and SysV options configured?
Check kldstat -v to confirm the Linux module is loaded. If the above
fails, your first resource should be the FreeBSD mailing list
archives. Look at:
http://www.FreeBSD.org/search.html
Unless you're the first person in the world to have a problem with
this piece of software, you'll find an archived question about it. The
"questions" and "emulation" archives are excellent places to search.
If the mailing lists archives don't help, send a message to
freebsd-questions@FreeBSD.org. Be sure to give the version of FreeBSD
you have, the version of linux_base you're using, and any and all
details about the program you're trying to run, including any error
messages when you try to run it. If it's an obvious problem, someone
will probably answer you quickly. For more difficult problems, you
might be directed to the freebsd-emulation mailing list.
If you find yourself using Linux emulation more and more frequently,
you would find it worthwhile to subscribe to the freebsd-emulation
mailing list. Email majordomo@FreeBSD.org with a body of "subscribe
freebsd-emulation".
Conclusion
FreeBSD's Linux mode gives FreeBSD users access to a wide variety of
commercial software packages. I encourage you to contact any software
vendor that does not offer a FreeBSD version of a desired program and
let them know you would purchase a native version. Vendors don't
realize that demand exists unless someone tells them. Although good
for your karma, these requests won't help you listen to espn.com's
daily broadcasts on your computer. Combined with the SVR4 and SCO
kernel modules, the Linux module gives you access to almost the entire
range of UNIX software on your FreeBSD box. n
About the Author
Michael Lucas is a networking and FreeBSD consultant working for the
Great Lakes Technologies Group. He lives in Detroit, Michigan with his
wife Liz, four gerbils, and assorted fish. He can be reached at:
mwlucas@exceptionet.com.
The author wishes to thank Marcel Moolenar and Steven Arlow for their
assistance with this article.
===================End==========================
--
|======================+========================+====================|
| 以无法为有法 , | 拳本无法,有法也空; | 我爱GNU/Linux, |
| 以无限为有限 | 一法不立,无法不容。| 因为我爱自由! |
| | | |
| 截拳道宗师-李小龙 | 意拳宗师-王芗斋 | 土人 Linuxrat |
|======================+========================+====================|
※ 来源:·BBS 水木清华站 smth.org·[FROM: 202.112.168.253]
BBS水木清华站∶精华区