如何把Linux系统移植到U盘或移动硬盘上,并从USB驱动器中启动并运行?下面我将教大家制作随身携带、即插即用的Linux *** 作系统。(把当前系统移植到移动硬盘上)
为什么需要这个功能呢?
硬件:
软件:
Linux发行版自带的工具 如 gparted grub cp
制作
Linux启动盘的制作分为以下几个步骤:分区、复制文件、安装grub并配置、测试。 目的是把当前系统移植到移动硬盘上。
从LiveCD启动,打开gparted分区工具, 把移动硬盘的分区表改为GPT 。我使用以下分区方案:
sdb1是UEFI+GPT模式下的引导分区,grub引导器就要装在这里。
sdb2是放数据的,为了与Winodws兼容所以采用NTFS。
sdb3是Linux系统的全部内容,如果你想把家目录单独分出来也可以。
后面留空备用,结果如下图
我原系统的文件储存在 /dev/nvme0n1p3 (根分区)和 /dev/nvme0n1p4 (家分区)上,把这两个分区挂载到 /mnt /mnt/home。每个人的分区情况不同,需要对应修改。挂载后,/mnt 目录包括原系统的所有内容。
挂载 /dev/sdb3 到 /media/backup,把 /mnt 内容全部复制到 /media/backup
cp -a /mnt/* /media/backup/
GRUB 提供一个安装程序grub-install用以安装 GRUB 到磁盘,下面是grub-install的一些常用参数及选项:
UEFI 特有参数及选项:
挂载 /dev/sdb1 到 /media/backup/boot/efi ,把grub安装到移动硬盘上
上面的 --boot-directory --efi-directory --removable 不可省略。
安装之后要修改grub配置文件,就让他自动生成好了。但要禁用os-prober功能——自动探测硬盘上的其他 *** 作系统然后生成配置。Linux To Go 不依赖于其他 *** 作系统,它的启动菜单里只有自己。注意,不要使用update-grub,因为它会修改UEFI启动项。
修改 /media/backup/etc/fstab,把UUID换成对应的值
安装grub后,还要手动修改 /media/backup/etc/fstab 。Linux To Go只需要自动挂载两个分区—— sdb1 ESP 和 sdb3 DEEPIN_ROOT,修改对应的UUID。
现在可以重启试试了。开机按下F12 UEFI启动菜单中有移动硬盘这个启动项,选择即可。
如果成功就OK;如果黑屏断电,查看/media/backup/boot/efi 下的文件 把BOOTX64.EFI删除,把 grubx64.efi 重命名为 BOOTX64.EFI 再重启。
系统启动过程1、加电自检(POST代码)
2、boot loader
GRUB -- /boot/grub/grub.conf
kernel
initrd.img
3、INIT
/sbin/init ----- /etc/inittab
/etc/rc.d/rc.sysinit
/etc/rc.d/rc RUNLEVEL
/etc/rc$runlevel.d/S* start
/etc/rc$runlevel.d/K* stop
/etc/X11/prefdm
4、登录
文本 login
图形 gdm/kdm
自制一个U盘系统
准备工作:在真实机中把yum配置好
[root@localhost /]# ls /mnt/Server/ 这是软件包所处的目录
[root@localhost /]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# ls
rhel-debuginfo.repo
[root@localhost yum.repos.d]# cp rhel-debuginfo.repo pg.repo
[root@localhost yum.repos.d]# vim pg.repo
[root@localhost yum.repos.d]# cat pg.repo
[rhel-server]
name=Red Hat Enterprise Linux
baseurl=file:///mnt/Server
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
1、准备U盘,并分区,格式化成ext3(可选)文件系统[root@localhost pg]# fdisk -l
[root@localhost pg]# fdisk -l
Disk /dev/sda: 4003 MB, 4003463168 bytes
84 heads, 20 sectors/track, 4654 cylinders
Units = cylinders of 1680 * 512 = 860160 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 5 4655 3905600 c W95 FAT32 (LBA)
[root@localhost pg]# fdisk /dev/sda
The number of cylinders for this disk is set to 4654.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Command (m for help): d
Selected partition 1
Command (m for help): p
Disk /dev/sda: 4003 MB, 4003463168 bytes
84 heads, 20 sectors/track, 4654 cylinders
Units = cylinders of 1680 * 512 = 860160 bytes
Device Boot Start End Blocks Id System
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-4654, default 1):
Using default value 1
Last cylind[root@localhost pg]# mount -t ext3 /dev/sda1 /neter or +size or +sizeM or +sizeK (1-4654, default 4654):
Using default value 4654
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: 设备或资源忙.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.
[root@localhost pg]# partprobe /dev/sda
[root@localhost pg]# ls /dev/sda1
/dev/sda1
--------------
[root@localhost pg]# mkfs.ext3 /dev/sda1
2、挂载U盘,并把相关文件拷到U盘中
[root@localhost pg]# mount -t ext3 /dev/sda1 /net
把/目录树结构在u盘创建好
]# yum --installroot=/net -y install filesystem
/boot
这个目录应该有vmlinuz-x.x.x initrd-x.x.x.img
/boot/grub
这个目录中应该有grub的相关文件
grub还要安装到u盘的首扇区中(grub-install)
/bin /sbin /lib /usr/lib
这些个目录下应该有一些命令和库文件
bash ls cp mv
mount
ifconfig
fdisk
mkfs.ext3
基本上你需要的程序比较多,大概有以下一些常用的:
coreutils setup grub vim-enhanced
vim-common gpm perl iptables
openssh openssh-clients
module-init-tools iputils grep awk sed
procps tar bash gcc make rp-pppoe
passwd libuser e2fsprogs util-linux
net-tools SysVinit kernel
-----------------------
a.关于vmlinuz文件:
]# cp /boot/vmlinuz-2.6.18-194.el5 /net/boot/
b.关于initrd.img文件: 为了包含u盘的驱动,需要手动生成initrd.img(包含usb-storage)
]# modinfo -F filename usb-storage
]# mkinitrd --with=usb-storage /net/boot/initrd-usb-2.6.18-194.img `uname -r`
c. 使用此命令grub-install将grub安装到u盘的首扇区中
grub-install 需要安装grub软件包生成
]# yum --installroot=/net -y install grub
]# grub-install /dev/sda 最后执行这一步,还有一些必要工作没做
d. ]# cat /net/boot/grub/grub.conf
default=0
timeout=5
title RHEL5U5 usb linux for pg
root (hd0,0)
kernel /boot/vmlinuz-2.6.18-194.el5 ro root=/dev/sda1
initrd /boot/initrd-usb-2.6.18-194.img
e. 为了生成以下这些常用的命令,装包
bash ls cp mv
mount
ifconfig
fdisk
mkfs.ext3
yum bash ls cp mv
mount
ifconfig
fdisk
mkfs.ext3
yum --installroot=/net -y install coreutils setup grub vim-enhanced vim-common gpm perl iptables openssh openssh-clients module-init-tools iputils grep awk sed procps tar bash gcc make rp-pppoe passwd libuser e2fsprogs util-linux net-tools SysVinit kernel pam
f.在U盘系统启动的时候,需要读fstab文件,挂载文件系统
]# cp /etc/fstab /net/etc
]# vim /net/etc/fstab
]# cat /net/etc/fstab
/dev/sda1 / ext3 defaults 0 0
开始安装GRUB程序
]# chroot /net/
bash-3.2#
]# chroot /net/
bash-3.2# grub-install /dev/sda
Probing devices to guess BIOS drives. This may take a long time.
No suitable drive was found in the generated device map. 这个错误意味着需要去写devices.map文件
bash-3.2# ls /dev/sda
ls: /dev/sda: 没有那个文件或目录
bash-3.2# ls /dev/sda1
ls: /dev/sda1: 没有那个文件或目录
bash-3.2# mknod /dev/sda b 8 0
bash-3.2# mknod /dev/sda1 b 8 1
bash-3.2# cat /etc/mtab
/dev/sda1 / ext3 rw 0 0
bash-3.2# cat /boot/grub/device.map
(fd0) /dev/fd0
(hd0) /dev/sda
bash-3.2# grub-install /dev/sda
Could not find device for /dev/mapper/*
Could not find device for /dev/mapper/*
Could not find device for /dev/mapper/*
Installation finished. No error reported.
This is the contents of the device map /boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.
(fd0) /dev/fd0
(hd0) /dev/sda
]# chroot /net/
bash-3.2# passwd root 修改密码不成功,将导致 u盘系统启动后,用root登录不成功。
Changing password for user root.
passwd: Authentication token manipulation error
解决方法:
vim /net/etc/passwd
root:*:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
这样再把root密码设置为你想要的!
检查 以下过程是否正确:
/boot/grub/grub.conf
/etc/inittab ---默认运行级别应该是3
/etc/fstab
/etc/passwd
/etc/shadow
pam程序包做验证的
ls /dev/sda /dev/sda1
]# chroot /net/
bash-3.2# passwd root 这一步必须能成功
---------------------------------------
[root@localhost pg]# rpm -q kernel-doc
kernel-doc-2.6.18-194.el5
[root@localhost pg]# gedit /usr/share/doc/kernel-doc-2.6.18/Documentation/devices.txt
自己定制linux系统这个是需要非常了解和理解linux内核和其他系统代码方面知识才能完成的(以下是知识准备):
Linux的启动过程原理
initramfs的本质,如何编译内核,制作OpenStack镜像的根本原理
initramfs, 内核,镜像之间的关系
chroot的根本原理,以及网上将linux安装在arm的安卓手机的基本原理
简要说下系统定制的基本流程(步骤):
创建工作目录
使用busybox生成根文件系统中的bin等目录
创建服务启动脚本与inittab文件与fstab文件
创建根文件系统的init脚本(initrc使用linuxrc,而initramfs使用init脚本,所以先删除busybox为initrc生成的默认的linuxrc文件,rm-rf$LINUX/linuxrc),init文件可以是任何ELF格式的可执行性文件,例如如果是一个编译过的C程序也是可以的,记得安装编译c文件要用到的库:sudoyum install -y glibc-static libstdc++-static。
使用chroot在未make内核之前就可以先测试initramfs
构建initramfs,先配置支持Generalsetup ->Initial RAM filesystem and RAM disk (initramfs/initrd)support (默认就是支持的),再将linux内核的CONFIG_INITRAMFS_SOURCE(Generalsetup ->initramfs sourcefile(s))指向这个目录,然后执行make命令内核就会自动构建生成initramfs了(是一个压缩过的cpio档案文件),并且将它链接到内核镜像中。
调试验证。可以使用物理机验证,也可以采用qemu虚机验证。如果使用物理机来验证的话,本来可以直接使用makeinstall命令自动安装,但最好不要这么做,因为它会自动执行updategrub命令来破坏你的grub文件,可以手工做:
initramfs是一个最小化的根文件系统,它的根本目的是为了为切换到新的根文件系统做准备。initrd方式使用pivot_root命令切换到新的根文件系统,然后卸载ramdis,但是initramfs方式由于它是本身就是rootfs(rootfs是ramfs的一个实例)位于内存中,所以它既不能pivot_root,也不能umount,是常驻内存的。
对模块的支持,到目前为止,我们在构建initramfs时还没有涉及内核模块的支持,所用到的硬件驱动程序都是直接编译到内核中。现在我们就看看如何使initramfs支持内核模块。
总结:
整个过程是,initrc或者initramfs都是一个运行在内存的小根文件系统,它有一个叫init的脚本,做完一些准备工作之后,如加载硬件的驱动,然后会切换到镜像所在的新根文件系统上。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)