LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 5079|回复: 4

制作U盘上的Knoppix

[复制链接]
发表于 2005-1-8 08:30:59 | 显示全部楼层 |阅读模式
开源教学

制作U盘上的Knoppix



这篇文章来自于 开源教学
http://oedu.org/

这篇文章的URL是:
http://oedu.org/modules.php?op=m ... =article&sid=48


文章 / 教学应用中Linux相关技术
日期: 2004 年 11 月 13 日 - 11:06 AM
将来,每个学生都将有自己独立的信息技术环境。一人一台笔记本也许还很遥远,但一人一个独立操作系统是容易实现的,如,用USB盘建立基于Knoppix的个人随身带系统,这个系统将存储关键的个人信息,而真正的程序和资料都是存储在远端的网络服务器上的。

原作:Matthias Müller
翻译:kaikai

你所需要的:
#Knoppix或一个单独可下载支持cloop压缩包的内核版本。

修改miniroot.gz是必须的,因为要加入usb-uhci.o, usb-ohci.o 和 usb-storage.o,否则地话,Knoppix会找不到cloop在哪里。(这一点和我原先的分析是一样的)

#一个可启动的U盘(毫无疑问)

#电脑的BIOS支持U盘启动

#syslinux,grub等启动软件

准备工作:
下载Damn Small Linux for this (只有51MB并且还装了 fluxbox,可怜,kaikai自己定制最小Knoppix图形界面的工作看来已经有人做过了),并且,其他各种Knoppix定制版也是可以用的,有时候使用哪种版本要取决于内存有多大。

修改miniroot.gz:
首先是修改boot-image (KNOPPIX/boot.img)。挂载之(mount -o loop boot.img /mnt/xxx),复制里面的东西到某目录(如 ~/knoppix-usb/bootdisk),关键是修改其中miniroot.gz里的linuxrc,那是一个启动脚本,把USB驱动驱动加载进去。

用gunzip解开miniroot.gz并挂载之(mount -o loop miniroot /mnt)。编辑linuxrc,现在加载USB模块并休息一会,估计时间会比较长,把USB存储盘作为/dev/sda:

# load usb-modules first (so that memory-stick becomes /dev/sda1)
# uncomment for USB 2.0 support (experimental)
#insmod -f /modules/usb/ehci-hcd.o
insmod -f /modules/usb/usbcore.o
insmod -f /modules/usb/usb-uhci.o
insmod -f /modules/usb/uhci.o
insmod -f /modules/usb/usb-ohci.o
insmod -f /modules/usb/usb-storage.o
# need to sleep because it takes some time to register things
ash -c "sleep 4"

接下来就是把root-fs挂到/cdrom上的工作,把linuxrc里的那个#注释去掉,原来的样子应该是这样的:

# mount /dev/sda1 (memorystick to cdrom)
FOUND_KNOPPIX="/dev/sda1"
mount -t vfat /dev/sda1 /cdrom

怎么,搞不明白吗?作者把整个脚本文件都列出来了,谨向作者至以深深的敬意和无比的感谢!

#!/static/sh
#
# KNOPPIX General Startup Script
# &#169; Klaus Knopper <knoppix@knopper.net>
#
#
# This script needs some of the builtin ash commands (if, test, ...)
# mount/umount, insmod/rmmod are also a builtin in ash-knoppix.
#

# hardcoded configurable options
# Default maximum size of dynamic ramdisk in kilobytes
RAMSIZE=1000000
# End of options

# Don't allow interrupt signals
trap "" 1 2 3 15

# "Safe" SCSI modules in the right order for autoprobe
# Warning: The sym53c8xx.o and g_NCR* cause a kernel Oops if no such adapter
# is present.
#
# NB: It looks like that ncr53c8xx.o is more stable than 53c7,8xx.o for
# a ncr53c810 controller (at least on my installation box it's more
# immune to SCSI timeouts)
# Removed 53c7,8xx -> crashes if no device attached.
# Removed AM53C974 -> crashes tmscsim if adapter found
# Added initio.o on request (untested)
SCSI_MODULES="aic7xxx.o aic7xxx_old.o BusLogic.o \
ncr53c8xx.o NCR53c406a.o \
initio.o \
advansys.o aha1740.o aha1542.o aha152x.o \
atp870u.o dtc.o eata.o fdomain.o gdth.o \
megaraid.o pas16.o pci2220i.o pci2000.o psi240i.o \
qlogicfas.o qlogicfc.o qlogicisp.o \
seagate.o t128.o tmscsim.o u14-34f.o ultrastor.o wd7000.o \
a100u2w.o 3w-xxxx.o"

# Misc functions

mountit(){
# Usage: mountit src dst "options"
# Uses builtin mount of ash.knoppix
# Builin filesystems
BUILTIN_FS="iso9660 ext2 vfat"
for fs in $BUILTIN_FS; do
test -b $1 && mount -t $fs $3 $1 $2 >/dev/null 2>&1 && return 0
done
return 1
}

FOUND_SCSI=""
FOUND_KNOPPIX=""
INTERACTIVE=""

# Clean input/output
exec >/dev/console </dev/console 2>&1

# Reset fb color mode
RESET="]R"
# ANSI COLORS
# Erase to end of line
CRE="
"
# Clear and reset Screen
CLEAR="c"
# Normal color
NORMAL=""
# RED: Failure or error message
RED=""
# GREEN: Success message
GREEN=""
# YELLOW: Descriptions
YELLOW=""
# BLUE: System mesages
BLUE=""
# MAGENTA: Found devices or drivers
MAGENTA=""
# CYAN: Questions
CYAN=""
# BOLD WHITE: Hint
WHITE=""

# Clear screen with colormode reset
# echo "$CLEAR$RESET"
# echo "$CLEAR"
# Just go to the top of the screen
# echo -n ""
echo ""
# Be verbose
echo "${WHITE}Welcome to the ${CYAN}K${MAGENTA}N${YELLOW}O${WHITE}P${RED}P${GREEN}I${BLUE}X${WHITE} live Linux-on-CD!${NORMAL}"
echo ""
echo ""

# We only need the builtin commands and /static at this point
PATH=/static
export PATH

umask 022

# Mount /proc and /dev/pts
mount -t proc none /proc
mount -t devpts none /dev/pts

# Read boot command line with builtin cat command (shell read function fails in Kernel 2.4.19-rc1)
CMDLINE="$(cat /proc/cmdline)"

# Check if we are in interactive startup mode
case "$CMDLINE" in *BOOT_IMAGE=expert\ *) INTERACTIVE="yes"; :>/interactive; ;; esac
# Does the user want to skip scsi detection?
NOSCSI=""
case "$CMDLINE" in *noscsi*) NOSCSI="yes"; ;; esac

# Disable kernel messages while probing modules in autodetect mode
echo "0" > /proc/sys/kernel/printk

# Mount module disk
mountmodules(){
TYPE="$1"; shift
echo -n "${CRE}${CYAN}Please insert ${TYPE} modules disk and hit Return. ${NORMAL}"
read a
echo -n "${CRE}${BLUE}Mounting ${TYPE} modules disk... ${NORMAL}"
# We always mount over /modules/scsi (because it's there ;-)
if mountit /dev/fd0 /modules/scsi "-o ro"; then
echo "${GREEN}OK.${NORMAL}"
return 0
fi
echo "${RED}NOT FOUND.${NORMAL}"
return 1
}

# Unmount module disk
umountmodules(){
TYPE="$1"; shift
echo -n "${CRE}${BLUE}Unmounting ${TYPE} modules disk... ${NORMAL}"
umount /modules/scsi 2>/dev/null
echo "${GREEN}DONE.${NORMAL}"
}

# Ask user for modules
askmodules(){
TYPE="$1"; shift
echo "${BLUE}${TYPE} modules available{WHITE}"
c=""; for m in "$@&amp;amp;amp;amp;quot;; do
if test -f "/modules/scsi/$m"; then
test -z "$c" && { echo -n " $m"; c="1"; } || { echo " $m"; c=""; }
fi
done
[ -n "$c" ] && echo ""
echo "${CYAN}Load ${TYPE} Modules?${NORMAL}"
echo "${CYAN}[Enter full filename(s) (space-separated), Return for autoprobe, ${WHITE}n${CYAN} for none] ${NORMAL}"
echo -n "${CYAN}insmod module(s)> ${NORMAL}"
read MODULES
case "$MODULES" in n|N) MODULES=""; ;; y|"") MODULES="$*"; ;; esac
}

# Try to load the given modules (full path or current directory)
loadmodules(){
TYPE="$1"; shift
test -n "$INTERACTIVE" && echo "6" > /proc/sys/kernel/printk
for i in "$@&amp;amp;amp;amp;quot;; do
echo -n "${CRE}${BLUE}Probing ${TYPE}... ${MAGENTA}$i${NORMAL}"
if test -f /modules/scsi/$i && insmod -f /modules/scsi/$i >/dev/null 2>&1
then
echo "${CRE} ${GREEN}Found ${TYPE} device(s) handled by ${MAGENTA}$i${GREEN}.${NORMAL}"
case "$TYPE" in scsi|SCSI) FOUND_SCSI="yes"; ;; esac
fi
done
test -n "$INTERACTIVE" && echo "0" > /proc/sys/kernel/printk
echo -n "${CRE}"
}

# load usb-modules first (so that memory-stick becomes /dev/sda1)
# uncomment for USB 2.0 support (experimental)
#insmof -f /modules/usb/ehci-hcd.o
insmod -f /modules/usb/usbcore.o
#insmod -f /modules/usb/uhci.o
insmod -f /modules/usb/usb-uhci.o
insmod -f /modules/usb/uhci.o
insmod -f /modules/usb/usb-ohci.o
insmod -f /modules/usb/usb-storage.o
# need to sleep because it takes some time to register things
ash -c "sleep 4"

# Check for SCSI, use modules on bootfloppy first
if test -n "$INTERACTIVE"; then
# Let the user select interactively
askmodules SCSI $(cd /modules/scsi; echo *.o)
else
# these are the autoprobe-safe modules
MODULES="$SCSI_MODULES"
fi
test -z "$NOSCSI" && test -n "$MODULES" && loadmodules SCSI $MODULES
# End of SCSI check

# Check for misc modules in expert mode
if test -n "$INTERACTIVE"; then
another=""; answer=""
while test "$answer" != "n" -a "$answer" != "N"; do
echo -n "${CYAN}Do you want to load additional modules from$another floppy disk? [${WHITE}Y${CYAN}/n] ${NORMAL}"
another=" another"
read answer
case "$answer" in n*|N*) break; ;; esac
if mountmodules new; then
askmodules new $(cd /modules/scsi; echo *.o)
test -n "$MODULES" && loadmodules new $MODULES
umountmodules current
fi
done
fi
# All interactively requested modules should be loaded now.

# Check for ide-scsi supported CD-Roms et al.
test -f /proc/scsi/scsi && FOUND_SCSI="yes"

# Disable kernel messages again
echo "0" > /proc/sys/kernel/printk

# Now that the right SCSI driver is (hopefully) loaded, try to find CDROM
#DEVICES="/dev/hd?"
#test -n "$FOUND_SCSI" && DEVICES="/dev/scd? /dev/scd?? $DEVICES"
# New: Also try parallel port CD-Roms [for Mike].
#DEVICES="$DEVICES /dev/pcd?"
# New: also check HD partitions for a KNOPPIX/KNOPPIX image
#test -n "$FOUND_SCSI" && DEVICES="$DEVICES /dev/sd?[1-9] /dev/sd?[1-9][0-9]"
#DEVICES="$DEVICES /dev/hd?[1-9] /dev/hd?[1-9][0-9]"
#for i in $DEVICES
#do
#echo -n "${CRE}${BLUE}Looking for CDROM in: ${MAGENTA}$i${NORMAL} "
#if mountit $i /cdrom "-o ro" >/dev/null 2>&1
#then
#if test -d /cdrom/KNOPPIX
#then
#echo -n "${CRE} ${GREEN}Accessing KNOPPIX CDROM at ${MAGENTA}$i${GREEN}...${NORMAL}"
#FOUND_KNOPPIX="$i"
#break
#fi
#umount /cdrom
#fi
#done

# mount /dev/sda1 (memorystick to cdrom)
FOUND_KNOPPIX="/dev/sda1"
mount -t vfat /dev/sda1 /cdrom
# Harddisk-installed script part version has been removed
# (KNOPPIX can be booted directly from HD now).
if test -n "$FOUND_KNOPPIX" -a -f /cdrom/KNOPPIX/KNOPPIX; then
# DEBUG
# echo "6" > /proc/sys/kernel/printk
insmod -f /modules/cloop.o file=/cdrom/KNOPPIX/KNOPPIX
mountit /dev/cloop /KNOPPIX "-o ro" || FOUND_KNOPPIX=""
fi

# Final test if everything succeeded.
if test -n "$FOUND_KNOPPIX"
then
# copy library cache
cat /KNOPPIX/etc/ld.so.cache > /etc/ld.so.cache
echo ""

# Enable kernel messages
echo "6" > /proc/sys/kernel/printk

# Set paths
echo -n "${CRE}${BLUE}Setting paths...${NORMAL}"
PATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:."
export PATH

# Debian weirdness
/bin/cp -a /KNOPPIX/etc/alternatives /etc/ 2>/dev/null

# From here, we should have all essential commands available.
hash -r

# Clean up /
rm -rf /modules /static

# New in Kernel 2.4.x: tempfs with variable ramdisk size.
# We check for available memory anyways and limit the ramdisks
# to a reasonable size.
FOUNDMEM="$(awk '/MemTotal/{print $2}' /proc/meminfo)"
TOTALMEM="$(awk 'BEGIN{m=0};/MemFree|Cached/{m+=$2};END{print m}' /proc/meminfo)"

# Be verbose
echo "${CRE}${BLUE}Total memory found: ${YELLOW}${FOUNDMEM}${BLUE} kB${NORMAL}"

# Now we need to use a little intuition for finding a ramdisk size
# that keeps us from running out of space, but still doesn't crash the
# machine due to lack of Ram

# Minimum size of additional ram partitions
MINSIZE=2000
# At least this much memory minus 30% should remain when home and var are full.
MINLEFT=16000
# Maximum ramdisk size
MAXSIZE="$(expr $TOTALMEM - $MINLEFT)"
# Default ramdisk size for ramdisk
RAMSIZE="$(expr $TOTALMEM / 5)"

# Check for sufficient memory to mount extra ramdisk for /home + /var
if test -n "$TOTALMEM" -a "$TOTALMEM" -gt "$MINLEFT"; then
test -z "$RAMSIZE" && RAMSIZE=1000000
mkdir -p /ramdisk
# tmpfs/varsize version, can use swap
RAMSIZE=$(expr $RAMSIZE \* 4)
echo -n "${CRE}${BLUE}Creating ${YELLOW}/ramdisk${BLUE} (dynamic size=${RAMSIZE}k) on ${MAGENTA}/dev/shm${BLUE}...${NORMAL}"
# We need /bin/mount here for the -o size= option
/bin/mount -t tmpfs -o "size=${RAMSIZE}k" /dev/shm /ramdisk && mkdir -p /ramdisk/home /ramdisk/var && ln -s /ramdisk/home /ramdisk/var /
echo "${BLUE}Done.${NORMAL}"
else
mkdir -p /home /var
fi

echo -n "${CRE}${BLUE}Creating directories and symlinks on ramdisk...${NORMAL}"
# Create common WRITABLE (empty) dirs
mkdir -p /var/run /var/backups /var/cache/apache /var/local /var/lock/news \
/var/nis /var/preserve /var/state/misc /var/tmp /var/lib \
/var/spool/cups/tmp \
/mnt/cdrom /mnt/floppy /mnt/hd /mnt/test \
/home/knoppix /home/root /etc/sysconfig /etc/X11 /etc/cups
chown knoppix.knoppix /home/knoppix
# Create empty utmp and wtmp
:> /var/run/utmp
:> /var/run/wtmp
# CUPS wants writable files. :-/
cp -a /KNOPPIX/etc/cups/*.conf /etc/cups/ 2>/dev/null
# All files in here should be size zero after Knoppix.clean was run
cp -a /KNOPPIX/var/local /KNOPPIX/var/games /KNOPPIX/var/log \
/KNOPPIX/var/spool /var/ 2>/dev/null
cp -a /KNOPPIX/var/lib/games /KNOPPIX/var/lib/wine \
/KNOPPIX/var/lib/nfs /KNOPPIX/var/lib/xkb /KNOPPIX/var/lib/isdn \
/KNOPPIX/var/lib/kdm /KNOPPIX/var/lib/pcmcia \
/KNOPPIX/var/lib/dhcp* \
/var/lib/ 2>/dev/null
# Problematic directories in /var/lib (lots and lots of inodes)
ln -s /KNOPPIX/var/lib/dpkg /KNOPPIX/var/lib/apt /KNOPPIX/var/lib/doc-base \
/KNOPPIX/var/lib/gnome /KNOPPIX/var/lib/kde \
/KNOPPIX/var/lib/scrollkeeper /KNOPPIX/var/lib/texmf \
/var/lib/ 2>/dev/null
# Debian-apt
ln -s /KNOPPIX/var/cache/apt /var/cache/ 2>/dev/null
ln -s /KNOPPIX/etc/skel /KNOPPIX/etc/nessus /etc/dhcpc/resolv.conf \
/etc/ 2>/dev/null
ln -s /KNOPPIX/dev/* /dev/ 2>/dev/null
# Index files can be HUGE, so better replace cache/man tree by links later
# cp -a /KNOPPIX/var/cache/man /var/cache/ 2>/dev/null
# Create links from CDROM for UNWRITABLE (remaining) files
cp -aus /KNOPPIX/var/* /var/ 2>/dev/null
cp -aus /KNOPPIX/etc/* /etc/ 2>/dev/null
# Make SURE that these are files, not links!
rm -rf /etc/ftpusers /etc/passwd /etc/shadow /etc/group \
/etc/ppp /etc/isdn /etc/ssh /etc/ioctl.save \
/etc/inittab /etc/network /etc/sudoers \
/etc/init /etc/localtime /etc/dhcpc /etc/pnm2ppa.conf 2>/dev/null
cp -a /etc/ftpusers /KNOPPIX/etc/passwd /KNOPPIX/etc/shadow /KNOPPIX/etc/group \
/KNOPPIX/etc/ppp /KNOPPIX/etc/isdn /KNOPPIX/etc/ssh \
/KNOPPIX/etc/inittab /KNOPPIX/etc/network /KNOPPIX/etc/sudoers \
/KNOPPIX/sbin/init /KNOPPIX/etc/dhcpc /etc/ 2>/dev/null
# Extremely important, init crashes on shutdown if this is only a link
:> /etc/ioctl.save
:> /etc/pnm2ppa.conf
# Diet libc bug workaround
cp -f /KNOPPIX/etc/localtime /etc/localtime
echo "${BLUE}Done.${NORMAL}"

# Now tell kernel where the real modprobe lives
echo "/sbin/modprobe" > /proc/sys/kernel/modprobe

# Change root device from /dev/fd0 to /dev/ram0
echo "0x100" > /proc/sys/kernel/real-root-dev

# Give control to the init process.
echo "${CRE}${BLUE}Starting init process.${NORMAL}"
rm -f /linuxrc
exit 0

else
echo "${CRE}${RED}Can't find KNOPPIX filesystem, sorry.${NORMAL}"
echo "${RED}Dropping you to a (very limited) shell.${NORMAL}"
echo "${RED}Press reset button to quit.${NORMAL}"
echo ""
echo "Additional builtin commands avaliable:"
echo " cat mount umount"
echo " insmod rmmod lsmod"
echo ""
PS1="knoppix# "
export PS1
echo "6" > /proc/sys/kernel/printk
# Allow signals
trap 1 2 3 15
exec /static/ash
fi

现在的任务就是找到那个USB模块,到KNOPPIX的那个巨大压缩包里寻找吧, (insmod cloop file=PATH/KNOPPIX && mount -t iso9660 /dev/cloop /cdrom) 把/cdrom/lib/modules/$KERNELVERSION/kernel/drivers/usb/ 中的以下文件复制到/mnt/modules/usb/:
ehci-hcd.o uhci.o usb-ohci.o usb-storage.o usb-uhci.o usbcore.o

结束miniroot的定制,卸载之并重新压缩到原来的样子。

#准备启动U盘
为启动U盘建立分区,将其格式化为mkfs.vfat
挂到U盘上,复制~/knoppix-usb/bootdisk/ 到U盘上面
将刚才修改过的knoppix(那个cloop压缩包)复制到U盘上面,环境建立好后应该是这样的:
sh-2.05b# ls -lR
.:
total 1576
-rw-r--r-- 1 root root 54 Apr 27 12:48 autorun.bat
-rw-r--r-- 1 root root 47 Apr 27 12:48 autorun.inf
-rw-r--r-- 1 root root 180 Apr 27 12:48 boot.msg
-rw-r--r-- 1 root root 1759 Apr 27 12:48 f2
-rw-r--r-- 1 root root 256 Apr 27 12:48 german.kbd
dr-xr--r-- 2 root root 4096 Apr 27 12:48 knoppix
-rw-r--r-- 1 root root 3262 Apr 27 12:48 knoppix.ico
-r--r--r-- 1 root root 7836 Apr 27 12:51 ldlinux.sys
-rw-r--r-- 1 root root 34395 Apr 27 12:48 logo.16
-rw-r--r-- 1 root root 607866 Apr 27 14:03 miniroot.gz
-rw-r--r-- 1 root root 2402 Apr 27 12:48 syslinux.cfg
-rw-r--r-- 1 root root 921602 Apr 27 12:48 vmlinuz

./knoppix:
total 50820
-rw-r--r-- 1 root root 2048 Apr 27 12:48 boot.cat
-rw-r--r-- 1 root root 1474560 Apr 27 12:48 boot.img
-rw-r--r-- 1 root root 50553629 Apr 27 04:48 knoppix
-rw-r--r-- 1 root root 27 Apr 27 12:48 mkfloppy.bat

现在就可以尝试一下了,用U盘启动吧!


这篇文章来自于 开源教学
http://oedu.org/

这篇文章的URL是:
http://oedu.org/modules.php?op=m ... =article&sid=48
发表于 2005-1-23 14:17:29 | 显示全部楼层

Re:制作U盘上的Knoppix

好东西!
现在对一般用户流行的介质就是CD和USB,CD的版本比较多,强烈支持推出这个USB的。
是否可以提供有脚本,Makefile等方式的完整工程。我见过一个基于Linux的一张软盘的路由器的制作程序,不过是Windows下面的,功能先党的完整,从配置到软盘印像的生成非常的方便。像CDLinux那个东西0.5.3版,非常地棒,可是对一般用户无法方便的扩展。
回复 支持 反对

使用道具 举报

发表于 2005-1-23 21:47:35 | 显示全部楼层
不错,现在的电脑大部分都是没软驱的了,U盘才符合。
回复 支持 反对

使用道具 举报

发表于 2005-2-4 13:03:59 | 显示全部楼层
想问一下这个U盘上的Knoppix是否可以保存设置?或者保存一些小文件?
回复 支持 反对

使用道具 举报

发表于 2005-2-4 21:17:18 | 显示全部楼层
要多大的u盘?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表