1171 lines
40 KiB
Plaintext
1171 lines
40 KiB
Plaintext
MP3 Player Box HOWTO
|
||
Konrad Rzeszutek conradus@iname.com
|
||
v1.1, 2001-04-19
|
||
|
||
This document describes how to build, configure, install, and use a
|
||
custom MP3 player box. It lists the necessary hardware and answers a
|
||
number of frequently asked questions.
|
||
______________________________________________________________________
|
||
|
||
Table of Contents
|
||
|
||
|
||
|
||
1. Introduction
|
||
|
||
1.1 Acknowledgments
|
||
1.2 Copyright
|
||
1.3 Feedback
|
||
|
||
2. MP3 box
|
||
|
||
2.1 Design
|
||
|
||
3. Necessary hardware
|
||
|
||
4. Server side software
|
||
|
||
4.1 NFS server installation.
|
||
4.1.1 Setting up the Configuration Files
|
||
4.1.1.1 /etc/exports
|
||
4.1.1.2 /etc/hosts.allow and /etc/hosts.deny
|
||
4.1.1.3 Starting the NFS server.
|
||
4.2 DHCPd server installation.
|
||
4.2.1 Installing DHCPd
|
||
4.2.2 Setting up the configuration files for DHCPd
|
||
4.3 PXE daemon
|
||
4.3.1 Installing PXE software.
|
||
4.3.2 Setting up the PXE daemon.
|
||
|
||
5. Client side software
|
||
|
||
5.1 Linux kernel
|
||
5.2 Linux filesystem
|
||
5.2.1 Creating initrd filesystem.
|
||
5.2.1.1 Creating initrd fs.
|
||
5.2.1.2 Mounting initrd fs.
|
||
5.2.1.3 Copying LRP filesystem to initrd fs.
|
||
5.2.1.4 Copying custom modules,
|
||
5.2.1.5 Preparing the initrd fs for NBP.
|
||
5.2.1.6 Conclusion
|
||
5.3 Configuring NBP (Network Boot Program).
|
||
5.4 Configuring startup scripts.
|
||
5.5 Configuring the infrared receiver program.
|
||
5.5.1 Getting scan-codes.
|
||
5.5.2 Compiling ARCaMP.
|
||
5.5.2.1 Different remote.
|
||
5.5.3 mpg123
|
||
|
||
6. Plexiglass box
|
||
|
||
7. Answers to Frequently Asked Questions
|
||
|
||
7.1 Can't compile the kernel. It says: "2nd: No such file or directory"
|
||
7.2 My remote doesn't work with ARCaMP
|
||
7.3 The Linux kernel can't mount the filesystem.
|
||
7.4 How do I bend plexiglass?
|
||
7.5 The system doesn't boot up after I take the video card out.
|
||
|
||
8. References
|
||
|
||
8.1 Remote control programs
|
||
|
||
|
||
______________________________________________________________________
|
||
|
||
1. Introduction
|
||
|
||
This is a build guide for a custom MP3 box, which has no harddrive,
|
||
floppy, or video card and boots from the network. It also fetches the
|
||
songs from the network. It is intended as template, quick reference,
|
||
and a template to building a custom MP3 box. Frequently asked
|
||
questions related to MP3 box building, its usage, problems, and
|
||
references are given.
|
||
|
||
|
||
1.1. Acknowledgments
|
||
|
||
Much of this information came from authors private ideas and source
|
||
files covered under GNU licenses. Huge thanks goes to Tom Jones (for
|
||
helping me design the box), Ryan Defelic (for his MP3 box being a
|
||
alpha-prototype), Steve Maroney (for asking me many questions), the
|
||
LRP project, and of course The Penguin (which sits on his shrine next
|
||
to my network closet :=) )
|
||
|
||
|
||
1.2. Copyright
|
||
|
||
Copyright (c) 2001 by Konrad Rzeszutek
|
||
|
||
Please freely copy and distribute (sell or give away) this document in
|
||
any format. It's requested that corrections and/or comments be
|
||
forwarded to the document maintainer. You may create a derivative work
|
||
and distribute it provided that you:
|
||
|
||
|
||
<20> Send your derivative work (in the most suitable format such as
|
||
sgml) to the LDP (Linux Documentation Project) or the like for
|
||
posting on the Internet. If not the LDP, then let the LDP know
|
||
where it is available.
|
||
|
||
<20> License the derivative work with this same license or use GPL.
|
||
Include a copyright notice and at least a pointer to the license
|
||
used.
|
||
|
||
<20> Give due credit to previous authors and major contributors.
|
||
|
||
|
||
If you're considering making a derived work other than a translation,
|
||
it's requested that you discuss your plans with the current
|
||
maintainer.
|
||
|
||
|
||
1.3. Feedback
|
||
|
||
I rely on you, the reader, to make this HOWTO useful. If you have any
|
||
questions, corrections, or comments, please send them to me,
|
||
conradus@iname.com, and I will try to incorporate them in the next
|
||
revision.
|
||
|
||
|
||
2. MP3 box
|
||
|
||
The sole and only reason why you, the reader, is engulfing yourself in
|
||
reading this material along with a nice warm container full with java,
|
||
is so that you:
|
||
|
||
<20> Wish to make a self-supportive box with only four cables sticking
|
||
out of it: an RJ-45 network cable, a power cable, and two RCA
|
||
cables (or just one 1/8 mini stereo plug).
|
||
|
||
<20> Have all your mp3's on a big-server, while this MP3-box would fetch
|
||
the files from the server.
|
||
|
||
<20> Have no floppy driver, no video card, nor any harddrive in the
|
||
MP3-box. Just a power supply, sound card, network card, memory,
|
||
cpu, and a serial infrared receiver.
|
||
|
||
<20> Be the envy of your friends :=)
|
||
|
||
<20> Play your mp3's using your remote without having to turn on your
|
||
workstation.
|
||
|
||
|
||
|
||
2.1. Design
|
||
|
||
Its important to keep certain things in mind:
|
||
|
||
<20> Size of the computer component (I was tempted to use PC104 boards,
|
||
but they were to expensive). Height of ISA/PCI cards (so that the
|
||
box doesn't look like a baby-AT case).
|
||
|
||
<20> The appealing side of the box - does it look like a square
|
||
rectangle, pyramid, triangle, or something even more weird?
|
||
|
||
<20> Paint. Do you want see-through box with flashing lights inside,
|
||
inconspicuous black box, or chrome looking?
|
||
|
||
<20> Cost. The absolute minimum (taking into consideration that you, the
|
||
reader, has no spare computer parts) is about $70 (excluding tax,
|
||
shipping, etc)
|
||
|
||
<20> KISS (Keep It Simple and Stupid) - take everything that's
|
||
unnecessary and get rid of it (parallel port, modem card, video
|
||
card, etc).
|
||
|
||
The idea behind this box is to separate tasks - the MP3-box can only
|
||
play the mp3's from a server, while you, the reader, can freely add
|
||
more files to your big-end server. Thus, the MPEG-box wouldn't need a
|
||
harddrive, nor floppy drive. It would boot the operating system from
|
||
the network (from the same server where the mp3 files are located).
|
||
|
||
|
||
|
||
3. Necessary hardware
|
||
|
||
The software running the decoding process (mpg123) can happily work on
|
||
a 486DX/66 or higher without any constraints. 16MB of RAM ought to do
|
||
fine as well. Any sound card that is supported under Linux should
|
||
work. The following list includes all the hardware I used:
|
||
|
||
<20> Pentium 120 downclocked to 90 Mhz (I needed to lower the
|
||
temperature of the CPU so that I wouldn't have to use a fan - just
|
||
a heatsink). Cost: $5.
|
||
|
||
<20> Unknown brand-name motherboard (AT-style, 4 PCI, 3 ISA, 4x DIMM,
|
||
Award BIOS) - if you are going to get rid of the video card (after
|
||
you have configured the machine) make sure you change the display
|
||
from CGA/EGA (or VGA) to None. Cost: $10.
|
||
|
||
<20> Small powersupply (50 or less watts would do). I got one from a
|
||
Compaq computer (the wiring on the powersupply didn't match the AT
|
||
P8/P9 connector standards, thus I had to match the cables and
|
||
rewire them to fit my AT motherboard). You could probably use any
|
||
powersupply as long as it gives you 12VDC and ground. You won't
|
||
need the 5VDC unless you have a keyboard, mouse, or floppy
|
||
connected. Cost: FREE (found the computer in a dumpster).
|
||
|
||
<20> Intel EtherExpress Pro 10/100 Management Network Card. Any network
|
||
card will do as long as it has PXE or BOOTP functionality - those
|
||
things are also known as network booting. Without this kind of
|
||
network functionality, you would need to attach a harddrive/zip-
|
||
drive/floppy-drive to boot the operating system from. Cost: $15
|
||
(Intel had a promotion and they were selling two for $30).
|
||
|
||
<20> Sound card. I got a Crystal CS424x card b/c its height was pretty
|
||
small compared to other sound cards. Cost: $15.
|
||
|
||
<20> Remote control. This is the difficult choice - if you pick a
|
||
Packard Bell remote, you will end up pulling your hair out. I got a
|
||
Logitech AST Remote. Before you get a remote, you ought to check
|
||
for software that will work with your remote. Cost: $5.
|
||
|
||
<20> Cabling - stereo RCA cables from RadioShack. Network cable and a
|
||
jack from local distributor of electronic components. Cost: $9.
|
||
|
||
<20> Small 8mm screws to screw the custom box together. Picked up at
|
||
Home Depot along with plexiglass. Cost: $2.
|
||
|
||
<20> Plexiglass - used to construct the custom box. Bending of the box
|
||
is pretty easy, as long you have a torch and don't burn your own
|
||
eyelashes with it. Picked it up at Home Depot. Cost: $10.
|
||
|
||
<20> Black paint so the box would look inconspicuous and color-match my
|
||
stereo rack. Cost: $2.
|
||
|
||
Total cost: $75.
|
||
|
||
|
||
4. Server side software
|
||
|
||
Before you proceed with installing the server-software, it would be
|
||
beneficial to review the following HOWTO's (in the listed order):
|
||
|
||
<20> Net-HOWTO <htttp://metalab.unc.edu/pub/Linux/docs/HOWTO/Net-HOWTO>
|
||
|
||
<20> Ethernet-HOWTO
|
||
<http://metalab.unc.edu/pub/Linux/docs/HOWTO/Ethernet-HOWTO>
|
||
|
||
<20> Diskless-HOWTO
|
||
<http://metalab.unc.edu/pub/Linux/docs/HOWTO/Diskless-HOWTO>
|
||
|
||
<20> NFS-HOWTO <http://metalab.unc.edu/pub/Linux/docs/HOWTO/NFS-HOWTO>
|
||
|
||
Particularly, the Diskless-HOWTO
|
||
<http://metalab.unc.edu/pub/Linux/docs/HOWTO/Diskless-HOWTO> contains
|
||
a wealth of information useful for this project.
|
||
|
||
The required software are mostly already installed on a stock Linux
|
||
distribution, but some might be missing. The ones that are usually not
|
||
found (dhcpd, pxe, etc) are included in the mpeg-box-project.tgz
|
||
<http://darnok.dhs.org/~konrad/projects/mpeg-box/data/mpeg-box-
|
||
project.tgz> file.
|
||
|
||
<20> NFS server. Also called nfs-server or just nfs
|
||
|
||
<20> TFTP server. Called tftpd.
|
||
|
||
<20> DHCPd server. There are two versions. The latest one supports
|
||
natively PXE extension (which my network card uses), but doesn't
|
||
support menu based booting - something I needed during the
|
||
development. I'm using v2.0 and for PXE extensions I'm using an
|
||
DHCP proxy (all these strange terms will be explained later on).
|
||
|
||
<20> DHCP Proxy server - PXE. Not needed if you are using the latest
|
||
version of DHCP. The package is called pxe. Make sure you pick the
|
||
latest one, or just use the one that's included in my file.
|
||
4.1. NFS server installation.
|
||
|
||
|
||
I presume you have read the NFS-HOWTO
|
||
<http://metalab.unc.edu/pub/Linux/docs/HOWTO/NFS-HOWTO> . If you
|
||
haven't, do yourself a favor and pick it up. Most of these information
|
||
are straight from that HOWTO.
|
||
|
||
Before you start setting NFS, make sure you have nfs-utils or nfs-
|
||
server package installed. If you don't have them, the dhcpd-2.0pl2
|
||
source code is included in the mpeg-box-project.tgz
|
||
<http://darnok.dhs.org/~konrad/projects/mpeg-box/data/mpeg-box-
|
||
project.tgz> file.
|
||
|
||
|
||
<20> Extract the file -
|
||
|
||
tar -zxvf mpeg-box-project.tgz
|
||
|
||
|
||
|
||
<20> go into 1st Step - configuring server/01 - dhcpd.
|
||
|
||
cd "1st Step - configuring server/01 - dhcp"
|
||
|
||
|
||
|
||
<20> From there run:
|
||
|
||
./configure
|
||
make
|
||
make install
|
||
|
||
|
||
|
||
Setting up the server will be done in two steps: Setting up the
|
||
configuration files for NFS, and then starting the NFS services.
|
||
|
||
|
||
4.1.1. Setting up the Configuration Files
|
||
|
||
There are three main configuration files you will need to edit to set
|
||
up an NFS server: /etc/exports, /etc/hosts.allow, and /etc/hosts.deny.
|
||
Strictly speaking, you only need to edit /etc/exports to get NFS to
|
||
work, but you would be left with an extremely insecure setup. You may
|
||
also need to edit your startup scripts.
|
||
|
||
|
||
4.1.1.1. /etc/exports
|
||
|
||
This file contains a list of entries; each entry indicates a volume
|
||
that is shared and how it is shared. Check the man pages (man exports)
|
||
for a complete description of all the setup options for the file,
|
||
although the description here will probably satisfy most people's
|
||
needs.
|
||
|
||
An entry in /etc/exports will typically look like this:
|
||
|
||
directory machine1(option11,option12) machine2(option21,option22)
|
||
|
||
|
||
where
|
||
|
||
directory
|
||
the directory that you want to share. It may be an entire volume
|
||
though it need not be. If you share a directory, then all
|
||
directories under it within the same file system will be shared
|
||
as well. For example it might be: /exports
|
||
|
||
machine1 and machine2
|
||
client machines that will have access to the directory. The
|
||
machines may be listed by their IP address or their DNS address
|
||
(e.g., machine.company.com or 192.168.0.8). Using IP addresses
|
||
is more reliable and more secure.
|
||
|
||
optionxx
|
||
the option listing for each machine will describe what kind of
|
||
access that machine will have. Important options are:
|
||
|
||
<20> ro: The directory is shared read only; the client machine will
|
||
not be able to write to it. This is the default.
|
||
|
||
<20> rw: The client machine will have read and write access to the
|
||
directory.
|
||
|
||
<20> and many more ...
|
||
|
||
For our MP3-box, we just need to read-only access to the directory
|
||
with mp3's. Suppose the MP3-box IP will be 10.0.0.8 and the directory
|
||
with our music files is /exports/media. The /etc/exports would look
|
||
like this:
|
||
|
||
|
||
/exports/media 10.0.0.8(ro)
|
||
|
||
|
||
|
||
4.1.1.2. /etc/hosts.allow and /etc/hosts.deny
|
||
|
||
These two files specify which computers on the network can use
|
||
services on your machine. Each line of the file is an entry listing a
|
||
service and a set of machines. When the server gets a request from a
|
||
machine, it does the following:
|
||
|
||
<20> It first checks hosts.allow to see if the machine matches a
|
||
description listed in there. If it does, then the machine is
|
||
allowed access.
|
||
|
||
<20> f the machine does not match an entry in hosts.allow, the server
|
||
then checks hosts.deny to see if the client matches a listing in
|
||
there. If it does then the machine is denied access.
|
||
|
||
<20> If the client matches no listings in either file, then it is
|
||
allowed access.
|
||
|
||
|
||
In general, it is a good idea with NFS (as with most internet
|
||
services) to explicitly deny access to hosts that you don't need to
|
||
allow access to.
|
||
|
||
|
||
The first step in doing this is to add the following entry to
|
||
/etc/hosts.deny:
|
||
|
||
|
||
portmap:ALL
|
||
|
||
|
||
|
||
Next, we need to add an entry to hosts.allow to give any hosts access
|
||
that we want to have access. (If we just leave the above lines in
|
||
hosts.deny then nobody will have access to NFS.) Entries in
|
||
hosts.allow follow the format:
|
||
|
||
|
||
|
||
service: host [or network/netmask] , host [or network/netmask]
|
||
|
||
|
||
|
||
Here, host is IP address of a potential client; it may be possible in
|
||
some versions to use the DNS name of the host, but it is strongly dep<65>
|
||
recated.
|
||
|
||
Suppose we have the setup above and we just want to allow access to
|
||
huh.com and arakis.dune.com, and suppose that the IP addresses of
|
||
these machines are 10.0.0.8 and.10.0.0.1, respectively. We could add
|
||
the following entry to /etc/hosts.allow:
|
||
|
||
|
||
|
||
portmap: 10.0.0.8, 10.0.0.1
|
||
|
||
|
||
|
||
For recent nfs-utils versions, we would also add the following (again,
|
||
these entries are harmless even if they are not supported):
|
||
|
||
|
||
|
||
lockd: 10.0.0.8, 10.0.0.1
|
||
rquotad: 10.0.0.8, 10.0.0.1
|
||
mountd: 10.0.0.8, 10.0.0.1
|
||
statd: 10.0.0.8, 10.0.0.1
|
||
|
||
|
||
|
||
4.1.1.3. Starting the NFS server.
|
||
|
||
The shell scripts which start the NFS server are usually in
|
||
/etc/init.d or /etc/rc.d. Depending on your Linux distribution, you
|
||
either need to run: netconfig, setup (RedHat) ; YaSt2(SuSe); turbo-
|
||
config (TurboLinux); or you are stuck editing /etc/init.d/nfs-server
|
||
files manually. If you run those programs, look for options that list
|
||
NFS or nfs-serveR and start those services.
|
||
|
||
|
||
|
||
4.2. DHCPd server installation.
|
||
|
||
DHCP (Dynamic Host Configuration Protocol) is a protocol for computers
|
||
to find out their IP address, gateway settings, netmask, and a lot
|
||
more. Its a quite nice off-load for the system administrator. The
|
||
reason why you want to use it is because when the MP3-box comes up, as
|
||
said before, it doesn't have a harddrive, nor floppy drive - therefore
|
||
it can't boot an operating system. But with a card that supports PXE,
|
||
the following happens:
|
||
|
||
<20> The network card starts sending a DHCP request to the network
|
||
|
||
|
||
<20> The DHCP server offers a IP for the MP3-box.
|
||
|
||
<20> The MP3-box gets the IP address and then procceds to send PXE
|
||
extension DHCP request - an extension to the DHCP, which is not
|
||
covered in the RFC.
|
||
|
||
<20> The PXE extension daemon issues the NBP (Network Boot Program) to
|
||
the card on the MP3-box.
|
||
|
||
<20> The NBP contacts the TFTP server and downloads the Linux kernel,
|
||
and the initrd.gz file. After that it runs the Linux kernel.
|
||
|
||
<20> The Linux kernel does what it has been programmed to.
|
||
|
||
Without the IP address, the system wouldn't be able to get the NBP,
|
||
neither the Linux kernel.
|
||
|
||
Setting up the DHCP daemon is a two stage process - installing the
|
||
binaries, and setting up the configuration file for DHCP.
|
||
|
||
|
||
4.2.1. Installing DHCPd
|
||
|
||
The version of DHCP I'm using comes from Internet Software Consortium
|
||
<http://www.isc.org/products/DHCP/>, the version is 2.0. You might
|
||
already have the binaries installed, if that's the case - skip this
|
||
section.
|
||
|
||
The source code is 1st Step - configuring server/01 -
|
||
dhcpd/dhcp-2.0pl2, go into that directory and issue the following
|
||
commands:
|
||
|
||
./configure
|
||
make
|
||
make install
|
||
|
||
|
||
|
||
The shell scripts which start the DHCP server are usually in
|
||
/etc/init.d or /etc/rc.d. Depending on your Linux distribution, you
|
||
either need to run: netconfig, setup (RedHat) ; YaSt2(SuSe); turbo-
|
||
config (TurboLinux); or you are stuck editing /etc/init.d/dhcpd files
|
||
manually.
|
||
|
||
|
||
4.2.2. Setting up the configuration files for DHCPd
|
||
|
||
The most important part of the /etc/dhcpd.conf file are the option
|
||
fields and the host field. For the v2.0 of ISC-dhcpd its necessary to
|
||
specify
|
||
|
||
|
||
option dhcp-class-identifier "PXEClient";
|
||
option vendor-encapsulated-options ff;
|
||
|
||
|
||
|
||
This will enable the DHCP server to recognize the network cards with
|
||
PXE as valid. Make sure you also have the host section filled out. For
|
||
example, for the MP3-box called swallow.eoh the host entry would look
|
||
like:
|
||
|
||
|
||
|
||
host swallow {
|
||
hardware ethernet 00:90:27:c1:dc:db;
|
||
fixed-address swallow.eoh;
|
||
}
|
||
|
||
|
||
|
||
This is allow the DHCP server to give the box with that MAC address
|
||
(which the network card displays during boot-up), the IP address
|
||
associated with the host swallow. How is the host associated with
|
||
10.0.0.8 - that's the job of DNS server (which you hopefully have
|
||
installed). If you don't have DNS, you can use flat-host resolution
|
||
and add into /etc/hosts the following line (replace the 00:90:27. ..
|
||
with your MAC address):
|
||
|
||
|
||
10.0.0.8 swallow.eoh swallow
|
||
|
||
|
||
|
||
Back to the program ...
|
||
|
||
Following is my /etc/dhcpd.conf file:
|
||
|
||
|
||
|
||
option domain-name "eoh";
|
||
option dhcp-class-identifier "PXEClient";
|
||
option vendor-encapsulated-options ff;
|
||
|
||
option subnet-mask 255.255.255.0;
|
||
default-lease-time 600;
|
||
max-lease-time 7200;
|
||
|
||
subnet 10.0.0.0 netmask 255.255.255.0 {
|
||
range 10.0.0.20 10.0.0.40;
|
||
}
|
||
host swallow {
|
||
hardware ethernet 00:90:27:c1:dc:db;
|
||
fixed-address swallow.eoh;
|
||
}
|
||
|
||
|
||
|
||
You can check your DHCP server by booting up a Windows workstation,
|
||
and change its IP address to Obtain an IP address automatically.
|
||
|
||
|
||
4.3. PXE daemon
|
||
|
||
PXE is standard for remote booting. The following information is taken
|
||
from 1st Step - configuring server/02 - pxe/pxe-README:
|
||
|
||
|
||
PXE is an extension to DHCP and also method of remotely booting. The
|
||
specs for PXE can be found at
|
||
ftp://download.intel.com/ial/wfm/pxespec.pdf
|
||
<ftp://download.intel.com/ial/wfm/pxespec.pdf>. The PXE daemon
|
||
provides two capabilities: proxyDHCP and PXE Bootserver. The PXE
|
||
daemon can be set up to provide either or obth of the capabilities.
|
||
Both capabilities are required.
|
||
|
||
|
||
proxyDHCP works in parallel with DHCP and provides the booting client
|
||
with a remote boot configuration options. ProxyDHCP provides the PXE
|
||
client(s) with the following information: remote boot prompt with
|
||
optional timeout, remote boot menu and PXE Bootserver discovery
|
||
options.
|
||
|
||
The PXE Bootserver is a capability provided by the PXE daemon. The PXE
|
||
Bootserver is the capability that provides the booting client with
|
||
boot images for a particular boot environment.
|
||
|
||
PXE Bootserver serves up requested NBPs (Network Boot Programs) to PXE
|
||
clients. PXE Clients locate PXE Bootservers using discovery
|
||
information provided to the client by proxyDHCP. The discovery method
|
||
used by the PXE client (multicast, broadcast or unicast) and the list
|
||
of available bootserver types is controlled by proxyDHCP. PXE
|
||
Bootservers always listen for all three types of discovery requests
|
||
and will respond to all valid requests.
|
||
|
||
|
||
4.3.1. Installing PXE software.
|
||
|
||
If you have RedHat or SuSE, pxe is available as an RPM - download it
|
||
and install it. Unfortunately, you are still going to need the sources
|
||
- you will have to recompile the NBP (Network Boot Program).
|
||
|
||
|
||
All the paths mentioned below refer to the contents of the mpeg-box-
|
||
project.tgz <http://darnok.dhs.org/~konrad/projects/mpeg-
|
||
box/data/mpeg-box-project.tgz> file, which has all the source files
|
||
and configuration files listed below.
|
||
|
||
The source file for PXE server are located in
|
||
|
||
1st Step - configuring server/02 - pxe/pxe/pxe-linux/server.
|
||
|
||
If you don't have PXE installed, just run: make and make install. The
|
||
files will be installed in /usr/local. After that you should copy the
|
||
1st Step - configuring server/02 - pxe/pxe/pxe.init file to /etc/rc.d
|
||
or /etc/init.d. After that go into your /etc/rc2.d and link
|
||
/etc/init.d/pxe.init file to S99pxe. The command is:
|
||
|
||
ln -s ../init.d/pxe.init S99pxe
|
||
|
||
|
||
If you have no clue what I'm talking about, just enter
|
||
|
||
pxe
|
||
|
||
|
||
that will start the PXE daemon (but do that after you have read the
|
||
next section)
|
||
|
||
|
||
4.3.2. Setting up the PXE daemon.
|
||
|
||
To get the PXE daemon completely working, its necessary to setup a
|
||
couple of configuration files/directories.
|
||
|
||
<20> pxe.conf which is located in 1st Step - configuring server/03 - etc
|
||
files should be copied to /etc. The differences between this file
|
||
and the one that comes with PXE software is small - the order of
|
||
boot programs is changed. The original pxe.conf is located in 1st
|
||
Step - configuring server/02 - pxe/pxe/pxe-linux/server/services.
|
||
|
||
<20> mtftpd.conf which lists multicast addresses and the files
|
||
associated with it. Its better to leave the file alone. Copy it
|
||
from 1st Step - configuring server/03 - etc files into /etc
|
||
directory.
|
||
|
||
<20> The file /etc/inetd.conf needs to be modified so that it will
|
||
include support for TFTP (in case MTFTP doesn't work) and MTFTP.
|
||
The lines that should be added are:
|
||
|
||
|
||
mtftp dgram udp wait root /usr/sbin/tcpd in.mtftpd /tftpboot
|
||
tftp dgram udp wait nobody /usr/sbin/tcpd in.tftpd
|
||
|
||
|
||
|
||
<20> Add into /etc/services:
|
||
|
||
|
||
mtftp 1759/udp
|
||
pxe 67/udp
|
||
pxe 4011/udp
|
||
|
||
|
||
|
||
This will your life a little simpler when you are going to debug net<65>
|
||
work problems.
|
||
|
||
<20> The last thing will be to create the /tftpboot directory with all
|
||
the files in it. Do the following command:
|
||
|
||
|
||
mkdir -p /tftpboot/X86PC/UNDI/BStrap
|
||
mkdir -p /tftpboot/X86PC/UNDI/linux-install
|
||
|
||
|
||
|
||
The copy the bstrap.0 file (which is located in 1st Step - configuring
|
||
server/02 - pxe/pxe/pxe-linux/server/services into /tftp<74>
|
||
boot/X86PC/UNDI/BStrap. Do the same thing for linux.0, but copy it
|
||
into /tftpboot/X86PC/UNDI/linux-install. If you don't like any of
|
||
these patchs, modify the /etc/pxe.conf, /etc/mtftpd.conf accordingly.
|
||
|
||
After all these steps, make sure you have a DHCP daemon running and
|
||
working (look in the section about DHCP to find out how). Start the
|
||
pxe daemon by typing
|
||
|
||
pxe
|
||
|
||
|
||
|
||
Turn on your system with a network card that supports PXE. You should
|
||
see the card getting an IP from the DHCP server, and then showing up a
|
||
menu. If that's the case, you have successfully configured the server
|
||
system, and its time to get configure the Linux kernel and initrd file
|
||
for the MP3-box in the next section.
|
||
|
||
|
||
5. Client side software
|
||
|
||
The name of this section is rather misleading - since we are booting
|
||
the system remotly, all the software is not located on the client, but
|
||
rather on the server. The software, which includes the Linux kernel
|
||
and a small Linux distribution is under 2MB of space. It could
|
||
probably be squished into 1.44MB (so that it would fit onto a floppy)
|
||
but its more fun to remotly boot the MP3-box, and not use floppies.
|
||
The Linux kernel used was 2.2.16. Any versions can be used. The mini-
|
||
distribution used is LRP <http://www.linuxrouterproject.org> - it
|
||
normally fits on a 1.44 floppy compressed. The only thing that was
|
||
left from the original mini-distribution is the binaries - the rest
|
||
was changed by me.
|
||
|
||
|
||
5.1. Linux kernel
|
||
|
||
Making a new kernel for the MP3-box is a necessity. Your sound card
|
||
will inevitable different than mine, and you might have a different
|
||
network card.
|
||
|
||
|
||
The Linux kernel tree that I used is supplied. Look in:
|
||
|
||
2nd Step - configuring client/01 - linux kernel/linux-2.2.16
|
||
|
||
and type:
|
||
|
||
cd "2nd Step - configuring client/01 - linux kernel/linux-2.2.16"
|
||
make menuconfig
|
||
|
||
|
||
and choose the right drivers. If you want to use my startup scripts
|
||
for the mini-linux distribution, make all the drivers modularized
|
||
(network, filesystem, sound card).
|
||
|
||
After successfully choosing your drivers, make the kernel. Copy your
|
||
new kernel 2nd Step - configuring client/01 - linux
|
||
kernel/linux-2.2.16/arch/i386/boot/bzImage into your tftpboot
|
||
directory as linux.1 (not as linux.0!)
|
||
|
||
cd "2nd Step - configuring client/01 - linux kernel/linux-2.2.16"
|
||
make bzImage
|
||
cp arch/i386/boot/bzImage /tftpboot/X86PC/UNDI/linux-install
|
||
|
||
|
||
|
||
Presumably, you configured your network, sound drivers as modules. It
|
||
will be necessary to compile them and put them in temporary directory
|
||
(until you get the the mini-distribution setup). To compile and
|
||
install in temporary directory do:
|
||
|
||
export INSTALL_MOD_PATH=/tmp
|
||
make modules;make modules_install
|
||
|
||
|
||
The modules for the kernel will be located in /tmp/lib/modules/2.2.16.
|
||
Remember that path.
|
||
|
||
|
||
5.2. Linux filesystem
|
||
|
||
We need to make a filesystem that the Network Boot Program can
|
||
download from the server, and pass to the kernel. The maximum size of
|
||
such filesystem is limited to the amount of memory in the machine, but
|
||
generally it shouldn't be bigger than 4MB.
|
||
|
||
Since we want to boot the MP3-box from the network, and have no media
|
||
storage device on the MP3-box, the filesystem cannot be on a
|
||
harddrive, floppy drive, nor ZIP drive. Linux provides a facility for
|
||
that called Initial RAM Disk (initrd) - its a file, which actually is
|
||
a ext2 filesystem embedded in a file.
|
||
|
||
|
||
|
||
5.2.1. Creating initrd filesystem.
|
||
|
||
To understand why we need to create a INITial Ram Disk filesystem, its
|
||
necessary to understand how Linux boots up.
|
||
|
||
<20> After the kernel is finished loading itself, it starts executing
|
||
itself.
|
||
|
||
<20> The kernel converts initrd (which the boot loader loads into memory
|
||
as linux.2) into a "normal" RAM disk.
|
||
|
||
<20> When its done, it mounts the device specified in root_dev (which is
|
||
changed by the Network Boot Program). This usually points to
|
||
/dev/ram0 or /dev/ram1.
|
||
|
||
<20> /linuxrc is executed.
|
||
|
||
<20> When linuxrc terminates, the "real" root file system is mounted
|
||
(which can be the RAM disk)
|
||
|
||
<20> /sbin/init is invoked.
|
||
|
||
For more info, man initrd.
|
||
|
||
|
||
5.2.1.1. Creating initrd fs.
|
||
|
||
The initrd - is a initial ram disk embedded inside a file. Creation of
|
||
such a file is quite straightforward (you have to be root to use
|
||
losetup).
|
||
|
||
|
||
|
||
dd if=/dev/zero of=/root/initrd count=4096 bs=1024
|
||
losetup /dev/loop0 /root/initrd
|
||
mke2fs /dev/loop0
|
||
losetup -d /dev/loop0
|
||
file /root/initrd
|
||
|
||
|
||
|
||
This creates a initrd file 4MB big. The last command should say:
|
||
Linux/i386 ext2 filesystem. This is the file that we eventually use to
|
||
boot the Linux OS on the MP3-box.
|
||
|
||
|
||
5.2.1.2. Mounting initrd fs.
|
||
|
||
|
||
To use the initrd for something its necessary to make a mount-point a
|
||
mount the initrd file:
|
||
|
||
|
||
mkdir /data
|
||
mount /root/initrd /data -o loop
|
||
|
||
|
||
|
||
Now you freely copy files back and forth onto the 4MB initrd file,
|
||
which is mounted under /data.
|
||
|
||
|
||
|
||
5.2.1.3. Copying LRP filesystem to initrd fs.
|
||
|
||
Its time to put something meaningful on the 4MB initrd. We need to
|
||
copy a small linux distribution onto the initrd, otherwise we can't
|
||
use it boot the MP3-box.
|
||
|
||
|
||
cd "2nd Step - configuring client/02 - the filesystem"
|
||
tar -cf - * | (cd /data; tar -xvf - )
|
||
|
||
|
||
|
||
5.2.1.4. Copying custom modules,
|
||
|
||
Do you remember the modules that we compiled in the previous section?
|
||
|
||
|
||
cp -Rf /tmp/lib/modules/2.2.16/* ./data/lib/modules/2.2.16
|
||
sync
|
||
df -h
|
||
|
||
|
||
|
||
df -h serves only to show you how much space you have left on the
|
||
filesystem.
|
||
|
||
|
||
5.2.1.5. Preparing the initrd fs for NBP.
|
||
|
||
Using the initrd file generally means we have to unmount the file,
|
||
gzip it and copy it into the tftpboot directory.
|
||
|
||
|
||
|
||
umount /data
|
||
sync
|
||
gzip -c9 /root/initrd > /tftpboot/X86PC/UNDI/linux-install/linux.2
|
||
|
||
|
||
|
||
This will unmount the initrd, and compress it into linux.2 file (which
|
||
is what the NBP will look for and download).
|
||
|
||
|
||
5.2.1.6. Conclusion
|
||
|
||
That's basicly the method of designing and using an initrd filesystem.
|
||
One thing to keep in mind - the initrd should always be compressed
|
||
when deployed.
|
||
|
||
|
||
5.3. Configuring NBP (Network Boot Program).
|
||
|
||
After you have copied your initrd file and tried to boot up the
|
||
workstation, you found out that the kernel complains about not being
|
||
able to mount the root partition. The problem lies in the NBP that is
|
||
supplied with PXE - it was compiled for RedHat type initrd images, and
|
||
therefore does some changes to the kernel.
|
||
|
||
<20> When the NBP is finished downloading the kernel, it sets the
|
||
root_dev environment to whatever was compiled inside the NBP. By
|
||
default, that is 0101, which is /dev/ram1 (look at its major,
|
||
minor).
|
||
|
||
<20> NBP passes the environment to kernel (in and in turn overwriting
|
||
whatever settings the user supplied to the kernel using rdev) and
|
||
starts it.
|
||
|
||
<20> The kernel happily executes and tries to mount a filesystem from
|
||
/dev/ram1>, while the initrd image sits in /dev/ram0.
|
||
|
||
<20> The kernel hangs.
|
||
|
||
The solution is to recompile the NBP with the right root_flags.
|
||
Look in
|
||
|
||
1st Step - configuring server/02 - pxe/pxe/pxe-
|
||
linux/nbp.linux/prepare.c. Line 212 lists the hexadecimal address.
|
||
Change it to 0x0100 - that way the kernel will mount /dev/ram0 and
|
||
actually find a initrd filesystem.
|
||
|
||
|
||
5.4. Configuring startup scripts.
|
||
|
||
When the kernel completes loading the initrd into memory and mounts it
|
||
as a filesystem, then /sbin/init is executed, which handles the rest
|
||
of starting the operating system.
|
||
|
||
<20> init reads in /etc/inittab - which lists which scripts must be
|
||
executed depending on the computer's state.
|
||
|
||
<20> It starts executing the boot-time configuration script
|
||
/etc/rc.d/rc.boot.
|
||
|
||
<20> rc.boot setups BusyBox and POSIX links, configures all the modules
|
||
- sound, network, and filesystem. If you are using your own
|
||
modules, you must edit this file and change the settings.
|
||
|
||
<20> Then init changes the runlevel to its default - 2, which result in
|
||
running /etc/rc.d/rc.multi.
|
||
|
||
<20> rc.multi setups the network card (configures its IP), mounts the
|
||
NFS server and starts the audio-subsystem (/etc/rc.d/rc.audio). It
|
||
gets all the custom configuration (where is the NFS server. its IP,
|
||
etc) from /etc/rc.conf.
|
||
|
||
<20> rc.audio configures the sound, creates playlists, and starts the
|
||
ARCamp program (which listens to the remote and runs/kills mpg123).
|
||
|
||
The scripts were made as simple as possible. The files you ought to
|
||
look into and alter are:
|
||
|
||
<20> /etc/rc.conf - has the NFS IP, the mountpoint, and the client's IP
|
||
|
||
<20> /etc/rc.d/rc.boot - loads the network module, and the filesystem
|
||
module.
|
||
|
||
<20> /etc/rc.d/rc.audio - loads the sound card module.
|
||
|
||
|
||
5.5. Configuring the infrared receiver program.
|
||
|
||
The Logitech Remote I obtained was quite easy to get working with
|
||
Linux. The software used in Linux was ARCaMP (AST Remote control MP3
|
||
Player). The software basicly listens at the serial port for some
|
||
predefined characters, and based on them, launches mpg123.
|
||
|
||
|
||
5.5.1. Getting scan-codes.
|
||
|
||
|
||
The source code is included in 2nd Step - configuring client/99 - the
|
||
sources/ARCaMP. It differs from the original code - the key mappings
|
||
are different and the default playlist has been altered. If you find
|
||
out that the program works with your remote, but the buttons -> action
|
||
mappings are screwed up, then edit the defs.h to match your scan-codes
|
||
with your remote. Getting the scan-codes is quite easy:
|
||
|
||
|
||
cat /dev/ttyS1 | od -t x2
|
||
0000000 2000 7f10 7f10 7f10 7f10 7f10 7f10 7f10
|
||
0000020 7f10 7f10 202a 7f10 7f10 7f10 7f10 7f10
|
||
0000040 7f10 7f10 7f10 7f10 7f10 7f10 202a 7f10
|
||
0000060 7f10 7f10 7f10 7f10 7f10 7f10 7f10 202a
|
||
0000100 0f0f 0f0f 0f0f 0f0f 0f0f 2a0f 0f20 0f0f
|
||
0000120 0f0f 0f0f 0f0f 2a0f 0f20 0f0f 0f0f 0f0f
|
||
0000140 0f0f 0f0f 202a 1212 1212 1212 1212 2a12
|
||
0000160 1220 1212 1212 1212 1212 2a12 1220 1212
|
||
0000200 1212 1212 1212 1212 1212 202a 1212 1212
|
||
|
||
|
||
|
||
/dev/ttyS1 is the serial port for my infrared receiver, yours might be
|
||
different. od -t x2 converts the output to hexadecimal.
|
||
|
||
|
||
The first eight bytes are just offset locations - ignore them. If you
|
||
look closely at the strings it becomes clear that whenever you hit a
|
||
the same button on the remote, you get similar looking strings of
|
||
numbers. The first three rows are actually the fastforward button
|
||
being hit three times. The repetition of ox20, ox2A, 0x7F, and 0x10
|
||
suggest that 0x20 and/or 9x2A are remote-id number, while 0x7F or 0x10
|
||
are codes for fastforward.
|
||
|
||
The next three rows are for the play button (the scancode is 0x0F).
|
||
And as you can see, the repetition of 0x20, 0x2A suggest remote-id
|
||
again.
|
||
|
||
The last three rows are for the stop button - 0x12.
|
||
|
||
5.5.2. Compiling ARCaMP.
|
||
|
||
Just run make and copy the arcamp file into /data/bin directory -
|
||
assuming you still have the initrd filesystem mounted under /data.
|
||
|
||
|
||
5.5.2.1. Different remote.
|
||
|
||
If you have different remote, and the scancode-match procedure doesn't
|
||
work, then you won't be able to use ARCaMP. Instead you will have to
|
||
search for some software under Linux that will support your remote.
|
||
Look at the ``Remote control programs'' section at the end of the
|
||
document for some URLs.
|
||
|
||
|
||
Just keep in mind, that you will have to modify /etc/rc.d/rc.audio (on
|
||
the initrd fs) so that it will spawn a different program then ARCaMP.
|
||
|
||
|
||
5.5.3. mpg123
|
||
|
||
The program is staticly compiled and put in /bin (on the initrd)
|
||
directory. If you find it necessary to get a more recent version ,
|
||
recompile it with -static flag and put in /bin.
|
||
|
||
|
||
6. Plexiglass box
|
||
|
||
The box can be made of wood, metal or anything else. But the most
|
||
simplest way of building ones box is to use plexiglass. Plexiglass
|
||
under heat - from a torch, kitchen stove - will warm up and is
|
||
susceptible to bending. The disadvantage of plexiglass is that its can
|
||
carry electric charge - thus its unadvisable to put electronic
|
||
components on the plastic - use those small plastic pegs for
|
||
motherboards - glue them on the plexiglass.
|
||
|
||
The design of the box depends on your parts. If you have a small
|
||
motherboard, low-profile sound card and network card, you can make the
|
||
box 4"-5" tall. The placement of motherboard, power supply, and the
|
||
infrared serial receiver all depends on your imagination.
|
||
|
||
In the case of my box, the minimum I could get was 6" height (the
|
||
motherboard + plastic pegs + ISA Sound card). Therefore I decided on
|
||
building a wide box to compensate for the height. The shape of the box
|
||
is semi-pyramid.
|
||
|
||
During the design, heat and air circulation has to be taken into
|
||
account. If you wish to make your system noise-less (without fans),
|
||
make the box big, and drill holes on sides, and on the top so that hot
|
||
air can raise and escape. You also might consider downclocking the CPU
|
||
- that way you can use a heatsink instead of CPU fan. Another
|
||
alternative is to drill holes one side of the box, and put a fan on
|
||
other side, and have the CPU in the middle of the air-flow. Take also
|
||
in consideration your power supply. The small power supplies (83W,
|
||
40W) don't exhaust too much heat and can be safely left without a fan.
|
||
Unfortunately, the bigger they get the more heat they exhaust - and
|
||
the heat has to be drawn out.
|
||
|
||
In my case I decided to use one fan to cool down the power supply and
|
||
CPU. The fan is mounted on top of the power supply. The power supply
|
||
has exhaust vents on top, from which heat escapes. The CPU is located
|
||
20cm away from the fan, under 45" angle - also not that far away from
|
||
the CPU I drilled some holes to suck in fresh air. What essentially
|
||
happens is that outside air is sucked in thru the holes, passes over
|
||
the CPU and then combined with the air from the power supply is sucked
|
||
out by a fan. For pictures: check mpeg-box pictures
|
||
<http://darnok.dhs.org/~konrad/projects/mpeg-box/>.
|
||
|
||
|
||
|
||
7. Answers to Frequently Asked Questions
|
||
|
||
7.1. Can't compile the kernel. It says: "2nd: No such file or direc<65>
|
||
tory"
|
||
|
||
Move the whole linux-2.2.16 directory somewhere else where the
|
||
directory-name doesn't have spaces in itself.
|
||
|
||
|
||
7.2. My remote doesn't work with ARCaMP
|
||
|
||
Tough! :P
|
||
|
||
You will have to look for some other software that will support your
|
||
remote control. Look in the ``Remote programs URL'' section.
|
||
|
||
|
||
|
||
7.3. The Linux kernel can't mount the filesystem.
|
||
|
||
|
||
Look in ``Configuring - NBP Network Boot Program''
|
||
|
||
|
||
7.4. How do I bend plexiglass?
|
||
|
||
Get a torch and heat the opposite side of the plexiglass that you are
|
||
going to bend. You should move the torch back and forth, not to fast,
|
||
and not too slow. One minute - two minutes should be fine, if you warm
|
||
up it too much, bubbles will appear. After you have heated the
|
||
material, put in on table and slowly bend it. Keep it under the
|
||
desired angle up to a minute.
|
||
|
||
|
||
7.5. The system doesn't boot up after I take the video card out.
|
||
|
||
Go into the BIOS settings and change the Video Mode (it might be
|
||
called something else on your system) and change from CGA/EGA or VGA
|
||
to None.
|
||
|
||
|
||
|
||
8. References
|
||
|
||
8.1. Remote control programs
|
||
|
||
|
||
<20> IRC is a package that supports receiving and sending IR signals of
|
||
the most common IR remote controls. It contains a daemon that
|
||
decodes and sends IR signals, a mouse daemon that translates IR
|
||
signals to mouse movements, and a couple of user programs that
|
||
allow to control your computer with a remote control. www.lirc.org
|
||
<http://www.lirc.org>
|
||
|
||
<20> Cajun is a program that allows you to turn any computer (>75mhz)
|
||
into a massive audio jukebox for your car or home. It uses the
|
||
matrix-orbital serial display and supports the IRman infra-red
|
||
remote control interface. Soundcard output is delivered to your
|
||
(car or home) stereo for amplification. The software supports a
|
||
hotlist and shuffle mode. cajun.sourceforge.net
|
||
<http://cajun.sourceforge.net>
|
||
|
||
<20> IRMP3 is a multimedia audio jukebox for Linux. IRMP3's strength is
|
||
that it easily integrates into home, car, and mobile environments
|
||
(where a keyboard/screen interface may not always be available). It
|
||
supports several input and display devices such as infrared remote
|
||
controls, LCD displays, network connections, and serial keypads. It
|
||
includes a robust set of tools like alarms, sound environments,
|
||
mixers, sleep functions, and more. It supports MP3 players and
|
||
network-ready control & status monitoring, and includes a flexible,
|
||
modularized source which allows functionality to be easily extended
|
||
with user-developed code. www.dpotter.com/irmp3
|
||
<http://www.dpotter.com/irmp3>
|
||
|
||
|
||
|