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水木清华站∶精华区