Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1401504
  • 博文数量: 343
  • 博客积分: 13098
  • 博客等级: 上将
  • 技术积分: 2862
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-06 00:35
文章存档

2012年(131)

2011年(31)

2010年(53)

2009年(23)

2008年(62)

2007年(2)

2006年(36)

2005年(5)

分类: LINUX

2010-01-10 23:55:21

This procedure works and can create a bootable Ubuntu (along with the automatic hardware detection and configuration) from scratch. You do not need to start from a pre-existing .

You may wish to create an Ubuntu Remix and distribute it as a LiveCd. Here is a way to do that without having to start from an existing Ubuntu Desktop Cd.

 

Overview

 

There are three different areas to think about; the host system, the disk image and the chroot.

 

The Host System

 

This refers to the Ubuntu desktop you are running, the one the customised LiveCd is being built on. You will need to install the syslinux, squashfs-tools and mkisofs packages to be able to build the LiveCd Remix using the current system.

 

The Disk Image

 

The disk image is a folder that we will burn to Cd. Just create a new folder to be the Disk-Image-Folder. The isolinux bootloader binary (taken from the syslinux package) needs to be copied onto the disk image so it will go into the disk image folder for now. The isolinux configuration file, which will allow the Cd to show a boot-menu at boot time, needs to be copied into there too. You will also copy the kernel from the chroot onto the disk image (folder).

The disk image will be created in the host environment, outside of the chroot.

 

The ChRoot Environment

 

This is the system that will eventually run from the disk. It does not need a kernel, nor a boot-loader unless you are planning on installing it back onto a hard disk (using Ubiquity). The Casper package needs to be installed into the chroot. Casper is what allows the Live System to perform hardware autoconfiguration and run from a live environment. Installing the Casper package will update the kernel's initrd to perform these tasks. The kernel that is installed into the chroot will be copied out from the chroot and put into the disk image.

The chroot will end up inside the disk image in the form of a squashed (compressed) file. For right now, it will be just another folder on your host system.

The basic steps are to

  1. Create a chroot and install your packages there.
  2. Compress the chroot system into a file.
  3. Create and configure the disk image which will have the bootloader (isolinux), the kernel, the compressed file-system image and some other stuff.
  4. Burn the Cd and test it out.

 

Make the ChRoot Environment

 

From a debootstrap on the host system. Then make a new folder "work" and inside that make another directory "chroot". Then run debootstrap

Note: The version of Debootstrap for a release of ubuntu does not contain the files to bootstrap the next Ubuntu release. For example, you cannot bootstrap Karmic on an Intrepid system without intalling Karmic's debootstrap package. Find the version of debootstrap you need and install it using dpkg. The debootstrap package doesn't depend on any other packages and so installing it "by hand" will not cause any problems on your system.

 

sudo apt-get install debootstrap

#alternatively, download the package and run sudo dpkg -i debootstrap_1.0.20_all.deb

mkdir -p work/chroot

cd work

sudo debootstrap --arch=i386 karmic chroot 

 

Note that in the last line "karmic" may need to be replaced with your host system; "hardy", "jaunty", "gutsy" or whatever. Those 4 lines should create a directory with a chroot directory within it - then installs a bare ubuntu system in there. It is important to install custom applications such as MySQL after linux-generic is installed because such applications require kernel modules for post-install configurations.

 

sudo cp /etc/resolv.conf chroot/etc/resolv.conf
sudo cp /etc/apt/sources.list chroot/etc/apt/sources.list

 

You may edit the sources.list in the chroot to add a line from a PPA, if you need. You will need to add the PPA's key to your chroot's package manager. On the PPA's overview page you'll see the PPA's OpenPGP key id. It'll look something like this: 1024/12345678. Copy it, or make a note of, the portion after the slash, e.g: 12345678. This key will be added once we enter the chroot.

 

sudo chroot chroot

mount -t proc none /proc
mount -t sysfs none /sys
mount -t devpts none /dev/pts
export HOME=/root
export LC_ALL=C
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 12345678  #Substitute "12345678" with the PPA's OpenPGP ID.
apt-get update

 

There is a current (Karmic, 9.10) issue with services running in a chroot:

A workaround is to link /sbin/initctl to /bin/true

 

dpkg-divert --local --rename --add /sbin/initctl
ln -s /bin/true /sbin/initctl

 

Install packages needed for Live System:

apt-get install --yes ubuntu-standard casper lupin-casper
apt-get install --yes discover1 laptop-detect os-prober
apt-get install --yes linux-generic 

 

Jaunty Jackalope (9.04) seems to hang on the configuration of the network interfaces unless network-manager is installed. This is no longer a problem in Karmic 9.10.

 

apt-get install --no-install-recommends network-manager

 

Next, you may install more packages as you like, assuming you have the legal rights to redistribute the packages. This is where you build your custom system using packages from the Ubuntu archives.

 

Graphical installer, optional step

 

The customised system can be set-up to allow it to be installed onto machines rather than only ever being a . Simply install the Ubiquity packages and an appropriate desktop environment with a window manager. This step is optional and only needed if you want to allow your customised Ubuntu system to be installed on other computers.

 

For the Gtk front-end - Gnome & Xfce

 

 

apt-get install ubiquity-frontend-gtk

 

 

For the Qt front-end - KDE

 

 

apt-get install ubiquity-frontend-kde

 

Before exiting the chroot, remove the diversion:

 

rm /sbin/initctl
dpkg-divert --rename --remove /sbin/initctl

 

Then just clean up.

 

apt-get clean

rm -rf /tmp/*

rm /etc/resolv.conf

umount -lf /proc
umount -lf /sys
umount -lf /dev/pts
exit

 

So far, you have entered the chroot and installed packages, then cleaned up and left.

 

Create the Cd Image Directory and Populate it

 

There are 4 packages that need to be installed on the which provide the tools to make the Cd image. Syslinux contains isolinux which makes the Cd bootable. Squashfs-tools will compress the image. SBM is a tool which is useful to have on the Cd if you cannot get it to boot. Genisoimage provides mkisofs tool to turn a directory into a CD image. So syslinux, squashfs-tools, mkisofs and sbm.

sudo apt-get install syslinux squashfs-tools genisoimage sbm

 

This next command makes the image directory and the 3 required subdirectories.

mkdir -p image/{casper,isolinux,install}
# Same as 'mkdir image image/casper image/isolinux image/install'

 

You will need a kernel and an initrd that was built with the Casper scripts. Grab them from your chroot. Use the current version. Note that as of 9.10, the initrd is in lz not gz format... This may cause problems with GRUB2.

cp chroot/boot/vmlinuz-2.6.**-**-generic image/casper/vmlinuz

cp chroot/boot/initrd.img-2.6.**-**-generic image/casper/initrd.gz

 

You need the isolinux binary and the sbm binary.

 

cp /usr/lib/syslinux/isolinux.bin image/isolinux/

cp /boot/memtest86+.bin image/install/memtest
cp /boot/sbm.img image/install/

 

 

Boot Instructions for the Remix User

 

To give some boot-time instructions to the user create an isolinux.txt file in image/isolinux, for example:

splash.rle

************************************************************************

This is an Ubuntu Remix Live CD.

For the default live system, enter "live".  To run memtest86+, enter "memtest"

************************************************************************

 

 

Splash Screen

 

A graphic can be displayed at boot time, but it is optional. The example text above contains a special character along with the file name of the splash image (splash.rle). To create that character, do one of the following:

A. Cut and copy the text above and use any text editor to modify the text.

or

B. Use the following command

printf "\x18" >emptyfile

 

and then edit the emptyfile with any text editor. Add the file name just next to the first character and add the text you want to display at boot time beneath it and save the file as "isolinux.txt"

or

C. Use vi to edit a text file and press CTRL-V and then CTRL-X to create that special character. This doesn't work for other text editors such as nano or gedit.

To create the splash.rle file, create an image 480 pixels wide. Convert it to 15 colours, indexed (perhaps using TheGIMP) and "Save As" to change the ending to .bmp which converts the image to a bitmap format. Then the "netpbm" package and run

bmptoppm splash.bmp > splash.ppm

ppmtolss16 '#ffffff=7' < splash.ppm > splash.rle

 

If you want to use an animated splash screen such as or for a higher resolution console mode please make sure you add 'vga=rrr' after the keyword splash in the append line in the (see item below). Replace the rrr with the console resolution value.

 

Boot-loader Configuration

 

Create an isolinux.cfg file in image/isolinux/ to provide configuration settings for the boot-loader. Please read syslinux.doc which should be on the host machine in /usr/share/doc/syslinux to find out about the configuration options available on the current set-up. Here is an example of what could be in the file:

DEFAULT live
LABEL live
  menu label ^Start or install Ubuntu
  kernel /casper/vmlinuz
  append  file=/cdrom/preseed/ubuntu.seed boot=casper initrd=/casper/initrd.gz quiet splash --
LABEL check
  menu label ^Check CD for defects
  kernel /casper/vmlinuz
  append  boot=casper integrity-check initrd=/casper/initrd.gz quiet splash --
LABEL memtest
  menu label ^Memory test
  kernel /install/memtest
  append -
LABEL hd
  menu label ^Boot from first hard disk
  localboot 0x80
  append -
DISPLAY isolinux.txt
TIMEOUT 300
PROMPT 1 

#prompt flag_val
# 
# If flag_val is 0, display the "boot:" prompt 
# only if the Shift or Alt key is pressed,
# or Caps Lock or Scroll lock is set (this is the default).
# If  flag_val is 1, always display the "boot:" prompt.
#     syslinux manpage 

 

Don't forget to pick the correct extension for your initrd (initrd.gz or initrd.lz). Now the Cd should be able to boot, at least it will be after the image is burned ;)

 

Create manifest:

 

 

sudo chroot chroot dpkg-query -W --showformat='${Package} ${Version}\n' | sudo tee image/casper/filesystem.manifest
sudo cp -v image/casper/filesystem.manifest image/casper/filesystem.manifest-desktop
REMOVE='ubiquity casper live-initramfs user-setup discover1 xresprobe os-prober libdebian-installer4'
for i in $REMOVE 
do
        sudo sed -i "/${i}/d" image/casper/filesystem.manifest-desktop
done

 

 

Compress the chroot

 

If this Customised Remix is to potentially be installed on some systems then the /boot folder will be needed. To allow the Customised Cd to be an installer Cd, compress the entire chroot folder with this command:

sudo mksquashfs chroot image/casper/filesystem.squashfs 

 

However, if it is not going to be installed and is 'only' meant as a then the /boot folder can be excluded to save space on your iso image. The live system boots from outside the chroot and so the /boot folder is not used.

sudo mksquashfs chroot image/casper/filesystem.squashfs -e boot

 

It is important to note that if you are building a Karmic on an earlier system, you will need the or the will not boot.

 

Create diskdefines

 

 

nano image/README.diskdefines

 

example:

#define DISKNAME  Ubuntu 9.10 "Karmic Koala" - Release i386 **Remix**
#define TYPE  binary
#define TYPEbinary  1
#define ARCH  i386
#define ARCHi386  1
#define DISKNUM  1
#define DISKNUM1  1
#define TOTALNUM  0
#define TOTALNUM0  1

 

 

Recognition as an Ubuntu Remix

 

Create an empty file named "ubuntu" and a hidden ".disk" folder. This is needed to make the USB Creator work with this custom iso image. Without this the image will still boot but the USB creator will not recognize the image as an Ubuntu Cd and refuse to use it. Also, create the following files with the pertinent information:

touch image/ubuntu

mkdir image/.disk
cd image/.disk
touch base_installable
echo "full_cd/single" > cd_type
echo 'Ubuntu 9.10 "Karmic Koala Remix" - i386 (20090429)' > info
echo "http//ubuntu-rescue-remix.org" > release_notes_url
cd ../..

 

 

Calculate MD5

 

 

sudo -s
(cd image && find . -type f -print0 | xargs -0 md5sum | grep -v "\./md5sum.txt" > md5sum.txt)
exit

 

This calculates the md5sum of everything in the image folder, except the file named md5sum.txt.

 

Create ISO Image for a LiveCd

 

Create iso from the image directory using the command-line

cd image
sudo mkisofs -r -V "$IMAGE_NAME" -cache-inodes -J -l -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -o ../ubuntu-remix.iso .
cd ..

 

The boot.cat file will be automatically created. You may test your image through virtualbox-ose instead of rebooting your real system if you wish.

 

Make a bootable Usb image

 

The USB-Creator works properly with the iso image that has been created so long as the hidden ".disk" folder and its contents are present. If you prefer to do it "by hand", you can put your live system onto a USB drive yourself. Follow these six steps to do so. You can use these steps to put an existing onto a Usb bootable device.

 

FAT16 file-system (Windows)

 

1. Prepare your work area:

mkdir ../liveusb ../liveusb/mnt
cd ../liveusb
touch loop

 

2. Create a loop device with a fat16 file-system. Use whatever size you need to fit your image; in this case it's a 200Mb sparse file. A sparse file is a file that is bigger than the actual number of bytes it takes up on the disk.

dd if=/dev/zero of=loop bs=1 count=1 seek=200M
mkdosfs -F 16 -n rescue loop

 

3. Two options here;

3a Mount the Cd-Rom iso image and your new file-system:

mkdir tmp
sudo mount -o loop ../rescue-remix-804Alpha.iso tmp
sudo mount -o loop loop mnt

 

3b Just use the "image" folder instead of mounting the iso image. This is useful if you don't want to make anything other than a Usb image from scratch (You don't have to make a Cd iso image if you don't need it)

ln -s ../image tmp
sudo mount -o loop loop mnt

 

4. Copy the files

sudo cp -a tmp/* mnt/

 

5. Change the location of the boot-loader and its configuration file and make it bootable (For fat16 file-system (default))

cd mnt
sudo mv isolinux/* .
sudo rmdir isolinux/
sudo mv isolinux.bin syslinux.bin
sudo mv isolinux.cfg syslinux.cfg
cd ..
sudo umount mnt
sudo umount tmp
syslinux loop

 

6. Pack it up

gzip -c loop > remixusb.gz

 

To install onto a usb drive. Insert the drive and identify it's mount-point, for example /dev/sdc. Ensure that the device has a partition table on it and run

zcat remixusb.gz | sudo tee /dev/sdc1 >/dev/null

 

 

Ext2 file-system (proper Linux)

 

An ext2 file-system is useful in that it can hold larger files and the boot-loader can support relative symlinks. Follow the same steps as above, but substitute the instructions in steps 2 & 5

2. Create an ext2 file-system instead of FAT16, obviously.

dd if=/dev/zero of=loop bs=1 count=1 seek=200M
mkfs.ext2 -L rescue -m 0 loop

 

5. It needs to be made bootable *before* unmounting.

cd mnt
sudo mkdir boot
sudo mv isolinux boot/extlinux
sudo mv boot/extlinux/isolinux.cfg boot/extlinux/extlinux.conf
sudo extlinux --install boot/extlinux/
cd ..
sudo umount mnt
sudo umount tmp

 

 

Partitioning your Usb device

 

A persistent home can be included within a file instead of a partition. If you want to use a whole partition, do the following.

The Usb image can be installed to any on the device. Just make sure that partition is the only one that is marked as bootable. You can partition your Usb storage device to contain the image as well as a storage partition. You can use the storage partition to:

- keep a small amount of recovered files.

- create a persistent home.

- or you can use it as swap space.

To partition your device, see .

If the storage partition is located after the LiveUsb image partition then Windows wont be able to see it. This is not a problem since you can create the storage partition first and put the live image at the end of the drive. Just make the LiveUsb image partition the only partition flagged as bootable.

When the drive boots the bootable partition will be used and you are good to go. The image's partition won't be seen by Windows.

 

Troubleshooting

 

If the device does not boot, you may need to install an MBR onto the device.

sudo apt-get install mbr

sudo install-mbr /dev/sdc

 

and try again.

 

Persistent Data

 

Create an ext2, ext3 or ext4 partition named "casper-rw" as a separate partition and append the word "persistent" to your "append" line configuration and all your session data will be stored there. You will be able to keep your changes between boots.

LABEL live
  menu label ^Start or install Ubuntu
  kernel /casper/vmlinuz
  append  file=/cdrom/preseed/ubuntu.seed boot=casper persistent initrd=/casper/initrd.gz quiet splash --
阅读(2027) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~