由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Linux版 - [合集] 在 SD/USB 上运行你的 ubuntu
相关主题
grub的问题??怎样恢复grub设置?
Mandriva 2010 安装到Raid 1之后,无法启动u-boot怎么从网络上把initrd给load到内存
可以在外接硬盘上装linux系统吗linux克隆搞不定
开机直接kernel panic会是什么原因?升级到了Ubuntu 9.10 发现。。。
能不能在移动USB盘上装ubuntu, 然后syslog.conf doesn't work for kernel 2.6.38.8 ?
求助,在线等,如何boot到command line问个ubuntu安装的问题
问个一直没弄明白的initrd/initramfs问题how to disable nouveau kernel driver
被ubuntu的内核编译过程搞糊涂了,求救哪位真有时间自己写程序贡献社区,重写个systemd吧
相关话题的讨论汇总
话题: boot话题: usb话题: sd话题: openvt话题: initrd
进入Linux版参与讨论
1 (共1页)
E*V
发帖数: 17544
1
☆─────────────────────────────────────☆
nickmit (上海老姜) 于 (Wed Oct 27 01:52:51 2010, 美东) 提到:
先建个临时目录
# mkdir -p /tmp/ubuntu/maverick
没有 debootstrap 的先安装一下
# apt-get install debootstrap
然后构建基本系统,这里就用 10.10 吧,你也可以换 lucid
# debootstrap maverick /tmp/ubuntu/rootfs
基本设置一下
# chroot /tmp/ubuntu/rootfs
# mount -t proc none /proc
# mount -t devtmpfs none /dev
# mount -t devpts none /dev/pts
# mount -t sysfs none /sys
俺喜欢给 root 加个密码,sudo 之类看着别扭
# passwd root

选择你自己要的套件,比如
# apt-get install ubuntu-standard \
openssh-server \
vim build-essential
如果你选 ubuntu-desktop 或者 ubuntu-netbook 基本就和发行版一样了。最后记得更
新、打扫一下,其实更新没必要了,除非刚才短短时间里有 update,保险一点吧:
# apt-get update
# apt-get upgrade
# apt-get autoremove
# apt-get clean
# umount /sys
# umount /dev/pts
# umount /dev
# umount /proc
差不多了 现在开始做 image 了,这个比较慢,不过大概可以压缩到 1/3 的尺寸
# exit
# apt-get install squasnfs-tools
# mksquash /tmp/ubuntu/maverick /tmp/ubuntu/filesystem.squashfs
如果需要 casper,咱做个 1G 的吧
# dd if=/dev/zero of=/tmp/ubuntu/casper-rw bs=1M count=1024
# mkfs.ext4 -F -m0 /tmp/ubuntu/casper-rw
好了,现在需要一个 bootloader 了,你可以用 multiboot iso,这里可以下载:http://www.pendrivelinux.com/boot-multiple-iso-from-usb-multiboot-usb/
格式化 SD/USB,然后随便装个什么什么的,比如 memtest86,这样 menu.lst 就有了
现在做一个 initrd 来装载,我是用 busybox 自己 make 的,所有 option 都 enable
了,偷懒一点就用系统的吧,就是那个 /boot/initrd.img*
# mkdir -p /tmp/ubuntu/initrd
# cd /tmp/ubuntu/initrd
# gzip -d -c /boot/initrd.img-`uname -r` | cpio -i
改改 init,主要是 mount 你的 livefs,这个稍微复杂点,俺跟个帖子贴上俺现在写
的,关键包含以下几个:
# mount -o loop filesystem.squashfs /rots
# mount -o loop casper-rw /cow
(没有 capser 可以 mount -t tmpfs none /cow)
# mount -t aufs -o dirs=/cow=rw:rots none /rootfs
....
# switch_root /rootfs /sbin/init
initrd 可以减减肥,删掉 /tmp/ubuntu/initrd/lib/modules/ 里没用的 driver 之类
,只要有 usb-storage/aufs/squashfs/vfat/ntfs 这些就够了,不删也行,就是太肥
,吼吼
好了,现在装盘子了
# cd /tmp/ubuntu/initrd/
# find . | cpio -o -H newc | gzip -9 -n > ../live_initrd.gz
把这个 live_initrd.gz 和 kernel (/boot/vmlinuz-`uname -r`) 一起放到 SD 上,
在 menu.lst 里加个 option 就成了,大致这样:
kernel /vmlinuz live-media-device=MULTIBOOT live-media-path=/maverick
initrd=/boot/live_initrd.gz
命令行参数,俺在跟帖里讲吧
☆─────────────────────────────────────☆
nickmit (上海老姜) 于 (Wed Oct 27 01:53:19 2010, 美东) 提到:
先讲讲 kernel cmdline
live-media-device
是你的 SD 的 LABEL
live-media-path
是你存放 filesystem.squashfs 之类的目录,这样可以有几个 live ubuntu
以上两个是必须的,不然找不到你的 images,还有一些可选:
live-media-init
可以在 path 指定的目录里放一个 init,比如你打算跑另外一个狠 cool 的东东,这个是 initrd 会首先执行的,在装载你的 squashfs 之前
live-media-fs
可以给 filesystem.squashfs 改个名字,这个实在是又臭又长
live-media-casper
你用的 casper,如果不是 casper-rw 的话
下一个跟帖是俺的 init script
☆─────────────────────────────────────☆
nickmit (上海老姜) 于 (Wed Oct 27 02:02:29 2010, 美东) 提到:
首先是 /init
#! /bin/sh

LIVE_MEDIA_RETRY=10

export LIVE_MEDIA_PATH="/"
export LIVE_MEDIA_INIT="init"
export LIVE_MEDIA_SYSINIT="/sbin/init"
export LIVE_MEDIA_FS="filesystem.squashfs"
export LIVE_MEDIA_CASPER="casper-rw"
export LIVE_MEDIA_ROOT="/media"
export LIVE_MEDIA_POSTINIT="postinit"
export FS_ROOT="/aufs"

[ -x scripts/functions.sh ] && . scripts/functions.sh

mount -t proc none /proc
mount -t sysfs none /sys
mount -t devtmpfs none /dev
mkdir /dev/pts
mount -t devpts none /dev/pts

depmod -a
for module in usb-storage aufs squashfs vfat; do
modprobe $module
done
while true; do
main
done
现在是 init script 用到的 /scripts/functions.sh,又臭又长,大家凑合看吧:
#! /bin/sh
__parse_cmdline()
{
cmdline=$3
[ -z $cmdline ] && cmdline=`cat /proc/cmdline`
for x in $cmdline; do
case $x in
"$1"=*)
eval $2=${x#$1=}
return
;;
esac
done
}
mkdirp()
{
for dir in $*; do
[ -d "$dir" ] || mkdir "$dir"
done
}
isyes()
{
case $1 in
YES|yes|1)
return 0
;;
esac
return 1
}
drop_to_shell()
{
if [ -c /dev/console ]; then
/bin/sh /dev/console 2>&1
else
/bin/sh
fi
}
run_sysinit()
{
echo "Runing sysinit $LIVE_MEDIA_SYSINIT"
exec switch_root $FS_ROOT $LIVE_MEDIA_SYSINIT
}
load_livefs()
{
echo "Loading live filesystem"
if [ ! -f "$LIVE_MEDIA_ROOT/${LIVE_MEDIA_PATH}/${LIVE_MEDIA_FS}" ];
then
echo "Can not find live media filesystem $LIVE_MEDIA_FS"
drop_to_shell
fi
if isyes ${LOAD_LIVEFS_RAM}; then
mount -t tmpfs none /rots
cp "$LIVE_MEDIA_ROOT/${LIVE_MEDIA_PATH}/${LIVE_MEDIA_FS}" /
rots
mount -o loop "/rots/${LIVE_MEDIA_FS}" /rots
mount -t tmpfs none /cow
else
mount -o loop "$LIVE_MEDIA_ROOT/${LIVE_MEDIA_PATH}/${LIVE_
MEDIA_FS}" /rots
[ -n ${LIVE_MEDIA_CASPER} ] && mount -o loop "$LIVE_MEDIA_
ROOT/${LIVE_MEDIA_PATH}/${LIVE_MEDIA_CASPER}" /cow
mountpoint /cow -q || mount -t tmpfs none /cow
fi
mkdirp $FS_ROOT
mount -t aufs -o dirs=/cow=rw:/rots none $FS_ROOT
[ -x "$LIVE_MEDIA_ROOT/${LIVE_MEDIA_PATH}/${LIVE_MEDIA_POSTINIT}" ]
&& \
. "$LIVE_MEDIA_ROOT/${LIVE_MEDIA_PATH}/${LIVE_MEDIA_POSTINIT
}"
echo "Moving pesudo file systems ... "
if isyes ${LOAD_LIVEFS_RAM}; then
umount $LIVE_MEDIA_ROOT
else
mkdirp "$FS_ROOT/$LIVE_MEDIA_ROOT"
mount --move $LIVE_MEDIA_ROOT $FS_ROOT/$LIVE_MEDIA_ROOT
mount --move /cow $FS_ROOT/cow
fi
mkdirp "$FS_ROOT/cow" "$FS_ROOT/dev" "$FS_ROOT/proc"
mount --move /dev $FS_ROOT/dev && \
mount --move /proc $FS_ROOT/proc
[ $DEBUG ] && sleep 10
run_sysinit
}
load_modules()
{
tarball=$1
[ -z $tarball ] && tarball=${LIVE_MEDIA_PATH}/module-`uname -r`.tar.
gz
MODULE_TARBALL=$LIVE_MEDIA_ROOT/${tarball}
[ ! -f ${MODULE_TARBALL} ] && return 1
mkdirp /lib/modules/`uname -r` && (cd /lib/modules/`uname -r` && tar
xvfz ${MODULE_TARBALL}) && depmod -a
}
try_device()
{
[ -b $1 ] || return 1
mount "$1" $LIVE_MEDIA_ROOT 2>&1 >/dev/null || return 1
if [ -d "$LIVE_MEDIA_ROOT/${LIVE_MEDIA_PATH}" ]; then
[ -x "$LIVE_MEDIA_ROOT/${LIVE_MEDIA_PATH}/${LIVE_MEDIA_INIT}
" ] && \
. "$LIVE_MEDIA_ROOT/${LIVE_MEDIA_PATH}/${LIVE_MEDIA_
INIT}"
isyes ${LOAD_LIVEFS} && load_livefs
isyes $LIVE_MEDIA_RUN_SYSINIT && run_sysinit
fi
umount $LIVE_MEDIA_ROOT
return 1
}
main()
{
__parse_cmdline "live-media-device" LIVE_MEDIA_DEVICE
__parse_cmdline "live-media-retry" LIVE_MEDIA_RETRY
__parse_cmdline "live-media-path" LIVE_MEDIA_PATH
__parse_cmdline "live-media-init" LIVE_MEDIA_INIT
__parse_cmdline "live-media-fs" LIVE_MEDIA_FS
__parse_cmdline "live-media-casper" LIVE_MEDIA_CASPER
__parse_cmdline "live-media-postinit" LIVE_MEDIA_POSTINIT
__parse_cmdline "load_livefs" LOAD_LIVEFS
echo "Mounting boot media ... "
i=0
while [ $i -lt ${LIVE_MEDIA_RETRY} ]; do
if [ $LIVE_MEDIA_DEVICE ]; then
try_device $LIVE_MEDIA_DEVICE || \
try_device `findfs LABEL=$LIVE_MEDIA_DEVICE`
|| \
try_device `findfs UUID=$LIVE_MEDIA_DEVICE`
else
devices=`cat /proc/partitions | awk '{print $4}' |
grep -v name`
for device in $devices; do
try_device /dev/$device
done
fi
sleep 1
i="$(($i + 1))"
done
drop_to_shell
}
☆─────────────────────────────────────☆
nickmit (上海老姜) 于 (Wed Oct 27 04:10:56 2010, 美东) 提到:
下面没了,lol,其实就是一个配置 bootloader 的例子。
menu.lst 是这样的:
title busybox
kernel /boot/kernel root=/dev/ram0 live-media-device=MULTIBOOT live-media
-init=/boot/init.busybox quiet
initrd=/boot/live_initrd.gz
然后是 /boot/busybox.init:
openvt
openvt
drop_to_shell
1 (共1页)
进入Linux版参与讨论
相关主题
哪位真有时间自己写程序贡献社区,重写个systemd吧能不能在移动USB盘上装ubuntu, 然后
请问有些什么方法可以查死机的原因?求助,在线等,如何boot到command line
what packages needed to init 5 X11问个一直没弄明白的initrd/initramfs问题
请问Ubuntu下开机自动执行命令的设置?被ubuntu的内核编译过程搞糊涂了,求救
grub的问题??怎样恢复grub设置?
Mandriva 2010 安装到Raid 1之后,无法启动u-boot怎么从网络上把initrd给load到内存
可以在外接硬盘上装linux系统吗linux克隆搞不定
开机直接kernel panic会是什么原因?升级到了Ubuntu 9.10 发现。。。
相关话题的讨论汇总
话题: boot话题: usb话题: sd话题: openvt话题: initrd