|
|
用 Archlinux 开发 LiveUSB 是一个很不错的选择,写这篇文章,跟各位兄弟们交流交流~~~
u 盘启动需要主板 BIOS 支持,启动模式有:
驱动器模式(USB-ZIP)
软驱模式(USB-FDD)
硬盘模式(USB-HDD)
光驱模式(USB-CD-ROM)
网上有很多有关 u 盘启动的文章,绝大部分是针对 win 系统,什么量产、毛桃版、pe 等等,五花八门。相对于 Linux 系统的 u 盘启动则简单多了,最简单就是下载一个 Slax usb 版本,简单处理一下,即可拥有一个 LiveUSB 系统(google 一下吧)。这个系统有一些特点:根区经过压缩和模块化,添加所有的东西都要做成模块,不利于添加,利于减省,用于二次开发可以,想自己定制 u 盘,则不合适。下面方法是简单定制 u 盘,不需高深技术,只需四个关键:
设置 BIOS 以 USB-HDD 启动
安装系统
内核
启动器
BIOS 以 USB-HDD 模式启动,就是把 usb 盘模拟成硬盘的模式,好让我们按照在硬盘上安装 linux 的方法来安装 u 盘系统。题外话,我原来的主板是微星 845 ,不支持 usb 启动,用 100 元换技嘉 845 ,显示有 usb 启动项,拿回家,左搞右搞,就是不行,后来没办法换了个杂牌主板才行。
首先,安装根文件系统
第一步,格式化 u 盘:
# fdisk -l
看看 u 盘的盘符,不要搞错!
u 盘分区:
# fdisk /dev/sda
用 d 选项删除所有分区,即使分区大小符合要求也要删除,再创建。用 n 选项创建两个分区,第一个分区是启动分区,用来安放内核和启动相关文件,大小可以在 32M 内即可,一般只用到十几M,使用 a 选项定义为可启动分区,分区类型是 83 (Linux)。另一个分区用于根分区,分区类型是 83 (Linux)。视乎 u 盘的大小,可以再分一个分区用于数据安放。下面是我的 u 盘分区(2G):
Disk /dev/sda: 1999 MB, 1999634432 bytes
62 heads, 62 sectors/track, 1016 cylinders
Units = cylinders of 3844 * 512 = 1968128 bytes
Disk identifier: 0x01b8c45e
Device Boot Start End Blocks Id System
/dev/sda1 * 1 26 49941 83 Linux
/dev/sda2 27 1016 1902780 83 Linux
格式化启动分区:
# mkfs.ext2 /dev/sda1
格式化第一个分区为 ext2 文件系统,目的是利于启动:内核支持 ext2 文件系统是最好的,而且放在首 512M 内,利于启动。如果想使用 syslinux 启动器,则需要把启动分区格式化为 FAT 文件系统,因为 syslinux 是一个基于 FAT 文件系统的启动器(不赞成如此,也没有试过)。
格式化根文件系统:
# mkfs.reiserfs /dev/sda2
最近 ext4 已经有内核支持,听说 ext4 针对了 SSD 和 USB 盘的性能改进,主张用 ext4 ,那位兄弟试试,然后写写心得~~~
建立挂载点:
# mkdir -p /mnt/usb
# mkdir -p /mnt/usb/boot
挂载:
# mount /dev/sda2 /mnt/usb
# mount /dev/sda1 /mnt/usb/boot
分区处理好,下一步是安装系统。其实安装系统有两种方法:
方法一,使用 rsync 命令把已经在硬盘上的系统复制到 u 盘上:
# rsync -a --delete -l -H --progress /mnt/hda6/ --exclude "/mnt" --exclude "/proc" --exclude "/tmp" --exclude "/sys" /mnt/usb/
把 /mnt/hda6 目标分区整个复制到 u 盘上,然后,再把内核复制到启动分区上,chroot 进去,重新建立一些目录即可。
另一种方法,pacman.static 硬盘安装方法
此安装方法很多弟兄们忽略了或不知道,其实是一种很简单的 Arch 硬盘安装方法,不需要重启,不需要复制内核,更不需要改 initrd 。只需一个 pacman.static 命令即可。当然如果你已经有 Arch 系统,可以省略下面一些步骤。
我是在 gentoo 环境下安装 Arch ,所以需要使用到 pacman.static 命令, pacman.static 命令是不需要动态库能运行的 pacman 命令,pacman.static 已经不在 pacman 包里(在哪个包里,请告诉我。还有,希望有人来维护这个命令),只好先下载一个 Arch iso ,然后再来提取:
挂载 iso 文件
# mount -o loop archlinux-2008.06-ftp-i686.iso /mnt/cdrom/
# cd /mnt/cdrom/
挂载 squashfs 文件系统的根区
# mount -t squashfs -o loop archlive.sqfs /mnt/floppy/
复制 pacman.static 命令出来,放在 gentoo 系统上:
# cd /mnt/floppy
# cp usr/bin/pacman.static /usr/bin
有了 pacman.static 命令,即可来安装 arch 了......
pacman.static 或 pacman 工具是使用 /etc/pacman.conf 文件来进行配置,在 gentoo 系统上创建 /etc/pacman.conf 文件:
# 安装的根目录
RootDir = /mnt/usb/
DBPath = /mnt/usb/var/lib/pacman/
# 把下载的文件保存在硬盘上,不是保存在 u 盘,减少 u 盘的读写
CacheDir = /var/cache/pacman/pkg/
LogFile = /mnt/usb/var/log/pacman.log
HoldPkg = pacman glibc
# If upgrades are available for these packages they will be asked for first
#SyncFirst = pacman
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#XferCommand = /usr/bin/curl %u > %o
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
#IgnorePkg =
#IgnoreGroup =
#NoUpgrade =
#NoExtract =
# Misc options (all disabled by default)
#NoPassiveFtp
#UseSyslog
#ShowSize
#UseDelta
#TotalDownload
#
# REPOSITORIES
# - can be defined here or included from another file
# - pacman will search repositories in the order defined here
# - local/custom mirrors can be added here or in separate files
# - repositories listed first will take precedence when packages
# have identical names, regardless of version number
# - URLs will have $repo replaced by the name of the current repo
#
# Repository entries are of the format:
# [repo-name]
# Server = ServerName
# Include = IncludePath
#
# The header [repo-name] is crucial - it must be present and
# uncommented to enable the repo.
#
# Testing is disabled by default. To enable, uncomment the following
# two lines. You can add preferred servers immediately after the header,
# and they will be used before the default mirrors.
#[testing]
#Include = /etc/pacman.d/mirrorlist
[core]
# Add your preferred servers here, they will be used first
Include = /etc/pacman.d/mirrorlist
[extra]
# Add your preferred servers here, they will be used first
Include = /etc/pacman.d/mirrorlist
[community]
# Add your preferred servers here, they will be used first
Include = /etc/pacman.d/mirrorlist
# An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories.
#[custom]
#Server = file:///home/custompkgs
建立 pacman.static 工具需要的目录和文件:
# mkdir -p /mnt/usb/var/lib/pacman
# mkdir -p /var/cache/pacman/pkg
# mkdir -p /mnt/usb/var/log
# touch /mnt/usb/var/log/pacman.log
编辑 /etc/pacman.d/mirrorlist 文件,指定下载的网址,即可进入安装环节。
安装基本系统
参数 base 定义了基本系统组成以及其依赖关系,r 参数指定了安装点,执行下面的命令即可把基本系统安装到需要的地方:
# pacman.static -Sy base -r /mnt/usb
切换根的准备工作:
# mount /dev/ /mnt/usb/dev/ --bind
# mount /sys/ /mnt/usb/sys/ --bind
# mount /proc/ /mnt/usb/proc/ --bind
# cat /etc/resolv.conf > /mnt/usb/etc/resolv.conf
切换根:
# chroot /mnt/usb/ /bin/bash
现在已经切换到新安装的 Arch 里面了,进一步配置:
如果需要(一般不需要),调整设备文件:
# cd /dev
# mknod -m 660 console c 5 1
# mknod -m 660 null c 1 3
修改一些必要的配置文件 如 /etc/pacman.conf 等文件,下一步比较关键,重建 initrd ,Arch 使用 mkinitcpio 工具来建立 initrd 的,首先编辑配置文件
/etc/mkinitcpio.conf 的 hooks 选项,加入 usb(在 filesystems 之前)。
当配置好 mkinitcpio.conf 文件后,找出当前的内核模块版本,如: ls /lib/modules/ ,得出 “2.6.25-ARCH” ,然后,必须以根用户权限来生成 initrd :
# mkinitcpio -k 2.6.25-ARCH -g /boot/initrd
在 boot 目录下得出 initrd 。
设置挂载根区
编辑 /etc/fstab 文件,添加:
/dev/sda2 / reiserfs defaults 1 1
可以使用硬盘里面的交换分区,视乎工作环境来决定直接添加在 /etc/fstab 文件里,还是开机后,手动添加了。
退出 chroot
# exit
安装启动器
Linux 系统有两个启动器:GRUB 和 lilo,GRUB 强,可是我安装的 GRUB 不能很好的工作,能启动,不能引导内核,不知何故,要请教路兄弟了。我想做一个防火墙只有一个主机(没硬盘,用 USB 盘),不带显示器,不带键盘,这种情况只能要 GRUB 来引导了,那个兄弟有这方面的经验?
下面是 lilo 引导方法:
在 u 盘的 boot 分区上建立 lilo.conf 文件,创建 /mnt/usb/lilo.conf 文件:
boot = /dev/sda
vga = normal
compact
read-only
prompt
default = linux
timeout = 0
append=""
image = /mnt/usb/vmlinuz26
label = linux
root = /dev/sda2
initrd = /mnt/usb/initrd
执行安装命令(宿主系统有 lilo 命令):
# lilo -C /mnt/usb/boot/lilo.conf -m mnt/usb/boot/lilo.map
运行安装 lilo,正常可能会有个警告信息,说 sda 不是第一个设备等。
至此,基本安装完毕,umount 分区:
# umount /mnt/usb/boot
# umount /mnt/usb/
重启,USB-HDD 模式,进入后,继续后续的安装........ |
|