Diskless-From-NT.txt 20KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565
  1. The Diskless Terminal running from NT server Mini-HOWTO
  2. Pavel Tkatchouk, ptkatcho@portal.ca
  3. v0.1, June 19th 1999
  4. Table of Contents
  5. 1. Introduction.
  6. 1.1 What is it for?
  7. 1.2 Do we need this HOWTO?
  8. 1.3 A bit of History.
  9. 2. Project description.
  10. 2.1 Packaging.
  11. 2.2 Image.
  12. 2.2.1 Kernel.
  13. 2.2.2 MRFS.
  14. 2.2.3 Building MRFS.
  15. 2.3 Remotefs.
  16. 2.4 Booting sequence.
  17. 2.4.1 BOOTP, TFTP.
  18. 2.5 Bootprom.
  19. 3. Resources.
  20. 4. Copyright.
  21. 5. Feedback and credits.
  22. 1. Introduction.
  23. 1.1. What is it for?
  24. This document describes how to build software distribution to run Java client on diskless
  25. terminal booted from Microsoft Windows 95/98/NT workstation. Package can also be easily
  26. modified to be used as Linux terminal or X Windows terminal's software. I found it also
  27. convenient for setup over the Ethernet of floppyless PS's, hard disk of which for some
  28. reason can not be accessed (sealed case under warranty, etc.).
  29. 1.2. Do we need this HOWTO?
  30. To be honest, I'm not sure. There are few excellent HOWTO's (see 3. Recources) that up until
  31. recently I considered quite sufficient to build what I've done two years ago. But since my
  32. project uses MS Windows as a file server vs. traditional NFS there were some know-how's
  33. involved which number of people wanted to see in some formal document.
  34. 1.3. A bit of history.
  35. My project at that time (1996) was to find OS/JVM that will allow to run Java application
  36. on hardware we manufacture. Hardware is practically generic x86 PC except it has no keyboard,
  37. hard drive, floppy drive, mouse, but touchscreen over LCD, plus some POS specific peripherals
  38. (badge reader, credit card reader, etc.). Due to cost consideration it had no any significant
  39. storage, so OS and Java client along with support binaries, libraries etc. had to be loaded
  40. remotely. Because our clients are exclusively Windows shops, Server had to be Windows as well.
  41. During evaluation of different commercial OS'es along with JVM's available it become apparent
  42. to my surprise that most promising solution was GPL one - Linux.
  43. 2. Project description.
  44. 2.1. Packaging.
  45. The whole distribution consists of remote file system (RemoteFS) residing on MS Windows
  46. server (NT Workstation, NT Server or Windows9x) and tagged bootable image.
  47. 2.2. Image.
  48. Image (~1.5MB) is generated by mknbi utility that comes with Etherboot package
  49. <http://etherboot.sourceforge.net>. It can include minimal root file system (MRFS)
  50. like in my case (since I had to boot client from MS Windows server and Linux kernel doesn't
  51. support SMBFS-Root, only NFS-Root. So I had to keep rootfs in the ramdisk). To generate
  52. image the following script can be used.
  53. #!/bin/sh
  54. # mkrootnet: makes tagged netbootable image
  55. # This image includes kernel and minimal root filesystem
  56. # to do initial boot.
  57. #
  58. # Copyright (c) Pavel Tkatchouk 1996. All rights reserved.
  59. # Permission is granted for this material to be freely
  60. # used and distributed, provided the source is acknowledged.
  61. # No warranty of any kind is provided. You use this material
  62. # at your own risk.
  63. #
  64. DEVICEFILENAME="/tmp/file" # temporary file to be used as device
  65. FSBLOCKS=4096 # uncompressed filesystem size in K
  66. BOOTDISKDIR="/usr/BOOT/ROOTFS" # root filesystem model
  67. MOUNT="/mnt2" # temporary mount point
  68. ROOTFS="/tmp/rootfs" # root filesystem image
  69. ROOTFSGZ="/tmp/rootfs.gz" # compressed root filesystem image
  70. KERNEL="/usr/KERNELS/vmlinuz-nt" # kernel image
  71. KERNELTMP="/tmp/vmlinuz" # temporary copy of kernel image
  72. BOOTIMAGE="/tmp/img" # tagged image to be booted by client
  73. # if you want ramisk more than default 4096 set CMDLINE, don't forget to
  74. # adjust $FSBLOCKS
  75. # CMDLINE="ramdisk_size=8192" # parameters to pass to the kernel
  76. #
  77. echo "check:"
  78. echo "- if tftp server's download dir mounted to /mnt"
  79. echo "- loopback device is built-in or loaded"
  80. echo "\n press Enter when done"
  81. read tmp
  82. UPLOAD="/mnt/tmp" # tftp server's dir to upload bootimage
  83. echo -e "\nZeroing $DEVICEFILENAME of $FSBLOCKS k"
  84. echo "to be used as device for root filesystem model"
  85. dd if=/dev/zero of=$DEVICEFILENAME bs=1k count=$FSBLOCKS
  86. echo -e "\nMaking file system on $DEVICEFILENAME"
  87. mke2fs -m 0 $DEVICEFILENAME
  88. echo "Mounting $DEVICEFILENAME as a loopback device"
  89. mount -o loop -t ext2 $DEVICEFILENAME $MOUNT
  90. curdir=`pwd`
  91. cd $BOOTDISKDIR
  92. echo -e "Copying files from $BOOTDISKDIR to $DEVICEFILENAME, please wait"
  93. find . -print|cpio -pmd $MOUNT
  94. echo "Unmounting $MOUNT"
  95. umount $MOUNT
  96. cd $curdir
  97. echo "Copying $DEVICEFILENAME to $ROOTFS"
  98. dd if=$DEVICEFILENAME of=$ROOTFS bs=1k
  99. echo "Compressing $ROOTFS, it may take a while"
  100. echo "Please wait..."
  101. if [ -f $ROOTFSGZ ];then
  102. rm -f $ROOTFSGZ
  103. fi
  104. gzip -c $ROOTFS>$ROOTFSGZ
  105. rm -f $ROOTFS
  106. echo -e "\nCreating netbootable image"
  107. cp $KERNEL $KERNELTMP
  108. mknbi -d ram -i rom -r $ROOTFSGZ -k $KERNELTMP -a $CMDLINE -o $BOOTIMAGE
  109. echo "Uploading $BOOTIMAGE to $UPLOAD"
  110. cp $BOOTIMAGE $UPLOAD
  111. echo "Cleaning after ourselves"
  112. rm -f $KERNELTMP $DEVICEFILENAME $BOOTIMAGE
  113. echo "All done"
  114. In the above script actual image is generated by the following comand
  115. #mknbi -d ram -i rom -r rootfs.gz -k vmlinuz-nt -o img
  116. where:
  117. rootfs.gz - minimal root file system (MRFS);
  118. vmlinuz-nt - kernel;
  119. img - resulting image.
  120. Note:
  121. Default ramdisk size is 4096. It was enough for RedHat4.1 based minimal file system, but
  122. apparently not enough for 5.2 based. When this happens "end request:I/O error, dev 01:00 ..."
  123. error shows up. To fix that either use "mknbi -a ramdisk_size=8192" to pass parameter to the
  124. kernel (doesn't require kernel recompilation), or change /usr/src/linux/drivers/block/rd.c:
  125. int rd_size= from 4096 to 8192 or whatever and rebuild the kernel.
  126. 2.2.1. Kernel.
  127. Kernels 2.0.30 and 2.0.36 have been used by author, although nothing is preventing you from
  128. experimenting with others. Kernel should include ramdisk support. The following
  129. <link to .config> configuration has been used to build <link to binary (kernel 2.0.30)>.
  130. You may find some components unnecessary, just exclude them and rebuild.
  131. Don't forget to change root device after you built the kernel (rdev vmlinuz /dev/rd).
  132. Gotcha's: apparently smbfs is broken in 2.2.x kernels. Symptoms: remote share is mounted
  133. just fine but after a while fails with "smb_request: result = -32" errmsg. I've heard
  134. SuSe has fix for that.
  135. 2.2.2. MRFS.
  136. Minimal root file system is required to get Linux up and running along with networking until
  137. it can mount remote file system to run X/Java from there. After image gets loaded from the
  138. server MRFS is decompressed into ramdisk. If you can afford a lot of ram on your terminal the
  139. entire remote file system can be moved to rootfs.gz. That will make your terminal more
  140. responsive.
  141. 2.2.3. Building MRFS.
  142. Some folks found it easier to start from scratch, others use known "minimal" Linux distributions
  143. (Linux Router, tomsrtbt, etc.), yet others prefer to start from "big" Linuces like I did. Every
  144. path has it's pro and contras.
  145. Pruning standard distribution (RedHat, Debian, etc.) to your needs might be very time consuming.
  146. To ease that painful process I have used remotely booted diskless client with NFS-Root (see
  147. Etherboot's Readme, NFS-Root and NFS-Root-Client mini-HOWTO's, Diskless-HOWTO):
  148. - setup minimal RedHat4.1 install (networked workstation, X, no development, mail, etc., ~117MB);
  149. - find . -print|cpio -pmd /usr/NFS/ROOTFS - copy entire fs tree to NFS exported dir;
  150. - mknod /usr/NFS/ROOTFS/dev/nfsroot b 0 255;
  151. - build vmlinuz-nfs kernel according to NFS-Howto (built-in bootp,rarp,NFS,NFS root,NIC
  152. driver,RAM disk);
  153. - rdev vmlinuz-nfs /dev/nfsroot - to set NFS root device;
  154. - build image for NFS-Root fs:
  155. #mknbi -d rom -i rom -k vmlinuz-nfs -o nfsImage;
  156. - boot client while monitoring NFS file requests (by Solaris snoop);
  157. - copy files from /usr/NFS/ROOTFS to /usr/BOOT/ROOTFS (MRFS model) according to snoop's
  158. filelist;
  159. - generate image by mkrootnet script (don't forget to point to the right kernel vmlinuz-nt).
  160. The above trick not only allows to determine the sought files set but also debug boot process
  161. analyzing NFS messages. I found it convenient to put "read tmp" statements into init scripts
  162. for debugging. Tracking files up until issuing login gives you <link to rootfs.gz> MRFS (~1MB)
  163. that can be used to boot Linux from ROM (flash, eprom, DiskOnChip, SanDisk, etc.) as well. All
  164. the other files requested by client (during starting X, Java, Java client) were put into (link
  165. to remotefs.zip, ~9MB).
  166. To restore MRFS model on your PC from the above rootfs.gz:
  167. - #cd /tmp
  168. - #gunzip rootfs.gz
  169. - #mount -o loop -t ext2 /tmp/rootfs /mnt
  170. - #cd /mnt
  171. - #find . -print|cpio -pmd /usr/BOOT/ROOTFS
  172. - #umount /mnt
  173. Note:
  174. You will have to change attributes of some dirs, files (/etc/mtab, /etc/mtab~, /var/lock/subsys/*,
  175. /var/run/*, /dev/tty*, etc.) against standard. This is because with standard attribs diskless
  176. client refused to work. For example I had to change /dev/tty* ownerships to 99:99 from original
  177. 0:0 or 0:5, to get rid of errmsg "INIT: Id "1" respawning too fast: disabled for 5 minutes".
  178. Being admin illiterate I just chmod them to 777 and chown to 99:99 to make life easier.
  179. THIS IS SERIOUS SECURITY VIOLATION!!! Using keyboardless terminal with no daemons running in
  180. my case reduces the risk, yet I would appreciate very much those more experienced who will help
  181. to restore the right attribs while keeping the distribution working.
  182. Some "gotcha's" to watch for during MRFS building:
  183. - standard attributes/ownership of some files don't work;
  184. - rdev must be set (non-tagged image didn't work, so couldn't use config file to pass parrs
  185. to the kernel);
  186. - diskless client writes 99:99 ownership on generated files;
  187. - "password incorrect" for root, but any other OK and su OK too.
  188. 2.3. RemoteFS.
  189. Remotefs.zip file includes everything required by the system that can be located on
  190. remote file system, i.e after booting has been complete and remote file system mounted.
  191. In my case it is X Windows System and Java binaries, libraries etc. To use that file on
  192. MS Windows NT:
  193. - unzip remotefs.zip to some directory;
  194. - share this directory read-only as "usr" (or share as some other name and pass this name to
  195. the client through bootptab configuration file for BOOTP server;
  196. - create an account username=root, password=linux on NT (can be set in bootptab).
  197. Note:
  198. There's no symbolic links on NTFS, so UNIX links must be replaced by copies on NTFS.
  199. To determine potential troublmakers one could use the following:
  200. - first copy required subset (according to snoop's intercept) from /usr/NFS/ROOTFS to
  201. /usr/BOOT/REMOTEFS;
  202. - mount some share from NTFS to /mnt;
  203. - /usr/BOOT/REMOTEFS#find . -print|cpio -pmd /mnt 2>links;
  204. In the links file you will find names to work with.
  205. 2.4. Booting sequence.
  206. Boot occurs in the following sequence:
  207. - bootprom sends bootp request,
  208. - bootp server responds with subnet mask, client's name, client's IP, TFTP server's IP,
  209. bootfile name and some optional parameters (like NT's username/password to use it's share,
  210. you could pass some other share name here as say T104="somedir");
  211. - bootprom downloads image from TFTP server;
  212. - kernel starts;
  213. - kernel decompresses MRFS in RAM;
  214. - system starts init using ramdisk root,
  215. - mounts remote file system from NT via SMBFS;
  216. - automatically logins;
  217. - starts xstart script located on remotefs (/usr/sbin) where you can start any of your
  218. programs, change parameters, etc. without rebuilding the image.
  219. Below are some config/init sample files from <rootfs.gz>, <remotefs.zip>:
  220. <bootptab, change to link>
  221. t1:sm=255.255.255.0:sa=192.168.33.150:bf=img:T100="pavelnt4":T101="root":T102="linux"
  222. touch1:hn=touch1:tc=t1:ha=00A0F00035CD:ip=192.168.33.127
  223. </etc/fstab, change to link>:
  224. /dev/ram / ext2 defaults 1 1
  225. /proc /proc proc defaults 0 0
  226. </etc/rc.d/rc.bootp, change to link later>:
  227. #!/bin/sh
  228. # Written to simply set the IP stuff up from the
  229. # bootpc data.
  230. # Last updated : Mon Mar 10 15:17:01 1997
  231. #
  232. # Variables
  233. BOOTPC=/sbin/bootpc
  234. IFCONFIG=/sbin/ifconfig
  235. ROUTE=/sbin/route
  236. BINHOST=/bin/hostname
  237. DEV=eth0
  238. ASKSERVER="255.255.255.255"
  239. TW="--timeoutwait 320"
  240. RIF="--returniffail"
  241. RIFMESSAGE="Bootp failed -- disabling network."
  242. RCONF=/etc/resolv.conf
  243. EHOSTS=/etc/hosts
  244. LHOSTS=/etc/hosts.local
  245. TMPFILE=/tmp/bootp
  246. # Functions
  247. # Remove the networking by taking down the interface
  248. netdown() {
  249. ${ROUTE} del default
  250. ${IFCONFIG} ${DEV} down
  251. }
  252. ## End of the functions
  253. ## Start of the actual work
  254. # Bring up minimal networking use 0.0.0.0 as our address as we don't
  255. # know it yet (Means "Me but I don't know my address or network")
  256. ${IFCONFIG} ${DEV} up 0.0.0.0
  257. ${ROUTE} add default dev ${DEV}
  258. # Perform the bootp -- doesn't return unless it gets an answer
  259. if ${BOOTPC} --dev ${DEV} --server ${ASKSERVER} ${RIF} ${TW} > ${TMPFILE}
  260. then
  261. # Take down networking (use the 0.0.0.0 for as short a time as possible)
  262. netdown
  263. # Read in the values
  264. . ${TMPFILE}
  265. # To use in mountsmb script later
  266. SMBSERVER=${T100}
  267. # And delete the temporary file
  268. # rm ${TMPFILE}
  269. else
  270. # Take down networking (use the 0.0.0.0 for as short a time as possible)
  271. netdown
  272. # give message and quit
  273. echo ${RIFMESSAGE}
  274. exit 1
  275. fi
  276. # Start the loopback interface and add a route to it
  277. # It's already set by standard init?
  278. ${IFCONFIG} lo 127.0.0.1
  279. ${ROUTE} add -net 127.0.0.0
  280. # Setup of IP stuff needs doing first
  281. #
  282. if [ -z "${NETMASK}" ] ; then
  283. # No netmask info, all this is guessed from the IP number
  284. # If this is wrong for your network FIX the bootpd to know
  285. # what it should send in the RFC1497 cookie! 11/02/94 JSP
  286. #
  287. ${IFCONFIG} ${DEV} up ${IPADDR} broadcast ${BROADCAST}
  288. ${ROUTE} -n add -net ${NETWORK} dev ${DEV}
  289. else
  290. # We will have NETMASK, BROADCAST, and NETWORK defined
  291. ${IFCONFIG} ${DEV} up ${IPADDR} broadcast ${BROADCAST} netmask ${NETMASK}
  292. ${ROUTE} -n add -net ${NETWORK} dev ${DEV}
  293. fi
  294. # Set the hostname from what we got via bootp or reverse lookup
  295. echo "127.0.0.1 loopback localhost">${EHOSTS}
  296. ${BINHOST} "${HOSTNAME}"
  297. echo "${IPADDR} ${HOSTNAME}" >>${EHOSTS}
  298. echo "${SERVER} ${SMBSERVER}" >>${EHOSTS}
  299. </etc/rc.d/rc.local, change to link>:
  300. #!/bin/sh
  301. # This script will be executed *after* all the other init scripts.
  302. # You can put your own initialization stuff in here if you don't
  303. # want to do the full Sys V style init stuff.
  304. #
  305. # 07/02/97 Pavel Tkatchouk
  306. #
  307. echo "Start networking"
  308. insmod /lib/8390.o
  309. insmod /lib/ne.o io=0x300 irq=9
  310. echo "Install serial"
  311. insmod /lib/serial.o
  312. echo "Install touch"
  313. insmod /lib/touch.o
  314. echo "Install smbfs"
  315. insmod /lib/smbfs.o
  316. echo "Getting TCP/IP parameters from bootp server"
  317. echo "and start networking"
  318. /etc/rc.d/rc.bootp
  319. if [ -f /etc/squirrel-release ]; then
  320. R=$(cat /etc/squirrel-release)
  321. else
  322. R="release 0.02"
  323. fi
  324. echo "Mounting remote fs"
  325. /sbin/mountsmb
  326. echo "XYZ Inc. Diskless Linux $R"
  327. echo "Starting X and Java client without login"
  328. su -c /sbin/xstart root
  329. </usr/sbin/xstart, change to link>:
  330. #!/bin/bash
  331. #
  332. # Script to start X and Java client
  333. # 08/07/97 Pavel Tkatchouk
  334. #
  335. # Read bootps response first
  336. . /tmp/bootp
  337. # -s 0 to disable screen-saver
  338. /usr/X11R6/bin/X -s 0 &
  339. export DISPLAY=:0.0
  340. # /usr is share mounted from Windows workstation
  341. cd /usr/program/
  342. java SomeJavaApp
  343. </sbin/mountsmb, change to link>:
  344. #!/bin/bash
  345. # mountsmb: mounts remote filesystems from NT workstation
  346. # using Microsoft's SMB protocol
  347. #
  348. # Copyright (c) Pavel Tkatchouk 1997. All rights reserved.
  349. # Permission is granted for this material to be freely
  350. # used and distributed, provided the source is acknowledged.
  351. # No warranty of any kind is provided. You use this material
  352. # at your own risk.
  353. #
  354. # Last edit June 29 8:30 1997
  355. #
  356. MOUNTDIR="usr"
  357. SHRDIR="usr"
  358. BOOTPRES="/tmp/bootp"
  359. # Read botpc response
  360. . ${BOOTPRES}
  361. # Sharename from NT server, uncomment if you want to use
  362. # non-hardcoded "usr" but from bootptab
  363. #SHRDIR=${T104}
  364. SMBSRV="//${T100}"
  365. CLIENT="${HOSTNAME}"
  366. USER="${T101}"
  367. PASSWORD="${T102}"
  368. echo -e "\nMounting $SMBSRV/$SHRDIR to /$MOUNTDIR"
  369. smbmount $SMBSRV/$SHRDIR $MOUNTDIR -c $CLIENT -U $USER -P $PASSWORD
  370. echo -e "\nDone"
  371. Gotcha's:
  372. Looks like smbmount client from smbfs package used to mount remote Windows shares to local
  373. Linux dirs in pre 2.2.x era isn't maintained anymore so you should use one coming with
  374. Samba package. Also binary smbmount won't work with 2.2.x, so you have to recompile with
  375. 2.2.x headers following Samba's readme. Yet even that won't guarantee reliable work until
  376. somebody fixes kernel's smbfs module.
  377. 2.4.1. BOOTP, TFTP.
  378. There are number of BOOTP, TFTP servers for Windows on the market. You could find them
  379. here:
  380. - www.walusoft.co.uk (Walusoft's tftp);
  381. - ftp.coast.net/simtel/nt/internet/tftpds12.zip (Millwood AB's tftp);
  382. - ftp.cabletron.com/pub/snmp/bootftp/boottft2.zip (Cabletron's bootp/tftp combo);
  383. - www.tellurian.au.com (Tellurian's bootp, tftp, dhcp servers).
  384. - www.metainfo.com (Metainfo's DHCP server)
  385. - www.nts.com (Network Telesystems's DHCP server in IPserver package)
  386. My choice was Tellurian's products - very reliable, simple to install, attractively priced
  387. (fully capable evaluation versions are available).
  388. 2.5. Bootprom.
  389. Ken Yap's Etherboot <etherboot.sourceforge.net> will tell you everything about bootprom.
  390. Here I just want to mention that normally you would have to put bootprom's code into network
  391. adapter's PROM. But if your hardware like mine has BIOS programmed in flash you could
  392. re-program it to add bootprom (some BIOS requires special programmer to do that, others don't)
  393. as BIOS extension.
  394. This is what I did to add ne.rom (bootprom generated by Etherboot's makerom for NE2000 clone)
  395. to AMI BIOS on my flash:
  396. - read flash content by programmer into bios.bin binary file;
  397. - use one of available binary editors (say www.simtel.net/Win95/editors/hxp3005.zip to add
  398. ne.rom to bios.bin (and to edit ne.rom if necessary);
  399. - write new bios.bin back to flash.
  400. Notes:
  401. - makerom generates bootprom for standard EPROM sizes (8k, 16k, 32k, etc.), so if you tight on
  402. space use -s flag to adjust size (or cut it manually to multiple of 512 bytes blocks, just
  403. don't forget to adjust extension's length which is coded in Byte 2 and checksum to 8 bits
  404. of zero;
  405. - valid absolute addresses for BIOS extensions are from 0xC8000 to 0xF4000 (check with
  406. motherboard's manufacturer how flash is mapped onto system memory space);
  407. - Byte 0 must be 0x55, Byte 1 must be 0xAA, Byte 2 must be extension's length in 512 bytes
  408. blocks;
  409. - extension BIOS has to start at a 2k boundary;
  410. 3. Resources.
  411. FAQ's:
  412. - tomsrtbt.FAQ (www.toms.net);
  413. HOWTO's:
  414. - Paul Moody's miniHOWTO (www.linuxembedded.com/pmhowto.html)
  415. - Diskless;
  416. - Diskless-HOWTO;
  417. - NFS-Root;
  418. - NFS-Root-Client;
  419. - Bootdisk-HOWTO;
  420. - BootPrompt-HOWTO;
  421. - NCD-X-Terminal;
  422. - Remote-Boot;
  423. - Remote-X-Apps;
  424. Web:
  425. - etherboot.sourceforge.net/
  426. - www.waste.org/~zanshin
  427. - www.tellurian.com.au.
  428. - www.toms.net
  429. - www.trinux.org
  430. - www.linux.org.uk/ELKS-Home
  431. - www.embedded.com
  432. - www.linuxembedded.com
  433. - www.thinlinux.org
  434. - www.linuxrouter.org
  435. - linux-mandrake.com
  436. - www.disklessworkstations.com
  437. Newsgroups:
  438. - comp.arch.embedded
  439. Lists:
  440. - netboot-owner@baghira.han.de
  441. - linux-embedded@waste.org
  442. Magazines:
  443. - Circuit Cellar #100 - 105
  444. 4. Copyright.
  445. Copyright (c) Pavel Tkatchouk 1999.
  446. Permission is granted for this material to be freely used and distributed, provided the source
  447. is acknowledged. Copyright policy is GPL as published by the Free Software Foundation.
  448. No warranty of any kind is provided. You use this material at your own risk.
  449. 5. Feedback and credits.
  450. Since I am neither have a lot of Linux experience nor native English speaker, there would be
  451. errors in this document. I would accept any help with gratitude whether in form of proof-reading,
  452. techical corrections or otherwise. Please send your comments, suggestions and questions to Pavel
  453. Tkatchouk (ptkatcho@portal.ca)
  454. I wish to thank Pierre Mondie who convinced me to start this document. I'm also very much in
  455. debt to all those who's work made this project possible:
  456. Ken Yap <ken_yap@users.sourceforge.net> (Etherboot)
  457. David Newall <www.tellurian.com.au> (Bootpdnt/Ftpdnt)
  458. (to be continued)