BYO Linux 1.0 Text Version (c) 2000, 2001 Jonathan Thorpe Email: jon@byolinux.org This document/howto contains precise instructions of how to Build Your Own Linux personalised distribution. A HTML and Printer friendly HTML as well as other BYO Linux Internet content may be found at: http://www.byolinux.org Contents: 1) Packages required for BYO Linux 2) Making space 3) Writing Lilo.conf 4) Folders and files 5) SysVinit install 6) Bash install 7) Compiling Statically 8) Glibc install 9) Kernel install 10) GCC 2.95.2 Install 11) A few necessities 12) Dynamic install 13) Boot scripts 1) BYO LINUX: PACKAGES In order for you to start your own Linux OS, you will have to download the Required Packages for a basic Linux system. You will also require the Statically Compiled Programs for a little later on when we start putting our Linux OS together. The Optional Packages will provide extra functionality to your Linux. I suggest that once you have your basic Linux system working, decide what sort of functionality is required for your Linux and then download the optional packages. It is a common occorance that some of the links are broken. If so, visit www.freshmeat.net and look for a new download location, but make sure you are downloading the same, or if required, download slightly later versions of the software described. autoconf 2.13 at ftp.gnu.org/gnu/autoconf automake 1.4 at ftp.gnu.org/gnu/automake bash 2.04 at ftp.gnu.org/gnu/bash bin86 0.15.4 at http://www.cix.co.uk/~mayday/bin86-0.15.4.tar.gz binutils 2.10 at ftp.gnu.org/gnu/binutils bison 1.28 at ftp.gnu.org/gnu/bison bzip2 1.0.1 at ftp://sourceware.cygnus.com/pub/bzip2/v100 diffutils 2.7 at ftp.gnu.org/gnu/diffutils e2fsprogs 1.18 at ftp.metalab.unc.edu/pub/Linux/system/filesystems/ext2 fileutils 4.0 at ftp.gnu.org/gnu/fileutils findutils 4.1.5 at ftp://alpha.gnu.org/gnu flex 2.5.4a at ftp.gnu.org/non-gnu/flex gcc 2.95.2 at ftp.gnu.org/gnu/gcc glibc 2.1.3 at ftp.redhat.com/redhat/redhat-6.2/i386/RedHat/RPMS glibc-devel 2.1.3 at ftp.redhat.com/redhat/redhat-6.2/i386/RedHat/RPMS grep 2.4.2 at ftp.gnu.org/gnu/grep groff 1.16.1 at ftp.gnu.org/gnu/groff gzip 1.2.4a at ftp.gnu.org/gnu/gzip kernel 2.4.0 at www.kernel.org [If experiencing problems, use 2.2.18] ld.so 1.9.9 at ftp.metalab.unc.edu/pub/Linux/GCC less 358 at ftp.gnu.org/gnu/less lilo 21.6.1 at ftp.metalab.unc.edu/pub/Linux/system/boot/lilo m4 1.4 at ftp.gnu.org/gnu/m4 make 3.79.1 at ftp.gnu.org/gnu/make man 1.5h1 at ftp.win.tue.nl/pub/linux-local/utils/man mawk 1.3.3 at ftp.whidbey.net/pub/brennan modutils 2.3.17 at ftp.kernel.org/pub/linux/utils/kernel/modutils/v2.3 ncurses 5.1 at ftp.gnu.org/gnu/ncurses patch 2.5.4 at ftp.gnu.org/gnu/patch perl 5.6.0 at www.perl.com/pub/language/info/software.htmll#stable readline 4.1 at ftp.gnu.org/gnu/readline sed 3.02 at ftp.gnu.org/gnu/sed sh-utils 2.0 at ftp.gnu.org/gnu/sh-utils shadow-20000902 at ftp://piast.t19.ds.pwr.wroc.pl/pub/linux/shadow/ sysvinit 2.78 at ftp.metalab.unc.edu/pub/linux/system/daemons/init tar 1.13 at ftp.gnu.org/gnu/tar termcap 1.3 at ftp.gnu.org/gnu/termcap texinfo 4.0 at ftp.gnu.org/gnu/texinfo textutils 2.0 at ftp.gnu.org/gnu/textutils util-linux 2.10 at http://freshmeat.net/projects/util-linux/download/util-linux-2.10r.tar.gz vim 5.7 rt and src at ftp.us.vim.org/pub/vim/unix OPTIONAL PACKAGES: apache 1.3.12 at www.apache.org/dist berkeley db library 3.1.17 at www.sleepycat.com/download.html ed 0.2 at ftp.gnu.org/gnu/ed ipchains 1.3.9 at http://netfilter.filewatcher.org/ipchains jpegsrc v6b at ftp.uu.net/graphics/jpeg kde and qt at ftp://ftp.kde.org/pub/kde/stable/2.0.1/distribution/tar/generic/src/ libtiff 3.5.5 at ftp.onshore.com/pub/libtiff mesalib 3.3 at ftp.mesa3d.org/pub/sourceforge/mesa3d openssl 0.9.6 at ftp.openssl.org/source netkit-combo 0.17 at ftp.metalab.unc.edu/pub/Linux/system/network/netkit net-tools 1.57 at www.tazenda.demon.co.uk/phil/net-tools ppp 2.3.11 at ftp://cs.anu.edu.au/pub/software/ppp procps 2.0.7 at ftp://people.redhat.com/johnsonm/procps rpm 3.0.6 at ftp.rpm.org/pub/rpm/dist/rpm-3.0.x sysklogd 1.4 at ftp.metalab.unc.edu/pub/Linux/system/daemons texk and texklib at ftp.tug.org/tex X401src-1.tgz (2 + 3 also) at ftp.xfree86.org/pub/XFree86/4.0.1/source zlib 1.1.3 at ftp.info-zip.org/pub/infozip/zlib STATICALLY COMPILED PROGRAMS: These programs have been statically compiled as on some systems, the normal method of compiling may not work correctly. M4 at http://www.byolinux.org/files/m4 SED at http://www.byolinux.org/files/sed 2) BYO LINUX: MAKING SPACE In order to complete this project, you could probably get away with 500 megabytes for a minimum project. Obviously the more space, the more goodies. Since you will already be running linux to create this project, you can share the existing swap partition. If you do not currently have a swap but want one, keep reading, it's creation is explained later in this chapter. Let's say you are all filled up with no space left to partition. That's ok because there is a wonderful, free utitlity called fips that will non-destructively repartition your hard drive. Remember to defragment your windows partition first if you plan to use fips there. I am not going to provide directions for this since some pretty good ones already come with it. It's really not that hard to figure out anyways. Now, assuming you have some free, unpartitioned hard drive space, let's get down to business. Load up your origanal linux1 distribution. In this example, we will assume you are using an IDE type hard drive (as opposed to SCSI) and it is the only hard drive on your system. At the linux prompt, type fdisk /dev/hda The 'a' in hda means ide0 - master. If it was a 'b', that would be ide0 - slave. 'c' is ide1 - master. Etc, etc.. That's the way it works in Linux. Now when you see hda1 later, that just means the partition number 1 on the drive located on ide0 - master. See how easy that was? Let's take a look at my screen and explain whats going on a little bit inside this program ------------------------------------- [root@linuxprog /root]# [root@linuxprog /root]# fdisk /dev/hda THe number of cylinders for this disk is set to 1216. There is nothing wrong with that, but this is larger than 1024, 1) software that runs at boot time (e.g., LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK) Command (m for help): _ ------------------------------------- That is what the screen should basically look like after you typed in the command from above. It is slightly misleading regarding the cylinder 1023 limitation because with newer versions of the package lilo, this is no longer a concern. You can safely ignore this if you are running a newer distribution, but it may be a concern now while we are creating this if you are using an older version. Basically, it just means that everything in the /boot directory likes to be below cylinder 1023 on older Linux distributions. If you fall into this category, you are probably going to want to limit your partition to below cylinder 1023 (we'll get to making them in a minute). Now, to see what partitions are on you hard drive, type p. You will get a screen that looks something like this. ------------------------------------- [root@linuxprog /root]# [root@linuxprog /root]# fdisk /dev/hda THe number of cylinders for this disk is set to 1216. There is nothing wrong with that, but this is larger than 1024, 1) software that runs at boot time (e.g., LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK) Command (m for help): p Disk /dev/hda: 255 heads, 63 sections, 1216 cylinders Units = cylinders of 16065 * 512 bytes Device Boot Start End Blocks Id System /dev/hda1 * 1 259 2072353 o Win95 FAT32 /dev/hda2 259 516 2072385 83 Linux /dev/hda3 517 700 1477980 83 Linux /dev/hda4 701 708 64260 82 Linux swap Command (m for help):_ ------------------------------------- If you noticed, partition 1 on my drive is windows, partition 2 is linux, partition 3 is also linux, and partition 4 is the linux swap. One nice thing, these are all primary partitions. Linux allows 4 primary partitions where dos/win only allows 1. One linux partition is for the new distro we are making and the other is my other distro that's used to create the new distro Ok, let's get back to that fdisk we started running a few paragraphs ago To begin creating partitions, type n at the fdisk prompt. It will ask you whether this will be a primary partition. Choose p for primary. Next it will ask you the partition number. Make one partition for linux and one for swap (if you don't already have a swap partition from your existing linux distribution). If by some chance you need/want to remove a partition, type d and then enter the partition number. If you really mess this up at anytime, type q at the prompt to quit fdisk without saving. This is serious stuff here so make sure you get it correct (not that it will damage the computer but you could wipe out the contents of your hard drive if you mess up). Now type p again to view what you have done. Nothing is saved yet so don't worry. How's it looking? Now, if you notice in the illustration above, my linux swap partition has a different id number. It is 82 as opposed to 83 (which yours will say if you just created this partition). At the prompt, type t to toggle the number. It will ask you the partition number. Enter whatever partition it happens to be. When it asks for the code, simply type 82 and select enter. Type p at the prompt to confirm all looks well. If all is looking well, the final thing to do is type w to write the partition(s) as well as quit the fdisk program. The fdisk program may recommend you reboot the computer, if it does, do it. Let's make the filesystems on these new partitions. This is the equivalent of formatting the drive if it were a dos/windows partition. If you have created your own swap partition because it didn't exist on your existing Linux distro, you will need to type mkswap -c /dev/hda4 at the prompt to create the swap filesystem. You substitute the proper hda number for the correct partition. For the Linux partition, type mke2fs /dev/hda2. Again, you substitute the proper hda number. When you invoke the mke2fs command, the hard drive will churn for a few seconds and some fancy numbers will come up on the screen. When it returns you to the prompt, congratulations, you have a working filesystem on your hard drive ready to accept directories and files. Now let's fish around your new linux2 filesystem to be sure it works (not that there is much to see). Before we are able to mount it, you'll need to create a directory in your /mnt directory on linux1 for this partition. I created one called linux2 and you should call yours the same to help keep us together for the rest of the project. We'll be using this directory quite a bit so go ahead and make it by typing mkdir /mnt/linux2. Now, mount the Linux filesystem you just created like you would any other device on your system. For example, type mount /dev/hda2 /mnt/linux2 where /mnt/linux2 is the directory you just created and /dev/hda2 a Linux partition you created earlier (again, substitute the proper hda number for your setup). After it is mounted, type cd /mnt/linux2 to go there. Type ls to have a look around. The only thing you might notice (maybe not) is a directory in there called 'lost+found'. We don't really need this directory so type rmdir /mnt/linux2/lost+found to get rid of it if you like. Now the filesystem is empty. If you have made it this far, I promise that you have the necessary skills to complete this project. This chapter was truly the most difficult part. 3) BYO LINUX: Configuring LiLo Boot Loader Hopefully, you are familiar with how to edit text files with vi because that's what I use. It's not difficult to use but it's a little strange to get used to. If you are going to be using another editor, that's fine too. If you want to try vi, type man vi at your prompt to read how to use it. We need to update the /etc/lilo.conf file on your running linux1 system. Type vi /etc/lilo.conf at the prompt to begin editting the file. Here is what mine looks like. ------------------------------------- boot=/dev/hda map=/boot/map install=/boot/boot.b prompt timeout=50 default=linux image=/boot/vmlinuz label=linux read-only [-=*EXISTING LINUX DISTRO*=-] root=/dev/hda3 other=/dev/hda1 label=win [-=*WINDOWS*=-] image=/boot/vmlinuz label=linux2 read-only [-=*YOUR BYO LINUX DISTRO*=-] root/dev/hda2 ------------------------------------- Notice the part that I added is circled. If your new Linux system's partition is not on /dev/hda2, change the wording to where it is located. The 'label=linux2' means you will type linux2 at the boot prompt during bootup. vmlinuz is the name of my kernel. It's also the name of my kernel for my linux1 distribution. This is very important that these names match (at least at first), otherwise lilo (the bootloader program) won't work. Basically, just use the same name for your new kernel as you are using now in your existing linux1 setup. You will be copying that kernel over in a later chapter, but don't worry, we'll be making a new kernel soon anyways. Now, save and exit vi by typing : followed by wq followed by 'enter'. Type lilo -v at the prompt to update the boot loader. Lilo should not report any errors, it should just say that it added the filesystems. It's really as simple as that. If you have ever made your own kernel before (we'll discuss that in later chapters), it's one of the exact same steps. 4) BYO Linux: Folders and Files Now, let's populate our new filesystem with a few folders and files. Make sure your linux2 partition is still mounted (however, you are still in linux1). If you haven't rebooted, it will still be. Goto that directory by typing cd /mnt/linux2 Type the following (be careful of spelling, and again, make sure you are mounted): ------------------------------------------------------------- mkdir bin boot etc home lib mnt proc root sbin tmp usr var ------------------------------------------------------------- Next, go into your newly made /usr directory by typing cd /mnt/linux2/usr Make the following directories inside this directory by typing: ------------------------------------------------------------- mkdir bin include man sbin share src ------------------------------------------------------------- Next, go into your newly made /usr/man directory by typing: ------------------------------------------------------------- cd /mnt/linux2/usr/man ------------------------------------------------------------- Make the following directories inside this directory by typing: ------------------------------------------------------------- mkdir man1 man2 man3 man4 man5 man6 man7 man8 ------------------------------------------------------------- Next, go into your newly made /usr/share directory by typing ------------------------------------------------------------- cd /mnt/linux2/usr/share ------------------------------------------------------------- Make the following directories inside this directory by typing: ------------------------------------------------------------- mkdir aclocal autoconf automake ------------------------------------------------------------- Next, type the following to create another directory: ------------------------------------------------------------- mkdir /mnt/linux2/var/run ------------------------------------------------------------- Now, the only directory we are missing is the /dev directory. The easiest way to make this as well as populate it is to copy it from your existing distribution. We could make it from scratch with the mknod command, but it will give you the same output as copying it plus it takes a while. So, at the prompt, type cp -dpR /dev /mnt/linux2. The -dpR will keep order in this directory, preserve permissions, and not attempt to read the files while copying (this has a nasty habit of locking up the system - and yes, that is a space after /dev). Feel free to prune out this directory by deleting un-needed devices if you know what these devices are. Now, let's copy the kernel from your existing linux1 distribution to the new linux2 distribution. It's normally located in the /boot directory and that is where you should put it in the new distribution to maintain linux file hierarchy standards. Type cp /boot/vmlinuz /mnt/linux2/boot. You substitute whatever the name of your kernel is for vmlinuz - Again, don't worry, we will be making our own kernel in a future chapter. Next, we need to copy the /etc/passwd and the /etc/group file from your existing system to the new system. These are your password and group belonging files. But, BEFORE we can do that, we need to determine weather or not your system is using shadow passwords or not. If it is, we need to temporarily disable it for the copy. The easiest way to check this is to open up your /etc/passwd file with vi. Here's what mine looks like (and yes, I changed the password for this purpose!): ------------------------------------------------------------- root:$1$62$23sdfl121$34023gdfg$ ------------------------------------------------------------- Now go ahead and copy them over to /mnt/linux2/etc Now, let's re-enable your shadow passwords by typing the following ------------------------------------------------------------- pwconv grpconv ------------------------------------------------------------- Now that these files are copied over, edit them both and get rid of everything except for the first line that contains the stuff for root. Go ahead and save. 5) BYO LINUX: SysVinit Next, we are going to compile and install SysVinit. The init program is the very first file that is loaded into linux after the kernel boots into memory. It also always has process id number 1. This would be a good place for us to start. Your linux2 system should still be mounted. Go ahead and unzip sysvinit by typing gzip -d filename.tar.gz You substitute whatever the filename is. Next, untar it by typing tar -xvf filename.tar Again, substitute the filename, this time without the .gz extension but with the .tar extension. Now, go into the /src directory of this package. Find a file in there called Makefile - we need to edit this so fire up vi. On the very first line, add the following to the text file: ROOT=/mnt/linux2 Next, go to the last 4 lines of this file. Precede every /dev by $(ROOT) --------------------------------------------------------------- @if [! -p $(ROOT)/dev/initctl ]; then \ echo "Creating $(ROOT)/dev/initctl" \ rm -f $(ROOT)/dev/initctl; \ mknod -m 600 $(ROOT)/dev/initctl p; fi --------------------------------------------------------------- It may be hard to see, but there is a space before every $. Save and exit vi. Make sure your linux2 filesystem is mounted. Type make LDFLAGS=-static followed by make install Linux will complain about a missing /usr/share/man directory, this is normal. The directory doesn't exist yet. Actually, it will be a symlink to another directory later. Don't worry, we'll be re-installing this package again dynamically later and the error will be taken care of. You just compiled and installed your first package into your new system, congratulations! Next, we need to write a quick, temporary, /mnt/linux2/etc/inittab file. Fire up vi again and copy what I have below. --------------------------------------------------------------- id:S:initdefault: ~~:S:wait:/sbin/sulogin z6:6:wait:/sbin/sulogin 1:2345:respawn:/sbin/sulogin --------------------------------------------------------------- Go ahead and save that. 5) BYO Linux: Bash Install The last package we'll be installing before we can give this sucker a boot for the first time is 'bash'. This is what is known as a shell. It's kind of like windows command.com There are many shells available for linux, but this is the standard. It's also refered to as 'sh' sometimes. Unpack the archive just like you did in the last chapter with gzip and tar. Go into the bash directory that was just created and type ---------------------------------------------- ./configure --enable-static-link ---------------------------------------------- Now type ---------------------------------------------- make ---------------------------------------------- Copy the file bash to /mnt/linux2/bin Now, we are ready for a test run into the new system. Reboot the computer. At the lilo boot prompt, type linux2. If all goes well, linux will boot up and ask you for your password. Type in whatever your password is from the system you copied the passwd file from. You should see a bash prompt. If you are there, congratulations! If not, you better re-read and make sure all was done correctly. The only thing you are able to do now is issue a reboot -f command to reboot the system back to linux1. 6) BYO LINUX: Compiling Statically Make sure you are in your normal, linux1 system and linux2 is mounted. All these files will be made here and copied to the new system. This is going to be a long chapter. There are so many different distributions out there with so many different libraries and so many different compilers, it's taken me alot of tinkering in order to come up with something that everybody should be able to use. Two of the packages needed, m4 and sed, will not currently compile statically. When you get to these packages, just click the links and download them from me already prebuilt. Alot of code needed to be re-written in order for them to compile statically so just get them from me. They will compile dynamically later just fine. Hopefully, there authors will re-write these packages in the future. If you're downloading these in MS Windows, make sure they are saved or renamed in all lowercase letters if necessary. We talked a bit about static vs. dynamic compiling in 'Getting started', let's just hit the fine points for those that don't understand the difference. Linux (as well as windows) can make use of what's called dynamic libraries. These are also known as shared libraries. In linux, they are usually located in the /lib directory. In windows, these are the .dll files in the system directory. Without dynamic libraries, the library would have to be compiled into the program itself. This can be done (and we will at first), but, the disadvantages are the program is bigger and takes up more memory. Alot of programs require the exact same library, so, why load that library more than one time? Get the point? It would be a waste of resources. Now, since we don't have a library on our new system to start with, we have to make these programs statically just to get the computer to boot. We already did this twice in 'SysVinit' and 'Bash'. Once we are all done installing these 17 packages, we will install the libraries and compiler, THEN recompile the packages dynamically. This will also put the man files (help files), etc.. in there correct folders. Basically, I'm going to present the proper way to compile these packages statically now. If your not sure if you compiled your binary correctly, go to the directory of its location and type ldd filename and it will tell you if it's static or requires libraries. Also, if your wondering, these 17 'required' packages are the packages that will allow you to install other packages as a free standing system. You'll notice that many of the packages have the configure option --disable-nls because my system does not have NLS (National Language Support) installed. If you speak english and do not need any other language support, this may be appropriate for you. My suggestion is to try all these packages first without using that option and see if they compile. If they don't compile, add that option in and try again. You need to create a directory to store all the files you've downloaded as well as unpacked on your existing system. I created a directory in /root called /origanals for lack of a better name. I suggest you do the exact same thing because we'll need to make static links to this directory for the compiler installation. Trust me, just make a directory called /root/origanals and save all your downloads there. We'll just take these in alphabetical order. 'Required packages' has the location of where I downloaded all these files. AUTOCONF: -This package produces shell scripts whhich automatically configure the source code in packages you install -Unpack the autoconf zip/tar file -Go into the directory and configure itt by typing ./configure -Compile it by running make -Copy: autoconf, autoheader, autoreconff, autoscan, autoupdate, and ifnames to /mnt/linux2/usr/bin -Copy all *.m4 and *.m4f files to /mnt//linux2/usr/share/autoconf by typing cp *.m4* /mnt/linux2/usr/share/autoconf -Copy: acconfig.h, acfunctions, acheadeers, acidentifiers, acmakevars, and acprograms to /mnt/linux2/usr/share/autoconf AUTOMAKE: -This package generates the 'Makefile.iin' file for use with autoconf -Unpack the automake zip/tar file -Go into the directory and configure itt by typing ./configure -Copy aclocal and automake to /mnt/linuux2/usr/bin -Copy: acinstall, config.guess, config..sub, elisp-comp, install-sh, mdate-sh, missing, mkinstalldirs, and ylwrap to /mnt/linux2/usr/share/automake -Copy all *.am files to /mnt/linux2/usrr/share/automake -Go into the /m4 directory and copy alll *.m4 files to /mnt/linux2/usr/share/aclocal BINUTILS: -Unpack the binutils zip/tar file -Go into the directory and configure itt by typing ./configure --disable-nls -Compile it by running make LDFLAGS=-alll-static -Go into the /gas directory and copy ass-new and gasp-new to /mnt/linux2/usr/bin -Rename the files in /mnt/linux2/usr/biin to as and gasp (remove the -new) -Next go into the /ld directory and coppy ld-new to /mnt/linux2/usr/bin -Rename the file in /mnt/linux2/usr/binn to ld (remove the -new) -Next go into the packages /binutils diirectory and copy: addr2line, ar, nm-new, objcopy, objdump, ranlib, size, strings, and strip-new to the /mnt/linux2/usr/bin directory. -Rename the files in /mnt/linux2/usr/biin to nm and strip (remove the -new) FILEUTILS: -Basic files used in the OS for copyingg, making directories, etc.. -Unpack the fileutils zip/tar file -Go into the directory and configure itt by typing ./configure --disable-nls -Compile it by running make LDFLAGS=-sttatic -Copy from the /src directory: chgrp, cchmod, chown, cp, dd, df, dir, dircolors, du, ln, ls, mkdir, mkfifo, mknod, mv, rm, rmdir, sync, touch, vdir to /mnt/linux2/usr/bin -Copy ginstall to /mnt/linux2/usr/bin aand rename to install FINDUTILS: -This package helps you find the locatiion of files on the system -Unpack the findutils zip/tar file -Go into the directory and configure itt by typing ./configure -Compile it by running make LDFLAGS=-alll-static -Copy from the /find directory the findd file to /mnt/linux2/usr/bin -Copy from the /xargs directory the xarrgs file to /mnt/linux2/usr/bin GREP: -Unpack the grep zip/tar file -Go into the directory and configure itt by typing ./configure --disable-nls --without-included-regex -Compile it by running make LDFLAGS=-sttatic -Copy from the /src directory: egrep, ffgrep, and grep to /mnt/linux2/usr/bin GZIP: -Unpack the gzip zip/tar file -Go into the directory and configure itt by typing ./configure -Compile it by running make LDFLAGS=-sttatic -Copy the gzip file to /mnt/linux2/bin LD.SO: -Unpack the ld.so zip/tar file -Go into the /util directory -Compile ldd by running make ldd -Compile ldconfig by running make ldconnfig -Copy ldd to /mnt/linux2/usr/bin -Copy ldconfig to /mnt/linux2/sbin M4: -Had trouble compiling, download this ffile (if you haven't already from www.byolinux.org/files/m4) to /mnt/linux2/usr/bin MAKE: -This package determines which pieces oof a program need to be re-compiled and issues commands to re-compile them -Unpack the make zip/tar file -Go into the directory and configure itt by typing ./configure -Compile it by running make LDFLAGS=-sttatic -Copy make to /mnt/linux2/usr/bin MAWK: -Unpack the mawk zip/tar file -Go into the directory and configure itt by typing ./configure -Compile it by running make CFLAGS="-O -static" -Note that -O is not a zero -Copy mawk to /mnt/linux2/usr/bin SED: -Unpack the mawk zip/tar file -Go into the directory and configure itt by typing ./configure -Compile it by running make CFLAGS="-O -static" -Note that -O is not a zero -Copy mawk to /mnt/linux2/usr/bin SH-UTILS: -This package contains shell programminng utilities -Unpack the sh-utils zip/tar file -Go into the directory and configure itt by typing ./configure --disable-nls -Compile it by running make LDFLAGS=-sttatic -Copy from the /src directory: basenamee, date, dirname, echo, env, expr, factor, false, groups, id, logname, nice, nohup, pathchk, printenv, printf, pwd, seq, sleep, stty, su, tee, test, true, tty, uname, uptime, users, who, whoami, and yes to /mnt/linux2/usr/bin -Copy from the /src directory the chrooot file to /mnt/linux2/sbin TAR: -Unpack the tar zip/tar file -Go into the directory and configure itt by typing ./configure --disable-nls -Compile it by running make LDFLAGS=-sttatic -Copy from the /src directory the tar ffile to /mnt/linux2/usr/bin TEXINFO: -This package generates some printed maanuals -Unpack the texinfo zip/tar file -Go into the directory and configure itt by typing ./configure --disable-nls -Compile it by running make LDFLAGS=-sttatic -Copy from the /makeinfo directory the makeinfo file to /mnt/linux2/usr/bin TEXTUTILS: -Unpack the textutils zip/tar file -Go into the directory and configure itt by typing ./configure --disable-nls -Compile it by running make LDFLAGS=-sttatic -Copy from the /src directory the cat ffile to /mnt/linux2/bin -Copy from the /src directory: cksum, ccomm, csplit, cut, expand, fmt, fold, head, join, md5sum, nl, od, paste, pr, sort, split, sum, tac, tail, tr, unexpand, uniq, and wc to /mnt/linux2/usr/bin UTIL-LINUX: -Unpack the util-linux zip/tar file -Go into the directory and configure itt by typing ./configure -Go into the packages /lib directory heere and type make -Go into the packages /mount directory and compile it by running make LDFLAGS=-static -Copy from the /mount directory: losetuup, mount, swapon, and umount to /mnt/linux2/sbin -Go into the packages /login-utils direectory and compile it by running make LDFLAGS=-static -Copy from the /login-utils directory tthe agetty file to /mnt/linux2/sbin MAKING A BACKUP: Ok, let's save all your hard work to this point. On your linux1 system goto /mnt/linux2. Type the following: -------------------------------------- tar cvf backup1.tar * -------------------------------------- This will make a backup of the contents of the /mnt/linux2 directory called backup1.tar You should also compress this file with gzip because it's huge by typing: -------------------------------------- gzip backup1.tar -------------------------------------- Move this file off of linux2 afterwards to where you keep your downloaded files on linux1 8) BYO LINUX: Glibc Install Next, we are going to install glibc (aka GNU C library). But first, we need to create a 'fstab' file so we will be able to mount the system in read-write mode. Make sure you are in your original, linux1 system and linux2 is mounted. Type vi /mnt/linux2/etc/fstab and type the following. -------------------------------------------------------- /dev/hda2 / ext2 defaults 0 1 /dev/hda4 none swap sw 0 0 proc /proc proc defaults 0 0 -------------------------------------------------------- You substitute the proper locations for your new linux system as well as your swap location. Save this file. The glibc install will be a 2 part install. We need the actual libraries as well as the developement libraries in compiled format. These are the only packages that we are using that are already compiled. In the 'Required Packages' chapter, I used Redhat's latest glibc RPM BINARIES and glibc-development RPM BINARIES. I'm going to use a program called 'alien' that I got from linux.tucows.com to convert these RPM files to a normal tar/zip file. It works by typing the following: -------------------------------------------------------- alien -t filename.rpm -------------------------------------------------------- Note: The alien package requires the cpio package to be installed. Now that you have the files in the .tgz format, you can run gzip -d on them to put them into tar format. Copy these tar files to /mnt/linux2, right there in the main directory. NOTE: I called it the main directory instead of the root directory. I just didn't want anyone to confuse it with the /root directory. Next, boot up the linux2 system. Do a cd / to get to the main directory. You should see your normal folders there along with your glibc tarfiles. Mount this system in read/write mode by typing mount -n -o remount,rw / Do a tar -xvf glibc-2.1.3.tar (or whatever the name of your file is) to place the lib files where they belong. Do a tar -xvf on the development tar file as well. Type ldconfig -v to link everything up correctly. Now you have working libraries, the latest ones also. Remove the tarfiles. Create the following directory symlinks: -------------------------------------------------------- ln -s /etc /usr/etc ln -s /usr /usr/local ln -s /var /usr/var ln -s /usr/man /usr/share/man -------------------------------------------------------- Create the following file symlinks: -------------------------------------------------------- ln -s /bin/bash /bin/sh ln -s /usr/bin/mawk /usr/bin/awk ln -s /sbin/agetty /sbin/getty ln -s /sbin/swapon /sbin/swapoff 9) BYO LINUX: Kernel Install You should still be inside the linux2 system with it mounted. Create a directory called linux1 by typing mkdir /mnt/linux1 Next, mount the linux1 system from linux2 by typing mount /dev/hda3 /mnt/linux1 (You substitute hda3 for where your normal linux1 system is). You substitute hda3 for where your normal linux1 system is. Now, we are going to install the kernel source. Copy the downloaded kernel tar file from linux1 to /usr/src on linux2. Note, I'm not interested in actually making a new kernel now, I just want to get a few symlinks setup that are necessary for the next chapter. Compiling a false kernel is just a sneaky way of doing so. I guess that's what I get for reading directions every now and then because that's where I learned this trick. Unpack the tar file. Remove the tar file from /usr/src Now, let's create some necessary symlinks. Change directories to /usr/include then type the following: ------------------------------------------------- ln -s ../src/linux/include/asm asm ln -s ../src/linux/include/linux linux ------------------------------------------------- Now, assuming you copied the m4 and sed file from me earlier, go to the /usr/bin directory and change the permissions of these files to make them executable by typing the following: ------------------------------------------------- chmod 755 m4 chmod 755 sed ------------------------------------------------- Next, goto /usr/src/linux and type make config Answer n to as many questions as possible. This will setup the rest of the symlinks automatically. That's all we are doing for the kernel for now, we'll remake the kernel for real in a later chapter. TIME FOR ANOTHER BACKUP: Ok, let's save all your hard work to this point again. We'll need to boot back to Linux1 but first, let's unmount everything. Do a cd / to get to the root directory. Next, type umount /mnt/linux1. Next, type mount -o remount,ro /. Now go ahead and issue a reboot -f. This will reboot you. Once your back in Linux1, mount linux2 and goto the /mnt/linux2 directory. Type the following: ------------------------------------------------- tar cvf backup2.tar * ------------------------------------------------- This will make a backup of the contents of the /mnt/linux2 directory called backup2.tar You should also compress this file with gzip because it's huge by typing: gzip backup2.tar Move this file off of linux2 afterwards to where you keep your downloaded files on linux1. 10) BYO LINUX: GCC 2.95.2 Install Next, we will be installing GCC 2.95.2 as our default compilers. It's interesting to note that with the release of 2.95.2, many compilers such as c, c++, fortran and others have been included in the package whereas older gcc compilers were only c compilers. This first install will be a static install. We'll re-install dynamically later. You should still be in Linux1 after you backed everything up in the last chapter. Goto the place your gcc-2.95.2 package is and unpack it there. Mine is in /root/origanals. Wherever it is, you will need to remember it's location later in order to create a symlink to it on linux2. Next, go into that gcc-2.95.2 directory and type the following: ----------------------------------------------------- ./configure --enable-shared --disable-nls ----------------------------------------------------- ----------------------------------------------------- make CFLAGS='-g -O2 -static' bootstrap (this will take about 30 minutes) ----------------------------------------------------- (Note: That's an O2, not a zero two) Next, reboot to linux2 and mount the system read-write. Mount linux1 as well. Since my GCC package was located in /root/origanals on linux1, I need to create a symlink on linux2. Type the following: ----------------------------------------------------- mkdir /root/origanals cd /root/origanals ln -s /mnt/linux1/root/origanals/gcc-2.95.2 gcc-2.95.2 (and yes, that is a space between the 2 and the g). ----------------------------------------------------- Next, goto /mnt/linux1/root/origanals/gcc-2.95.2 and type ----------------------------------------------------- make install ----------------------------------------------------- Ignore any errors regarding a clock skew. Next, a few symlinks are necessary. Type the following: ----------------------------------------------------- ln -s /usr/bin/gcc /usr/bin/cc ln -s /usr/bin/cpp /lib/cpp ----------------------------------------------------- Remove the origanals directory and the symlink inside by typing rm -r dirname where dirname is the name of the directory. Remain in this distribution now, linux1 is no longer necessary except to access the downloaded packages. 11) BYO LINUX: A Few Necessities These packages should be compiled in the order shown DIFFUTILS: The diffutils package compares files by showing line by line changes in multiple formats. Unpack it and type the following: ./configure make make install BISON: This package is what is known as a parser generator. Unpack it and type the following: ./configure make make install PERL: Next, unpack and type the following: ./Configure -d make (this will take about 10 minutes) make install NCURSES: The ncurses package is required to install vim. It displays and updates text on a text only terminal. Unpack ncurses and then type the following in that directory: ./configure --with-shared make make install VIM: Vim is your text edititor. Vim itself comes in two packages, a src and a rt package. Create a folder and put both of these packages in it. Untar them there. It will produce one vim folder where everything is located. Go into that folder and type the following: ./configure make make install Create a symlink in /usr/bin to link vi to vim. Here's a tip I got from the vim faq to make vim operate more like you may be used to. Create a file called /root/.vimrc and put the following two lines in there: set nocompatible set bs=2 TERMCAP: Next, install the termcap library. Unpack it and type the following: ./configure make make install READLINE: Next, install the readline library. Readline maintains a list of previously typed commands for easy recall by pressing the up arrow button. Unpack it and type the following: ./configure make shared make install make install-shared ldconfig -v FLEX: Next, install flex. Unpack it and type the following: ./configure make make install LESS: Next, install less. Less enables you to show a screen at a time and will allow you to scroll backwards. Less is sometimes referred to as a pager. Unpack it and type the following: ./configure make make install MODUTILS: Next, install modutils. Unpack it and type the following: ./configure make make install Make a /lib/modules/X.X.XX directory (you substitue the proper kernel version number for X.X.XX). Finally, do a depmod to generate the modules dependency file (this file will be automatically placed in /lib/modules/X.X.XX) which will be necessary later. E2FSPROGS: Next, install e2fsprogs. These are the utilities used for checking the integrity of the hard drive and the filesystem for corruption. Unpack it, create a directory in the source directory called build and go into that directory. Type the following: ../configure (NOTE: Two periods) make Make this temporary symlink ln -s /usr/bin/rm /bin/rm make install Remove the symlink BIN86: Next, we'll install 2 files from this package. This package is necessary for lilo to compile. Unpack it and do the following: Go into the packages /as directory and type make as86 Copy the as86 file to /usr/bin Next, go into the packages /ld directory and type make ld86 Copy the ld86 file to /usr/bin LILO: Next, install lilo. This is your boot loader that chooses which OS to start at boot time. Unpack it and type the following: make make install Do not type /sbin/lilo as it says to, we don't have a /etc/lilo.conf file on the new system and won't until we are ready to say goodbye to the old system. WARNING! If you are installing lilo 21-5 or higher, you MUST install this on your linux1 system as well. They are NOT compatible and you WILL run into problems later updating the bootloader between the two distributions! Use the same instructions as above but go ahead and type lilo on linux1 after you have installed it. GROFF: Next, install groff. This is a text formatter. Unpack it and type the following: ./configure make make install MAN: Next, install man. This is the man page reader used to invoke help documentation that comes with each package that is installed. Unpack it and type the following: ./configure -d (Ignore the message about various decompressors missing) make make install Next, install the shadow password suite. This is installed for better password security plus it comes with many useful tools for user administration. The most current shadow password suite is always named shadow-current when downloading. After unpacking the archive you will notice the directory name is a date. They use a date as the version number. After the archive is unpacked, type the following inside the packages directory: ./configure make make install pwconf grpconv Go into the packages /etc directory and copy the file login.defs.linux to the /etc directory. Rename this file to login.defs Next, use vi to edit this file. Find a field in there called MAIL_CHECK_ENAB and change the yes to no If you would like, create a file with vi called /etc/issue and you can put a bootup message of your choice in there that a user will see just before the login prompt. That's it, you now have a system running shadow passwords. (Note: pwconv and grpconv can be ran inside any directory) PATCH: This program is optional. It can patch source code to a newer version so you don't have to download a lengthy new package if it was just a minor bug fix. This is useful for new kernel versions. Unpack the archive and type: ./configure make make install BZIP: This is a different zipper program. It's popularity is increasing so it's being included. Unpack the archive and type: make make install 12) BYO Linux: Dynamic Install Now, let's re-install dynamically the packages we made statically before. You will have to delete all the package folders and unzip them again to make them fresh. Remaking these packages dynamically will make the system CONSIDERABLY smaller. The following packages get the standard ./configure make make install -Binutils -Find Utils -Grep -M4 -Make -Mawk -Sed -Tar These next packages need special attention GCC 2.95.2: ./configure --enable-shared make make install ldconfig BASH: ./configure --with-installed-readline make -Find the file called Makefile and editt the variable bindir to read bindir = /bin make install FILE UTILS: ./configure make -Find the file called Makefile and editt the following variables: bindir to read bindir = /bin sbindir to read sbindir = /sbin sysconfdir to read sysconfdir = /etc localstatedir to read localstatedir = /var make install Next, move the /usr/bin/rm file to /bin GZIP: ./configure make -Next, edit the Makefile to replace thee variable bindir with /bin as described above make install SH-UTILS: ./configure make make install Next, move the /usr/bin/echo file to /bin SYSVINIT: Go into the packages /src directory make Next, edit the Makefile and look for a line that begins with install: Remove sulogin from the Makefile (shadow passwords installs there own version). make install TEXINFO: ./configure make make install Create a symlink that links /usr/bin/makeinfo /usr/bin/tex TEXUTILS: ./configure make make install Move the cat file from /usr/bin to /bin UTIL-LINUX: WARNING: Don't be tempted to install the entire package, it will break linux ./configure Go into the packages /lib directory and run make Next, go into the /disk-utils directory and run make mkswap and make fdformat Copy mkswap to /sbin Copy fdformat to /bin Copy mkswap.8 and fdformat.8 to /usr/man/man8 Next, go into the /fdisk directory and run make fdisk and make cfdisk Copy both of these to /sbin Copy fdisk.8 and cfdisk.8 to /usr/man/man8 Next, go into the /login-utils directory and run make agetty Copy agetty to /sbin Copy agetty.8 to /usr/man/man8 Next, go into the /mount directory and run make Copy mount, umount, swapon, and losetup to /sbin Copy all *.8 files to /usr/man/man8 Next, go into the /sys-utils directory and run make dmesg and make rdev and make ctrlaltdel Copy dmesg to /bin and rdev to /sbin and ctrlaltdel to /bin Copy all *.8 files to /usr/man/man8 Create symlinks that link rdev to swapdev, ramsize, vidmode, and rootflags in the /sbin directory Next, go into the /text-utils directory and run make more MOREHELPDIR=/usr/share/more (all one line) Copy the more file to /usr/bin Copy the more.1 file to /usr/man/man1 Do a mkdir /usr/share/more and copy the more.help file there Now let's get the clock working: Go into the /clock directory and run make hwclock Copy the hwclock file to /sbin Copy the hwclock.8 file /usr/man/man8 Type chmod a=rx,u=s /sbin/hwclock (this sets the UID bit to root) Next, type tzselect and follow the prompts to get your timezone information Use vi to create the /etc/profile file and add the following in there: hwclock --localtime --hctosys TZ='Africa/South_Africa'; export TZ (You substitute the exact wording of the timezone it outputed when you ran tzselect. If you can't read it clearly, that is a semicolon after the quote mark.) 13) BYO LINUX: Boot Scripts This is the final chapter in the base system. I considered just mixing this chapter in when we installed sysvinit dynamically, but I can see that over time, it will need modifications depending on the software that is installed. We'll just be doing a minimal install of the scripts for now, basically everything necessary to be able to log in as a user and automatically mount the root, proc and swap file systems as well as unmount them at shutdown. Also, you will finally be able to execute the shutdown command like normal. First, go back into the sysvinit package. Go into the /debian/etc folder. Copy everything inside this folder into your /etc folder on the linux2 system by typing cp -dpR * /etc Next, go into your /etc/init.d folder on your linux2 system. Find a file in there called rcS. We'll need to edit this file with vi. Find a line in there that reads [ -d /etc/rc.boot] && run-parts /etc/rc.boot and put a # in front of it to comment it out. Also, on the very last line of this file, you can add a line that says hostname NAME where NAME is whatever you want your computer to be called (BYOLINUX always looks nice). Save this file. In this same folder, find a file in there called sendsigs. Use vi to edit this file as well. There are 4 lines in there that begin with the word echo. Comment these out as well. The reason for this is that bash says these same comments so it would be showing up on your screen twice. Feel free to see for yourself if you want, or even change what the scripts are saying. I prefer just to let bash do the talking. Next, go back in the sysvinit package. Go into the /debian/examples directory and copy a file called default.rcS to your /etc/default folder on the linux2 system and rename it to rcS. Also from this folder, copy bootlogd, network, and powerfail to /etc/init.d Next, we need to create symlinks to the files in /etc/init.d to the appropriate runlevel directories. This is how linux knows what to load up at bootup as well as what to do at shutdown or reboot depending on what runlevel is selected. First, goto /etc/rc6.d and type the following: ------------------------------------------------------------ ln -s /etc/init.d/sendsigs S80sendsigs ln -s /etc/init.d/umountfs S90umountfs ln -s /etc/init.d/reboot S99reboot ------------------------------------------------------------ Next, goto /etc/rc0.d and type the following: ------------------------------------------------------------ ln -s /etc/init.d/sendsigs S80sendsigs ln -s /etc/init.d/umountfs S90umountfs ln -s /etc/init.d/halt S99halt ------------------------------------------------------------ Next, goto /etc/rcS.d and type the following (these generally load up no matter what runlevel your going to in /etc/inittab): ------------------------------------------------------------ ln -s /etc/init.d/checkroot.sh S10checkroot.sh ln -s /etc/init.d/checkfs.sh S20checkfs.sh ------------------------------------------------------------ Next, create a /var/log directory. Next, at the prompt, type touch /var/run/utmp and touch /var/log/wtmp This creates a zero byte file that will be written to later. Linux will complain without these files. This next step is completely optional but I think it looks good, lets change the way the ls command shows you directories and files. Use vi to edit the /etc/profile file. Add the following line: ------------------------------------------------------------ alias ls='ls --color=auto' ------------------------------------------------------------ From now on (after your next reboot), files, directories, and symlinks will be shown in different colors. Essentially, this is the end of the project as far as a base system. Congratulations. What you install from this point on is generally up to you. At this point, it would be nice if you could send me an email to let me know of your achievment. Make another backup of your hard work. This backup is different then the last one we did because we are making the backup right from the same filesystem we are currently in instead of linux1. Do a cd / to get to the main (root) directory. Next, unmount Linux1 so you don't backup everything on that filesystem as well. Type: ------------------------------------------------------------ tar cvf backup3.tar * ------------------------------------------------------------ This will create a file called backup3.tar You should compress this file with gzip because it's huge by typing: gzip backup3.tar Try a normal reboot now by typing shutdown -r now and see what happens. You may get an error regarding the swap. This is a one time error so don't worry about it. Make sure you check out your /proc (assuming it's enabled in your kernel) directory after reboot as well as try a alt-F2 through F6 to make sure your consoles are working (assuming these are enabled in your kernel). 14) BYO LINUX: Making a New Kernel Mount Linux1. The first thing you should do is copy the /etc/lilo.conf file from linux1 over to linux2. If you want to patch your kernel to update it to a new version, copy the patch(es) to the /usr/src directory. Type gzip -cd patchXX.gz | patch -p0 where XX is the rest of the name of the patch file. You must patch in the proper order. For example, if you are currently using kernel 2.2.14 and you notice that 2.2.16 is available, download 2 patches, number 15 and number 16 and apply them in the proper order. If you haven't guessed, this saves a whole lot of download time. If you already have the latest kernel, you can ignore this entire paragraph. Now, goto the /usr/src/linux directory. First, type make mrproper (This will remove any stale .o files and dependencies that are laying around) Next, type make menuconfig Choose the options you want setup. Pressing the space bar cycles through weather you want the feature compiled into the kernel, not used, or used as a module independent of the kernel. If you don't know what to do, use a ? for an explanation of the feature. After you have finished and saved and are back at the prompt, do a make dep followed by a make clean followed by a make bzImage (and yes, that is a capital 'I' in bzImage) After the kernel is finished compiling, remove or rename the old modules directory (un-necessary if this is your first kernel install). For example, if you have kernel 2.2.16 and just recompiled the kernel for your needs, remove or rename the /lib/modules/2.2.16 directory. Next, do a make modules followed by a make modules_install Next, go into the /usr/src/linux/arch/i386/boot directory and copy the bzImage file to the /boot directory. If you are using something other than the i386 architecture like a sparc, you substitute the proper directory for i386. Next, rename this bzImage file to whatever your kernel name is in /etc/lilo.conf (usually vmlinuz). Next, go into the /usr/src/linux directory and copy the System.map file over to the /boot directory. Rename it to map if that is what you called it in your /etc/lilo.conf file. Finally, type lilo -v at the prompt to update the bootloader. Upon reboot, if linux should complain that the /etc/modules.conf file is newer than the /lib/modules/X.X.XX/modules.dep file, use vi to edit the modules.dep and add a space or a blank line and then save the file. This will cure the problem. Lastly, let's install the sysklogd package. It's optional. This package logs all your systems kernel messages. I put it here because it won't install until the kernel has been compiled and lilo ran. Unpack it and type the following: make make install Copy the syslog.conf from the packages directory to your /etc directory. Edit this file. Find a line in there that reads: mail.=info /dev/tty12 and change it to read *.* /dev/tty12 This will enable you to see all system logs by pressing alt-F12 in a console Next, create these two directories: /var/adm and /usr/adm Use vi to create the /etc/init.d/syslog script. Add the following 2 lines to enable system logging: -------------------------------------------------------- syslogd -m 0 klogd -------------------------------------------------------- Save this file. Next, type ln -s /etc/init.d/syslog /etc/rc2.d/S20syslog to make it start on bootup. Finally, do a chmod 755 /etc/init.d/syslog to set the files permissions to make it exececutable. Backups from this point on are at your option. 15) BYO LINUX: Networking I'm starting out with a basic lan configuration. We'll do a lan configuration first then add PPP for your modem towards the end of this chapter. The first package we'll install is net-tools. Type the following make config Hit enter to accept all the default answers. ------------------------------------------------ make make install ------------------------------------------------ The next package we'll install is Netkit-Combo. Type the following: ------------------------------------------------ ./configure --without-pam ------------------------------------------------ You probably will not want to install this entire package because of security considerations, but it's up to you. You should only install and use what is absolutely needed. The only two packages I installed were ftp and telnet. Keep in mind, ftp and telnet are both un-encrypted applications. Anyone running a sniffer can decode every keystroke you type. If you require something secure, consider installing ssh (secure shell). To compile these individually, go into there individual directories and run make followed by make install. Next, go into the packages /netkit-base/etc.sample folder. Copy the following files to your /etc folder: inetd.conf, hosts, host.conf, services, protocols, hosts.allow, hosts.deny This next step is for everyone Use vi to create a file called /etc/resolv.conf (Note: It's not resolve, it's resolv) This is where the nameserver addresses are stored. These are the IP addresses your ISP gives you (usually two of them). These addresses convert www.whatever.com into an numeric IP address. All names are translated into a number on the internet. Here's an example: ------------------------------------------------ nameserver 192.168.0.1 ------------------------------------------------ If your ISP gave you two addresses (most likely), line two would start with 'nameserver' as well, then the IP address. --------------------------------------------------------------------- This next step is for people with NIC's (Network Interface Card, or ethernet): --------------------------------------------------------------------- In order for your nic to be recognized, you will need to create a /etc/modules.conf file. The proper way to edit this file is to type the following: ------------------------- alias eth0 3c59x ------------------------- where 3c59x is the name of the module in /lib/modules/X.X.XX/net without the .o assuming you compiled your nic as a module. Please note, this setup assumes you are using a pci nic. You may get an isa nic to work but I had some trouble with mine until I put some configuration options in this file as well. It can't hurt to try. If worst comes to worst, you could try and copy the file over from linux1. If you are using Redhat, they call it conf.modules which is no longer an accepted practice. It will still work, but linux will complain. Type depmod to update the modules dependency file (This is located in /lib/modules/X.X.XX in case your curious). Also, upon reboot, if linux should complain that the /etc/modules.conf file is newer than the /lib/modules/X.X.XX/modules.dep file, use vi to edit the modules.dep and add a space or a blank line and then save the file. This will cure the problem. --------------------------------------------------------------------- This next step is for people with NIC's also --------------------------------------------------------------------- Edit /etc/init.d/network and put in your proper IP address for your machine as well as your netmask. Put in your gateway if you are using one. (A gateway is just as the name sounds, a gateway to another network. I use this because another computer on my home network is the computer that is always hooked up to the internet). You can leave the other two fields blank, linux will fill them in for you next time you reboot. If your machine is not on a network, or you do not have a STATIC IP address assigned to you from your IP, you can make up your own IP and netmask, HOWEVER, make sure you are using an IP that is set aside for lan use and NOT an internet address. This WILL create havoc on the internet if you just make one up out of the blue! Here are suitable addresses for use on a private lan: 10.0.0.0 through 10.255.255.255 with a netmask of 255.0.0.0 172.16.0.0 through 172.31.255.255 with a netmask of 255.255.0.0 192.168.0.0 through 192.168.255.25 with a netmask of 255.255.255.0 Next, goto /etc/rc2.d and type the following: ln -s /etc/init.d/network S10network Give the computer a reboot and then ping the loopback address and the pc itself by typing the following: ping 127.0.0.1 ping 192.168.0.1 (or whatever ip address you assigned to the pc) This should not have any errors. Type ctrl-c to stop the output. If you are connected to a LAN that is connected to the internet, you should also be able to ping outside of the network to the internet provided the gateway address is setup on your box. --------------------------------------------------------------------- This next step is for people who want to use modems --------------------------------------------------------------------- Let's install ppp. First, we need to add a group to the system called daemon. Type the following: --------------------------- groupadd -g 1 daemon --------------------------- Next, unpack ppp and give it the standard configure, make, and make install. This is all we need to do. KDE will handle your modem dialing. 16) BYO LINUX: Xwindows install Here's a nice break after all your hard work. Let's get Xwindows running. Actually, getting Xwindows running was simpler than I thought it would be. The most difficult thing in this chapter will be the downloading of 3 packages. I say difficult because they're like 12 Megabytes each and it will take a while for you to download them. Next, unpack the three X src files in the directory of your choice. They will explode into a directory called xc. Go into this /xc directory and type make World Next, leave the room and go get yourself a nice cup of coffee. As a matter of fact, pick up the newspaper and catch up on current events because it's going to be over an hour for all this to compile (I'm using a Celeron 500MHz with 96Mb RAM and it took 1hr and 20min). This should compile without any errors and give you a nice message at the end that it's completed sucessfully. Next let's install it by typing the following: -------------------------------- make make install -------------------------------- One nice thing, if you ever want to remove xwindows, everything resides in the /usr/X11R6 directory. Simply deleting that directory with the symlinks we are going to make next removes everything. Next, create the following symlink (and watch your upper and lower cases): -------------------------------- ln -s /usr/X11R6 /usr/X11 -------------------------------- Next, we need to create a path to /usr/X11/bin by typing the following: vi /etc/profile Add the following in there: -------------------------------- PATH="$PATH:/usr/X11/bin" export PATH -------------------------------- Go ahead and save that. Now in order for this new path to take effect, logout and then log back in. Next, create a file with vi called /etc/ld.so.conf Type /usr/X11R6/lib in there. Save the file and do a ldconfig -v to update everything. Next, type mkdir /var/log - this directory will be needed. Now type xf86config (xf86cfg may work for a more graphical configuration) at the prompt to setup your keyboard, mouse and video. If you are using a ps/2 mouse and you just can't seem to get it to work, try another ps/2 mouse. For some reason, some ps/2 mice need special drivers or parameters setup (I have no idea which) in order to use them. I had trouble with a compaq mouse that just would not work in linux. After the setup exits, at the prompt type startx If all went well your looking at a GUI right now with 3 windows open. I could type commands into the terminal as well. The only other thing to do now is a ctrl-alt-backspace to exit the GUI. Lastly, let's install procps. The reason I included it in this chapter is because it requires Xwindows to install. This program is optional. It includes useful utilities such as top, ps and uptime which can tell you what processes are running, how long the computer has been up and a few other things. Unpack the archive and type: -------------------------------- make make install ldconfig 17) BYO LINUX: RPM Install Next we'll be installing RPM, or Redhat Package Manager. Obviously this isn't required but I thought I would include it anyways. As far as package managers go, RPM is definitely one of the most popular ones and it's very simple to use. Before we install it, we'll need two other packages first. ZLIB LIBRARY: zlib gets the standard - configure, make, make install BERKELY DB LIBRARY: Unpack the archive and go into the packages build_unix directory. Type the following: ../dist/configure --enable-compat185 (notice two periods not one) make make install ldconfig RPM: Unpack the archive and type the following: ./configure --disable-nls make make install rpm --initdb Go ahead and remove the /usr/src/redhat directory. A FEW RPM COMMANDS TO REMEMBER: rpm -i installs a package rpm -U upgrades a package, all older versions removed rpm -e removes a package rpm -qa queries the package database rpm -ivh filename.rpm checks the packages dependencies You will most likely have to use the --nodeps flag when using RPM because the dependencies the RPM package requires will not be there, they were installed via source code most likely and RPM doesn't know this. Example: rpm -i filename. rpm --nodeps This would be a good place for a backup, especially before we get involved in the next chapter 18) BYO LINUX: KDE2 We will be installing KDE 2.01 Follow these install directions in the order shown LIBJPEG: ./configure --enable-shared make make install LIBTIFF: ./configure -Select yes to accept default parameters make make install Remove the tiff.sw.tools directory from root (/ not /root) MESALIB: ./configure (ignore messages about missing makefiles) make make install OPENSSL: ./config make make install ldconfig QT: Copy qt to /usr and unpack there Remove the tar file Make a symlink linking qt-2.2.0 to qt Edit the /etc/profile file and add the following lines there: QTDIR=/usr/qt PATH=$QTDIR/bin:$PATH MANPATH=$QTDIR/man:$MANPATH LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH KDEDIR=/usr/kde PATH=$KDEDIR/bin:$PATH export KDEDIR PATH MANPATH QTDIR LD_LIBRARY_PATH Logout and then log back in so the new paths take effect Go into the /usr/qt directory and type the following: ./configure -gif -system-jpeg Accept the lisence by typing yes make make a symlink that links /lib/libshadow.so.0.0.0 to /lib/libshadow.so KDE2: Install the following in the order listed by doing a standard ./configure, make, make install: kdesupport kdelibs kdebase These are the bare minimum packages to run kde2. They will take several hours to compile. I recommend opening up several consoles and letting them compile overnight. I suggest you download and install them all. If you have a modem, you will need to get kdenetwork. Don't worry about the i18n folder unless you need different languages. All the rest of the packages will get the standard configure, make, and make install with the exception of kdegraphics. Here's what needs to be done for kdegraphics: First, install ed. Next, goto /usr/share and unpack texklib there. Remove the tarfile after it's unpacked. Next, install texk with the standard configure, make and make install. Now you will be able to successfully install kdegraphics. The final step is to create a file with vi called /root/.xinitrc and add the word startkde to it and save. Type startx to start up kde2 You might want to surf over to netscapes website and download communicator v475, however, I must say that konqueror is really a pretty good browser. If you decide to install netscape, you'll need to create the following symlink: ln -s /usr/lib/libstdc++-3-libc6.1-2-2.10.0.so libstdc++-libc6.1-1.so.2 You'll definitely want to make a backup now. 19) BYO LINUX: Using BYO Linux as a Router This chapter is dedicated to those who would like to setup a linux router. What does a router do you ask? Well, it's useful if you have a home network with only one static ip address from your isp. It allows you to basically turn that one ip address into as many as you need so all the computers on your network can use the internet. You do have one other choice, go out to a store like Best Buy and buy a hardware router for about $180. These can be configured from a pc via telnet which makes them nice. Also, they come with 4 open ports on them so if you've been considering buying a new hub, it's already built into the router. With the linux router, you'll need two NIC's and a hub. As you can see, it may be more cost effective to just buy the hardware router unless you got an old pentium 100 laying around collecting dust. Technically, you don't even need a monitor, keyboard, or mouse hooked up to it to do it's job. One nice thing about the linux router as opposed to a hardware router, it can be more than a router. You can also setup a firewall. In fact, you use the firewall software IPCHAINS to setup the box as a router, so, with just a bit of tinkering, you have a full fledged firewall as well. A firewall is probably not required for the average setup since I'm assuming you will be using lan addresses on your host pc's instead of internet addresses, otherwise, what's the point in setting this up? The reason it would not be required with lan addresses is that they cannot be seen on the internet. Also, you can use this box for other things such as a web or ftp server. These will no doubt follow in later chapters. The only other requirement is that you have Networking setup from the Networking chapter. Here is a basic diagram of a simple lan with a router to the internet. It illustrates a dsl modem but cable modems work just the same way. This chapter is dedicated to those who would like to setup a linux router. What does a router do you ask? Well, it's useful if you have a home network with only one static ip address from your isp. It allows you to basically turn that one ip address into as many as you need so all the computers on your network can use the internet. You do have one other choice, go out to a store like Best Buy and buy a hardware router for about $180. These can be configured from a pc via telnet which makes them nice. Also, they come with 4 open ports on them so if you've been considering buying a new hub, it's already built into the router. With the linux router, you'll need two NIC's and a hub. As you can see, it may be more cost effective to just buy the hardware router unless you got an old pentium 100 laying around collecting dust. Technically, you don't even need a monitor, keyboard, or mouse hooked up to it to do it's job. One nice thing about the linux router as opposed to a hardware router, it can be more than a router. You can also setup a firewall. In fact, you use the firewall software IPCHAINS to setup the box as a router, so, with just a bit of tinkering, you have a full fledged firewall as well. A firewall is probably not required for the average setup since I'm assuming you will be using lan addresses on your host pc's instead of internet addresses, otherwise, what's the point in setting this up? The reason it would not be required with lan addresses is that they cannot be seen on the internet. Also, you can use this box for other things such as a web or ftp server. These will no doubt follow in later chapters. The only other requirement is that you have Networking setup from the Networking chapter. Here is a basic diagram of a simple lan with a router to the internet. It illustrates a dsl modem but cable modems work just the same way. The first thing to do is install IPCHAINS. Unpack it and type the following make all make install Next, after you have physically installed the second nic into the machine, recompile the kernel with the proper nic drivers compiled as modules. As explained in networking, it's best to have pci nic's because they don't require any configuration. Also, make sure the following options are compiled into the kernel as well: sysct1 (found in general setup) network firewalls (all the rest are in networking options) advanced router verbose route monitoring firewalling masquerading icmp masq optimize as router syncookie support Now, like in networking, modify the /etc/modules.conf and add in your NIC's. You should make eth0 the card that will be connected to the internet(modem) and eth1 the card that will be connected to the lan. After this is complete, run depmod Upon reboot, if linux should complain that the /etc/modules.conf file is newer than the /lib/modules/X.X.XX/modules.dep file, use vi to edit the modules.dep file and add a space or a blank line and then save the file. This will cure the problem. Next, cut and paste the following and save it into a file called /etc/init.d/firewall Do a chmod 755 /etc/init.d/firewall to make this executable. The parts in red are the only options that you will need to modify. #!/bin/sh # A simple example of ipchains saved as /etc/init.d/firewall # Load required ip_masq modules (FTP included here) /sbin/depmod -a /sbin/modprobe ip_masq_ftp # Enable IP forwarding echo "1" > /proc/sys/net/ipv4/ip_forward # Assign external IP variables (to the internet, the ip your isp assigned you) extip="123.456.789.012" extif="eth0" # Assign internal IP variables (to the lan) intif="eth1" intnet="192.168.0.0/24" # The address above will make it possible to use 192.168.X.X on your lan where X.X are any numbers you choose form 0 to 255 # Initialize MASQ timeout and standard chains ipchains -M -S 7200 10 60 ipchains -F input ipchains -P input REJECT ipchains -F output ipchains -P output REJECT ipchains -F forward ipchains -P forward DENY # Setup input policy # local interface, local machines, going anywhere is valid ipchains -A input -i $intif -s $intnet -d 0.0.0.0/0 -j ACCEPT # reject IP spoofing where external computer claims to be a local ipchains -A input -i $extif -s $intnet -d 0.0.0.0/0 -l -j REJECT # allow external access via external interface ipchains -A input -i $extif -s 0.0.0.0/0 -d $extip/32 -j ACCEPT # loopback interface is valid ipchains -A input -i lo -s 0.0.0.0/0 -d 0.0.0.0/0 -j ACCEPT # Setup output policy # all outgoing traffic is allowed ipchains -A output -i $intif -s 0.0.0.0/0 -d $intnet -j ACCEPT # prevent traffic for local network from using external interface ipchains -A output -i $extif -s 0.0.0.0/0 -d $intnet -l -j REJECT # prevent traffic from local network from using external interface ipchains -A output -i $extif -s $intnet -d 0.0.0.0/0 -l -j REJECT # anything else can go out ipchains -A output -i $extif -s $extip/32 -d 0.0.0.0/0 -j ACCEPT # loopback interface is valid ipchains -A output -i lo -s 0.0.0.0/0 -d 0.0.0.0/0 -j ACCEPT # Setup forwarding policy # Masquerade local net traffic to anywhere ipchains -A forward -i $extif -s $intnet -d 0.0.0.0/0 -j MASQ Editing /etc/init.d/network #! /bin/sh # # network Establish the network connection. # # Version: @(#)network 2.2 19-Apr-1999 miquels@cistron.nl # IPV4_FORWARD=1 case "`uname -r`" in 2.0.*) ADDROUTE="yes" ;; *) ADDROUTE="" ;; esac # Configure the loopback device. ifconfig lo 127.0.0.1 [ "$ADDROUTE" ] && route add -net 127.0.0.0 dev lo # Configure the ethernet device or start SLIP/PPP below (notice the addition of a 0 after IPADDR, NETWORK, and BROADCAST). IPADDR0="123.456.789.012" # Your IP address. NETMASK="255.255.255.224" # Your netmask. NETWORK0="192.168.1.0" # Your network address. BROADCAST0="192.168.1.255" # Your broadcast address (blank if none). GATEWAY="123.456.789.012" # Your gateway address. ifconfig eth0 ${IPADDR0} netmask ${NETMASK} broadcast ${BROADCAST0} [ "$ADDROUTE" ] && route add -net ${NETWORK0} [ "$GATEWAY" ] && route add default gw ${GATEWAY} #Stuff added by tom for masquerading IPADDR1="192.168.0.1" NETWORK1="192.168.1.1" BROADCAST1="192.168.2.255" ifconfig eth1 ${IPADDR1} netmask ${NETMASK} broadcast ${BROADCAST1} [ "$ADDROUTE" ] && route add -net ${NETWORK1} [ "$ADDROUTE" ] && route add default gw ${GATEWAY} /etc/init.d/firewall /sbin/ipchains -A forward -s 192.168.0.0/24 -j MASQ That should do it. Reboot the machine and give it a test. Ping the loopback, eth1, and eth2 addresses. Ping a www address to make sure dns is working. On your host computers, assign them ip addresses in the 192.168.X.X range with matching NETMASKS (subnets) as selected above. The gateway device should be 192.168.0.1 if you didn't change anything from above. You put in the dns addresses that your isp gave you (If you are using linux machines as hosts instead of windows machines, the dns info goes in /etc/resolv.conf just like in the networking chapter. Also, it's not resolve.conf, it's resolv.conf without the 'e'). That should do it, there shouldn't be any problems. Re-check for typos if your having problems. 20) BYO LINUX: Apache Web Server To my surprise, apache was very easy to install and configure. As a matter of fact, if you haven't already guessed, this particular web page was being hosted on a BYO Linux distribution that's running apache. I have a static ip for my dsl line and I just redirected you to my ip address. Anyways, on with the install. Unpack the apache archive and type the following: --------------------------------------------------- ./configure --prefix=/usr/apache make make install --------------------------------------------------- Next, create a new user on the system and assign him a password. Type the following: --------------------------------------------------- useradd apache passwd apache --------------------------------------------------- You don't need to login as this user, you can run apache as root if you would like but you will need this name in the next step. Edit /usr/apache/conf/httpd.conf Find a line that says User nobody and change the nobody to apache or whatever user you just created above. Scroll down a little farther and edit the line that says #ServerName *****. The asterics indicate whatever the name of your server is. You will need to uncomment this line and add the appropriate server name. In my case, I just put my static ip number in there. That's really all there is to a basic configuration of apache. Goto /usr/apache/bin and type apachectl start and you are now running a web server. To test it, if this machine is on a network, type it's ip address into your web browser and you should get a nice message on the screen from apache telling you it's working. If this is a stand-alone machine, if you installed kde2, you can use it's filemanager just like a web browser and put the loopback address in there, 127.0.0.1 Lastly, the /usr/apache/htdocs directory is where you put your webpages.