相关文章:
客制化linux,将我们需要的功能保留,其他全部精简
项目地址
整体思路:
首先新增一块硬盘挂载,历经分配分区大小、格式化、拷贝boot、修改grud文件(引导)中uuid后完成初始化,在新建虚拟机,导入我们客制化的硬盘(移除默认硬盘)
首先添加一块硬盘
格式化硬盘
1.查看目前磁盘情况
lsblk
2.格式化sdb
[sunnyli@sunnyli ~]$ su
密码:
[root@sunnyli sunnyli]# fdisk /dev/sdb (格式化sdb)
分配boot分区大小
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
Device does not contain a recognized partition table
使用磁盘标识符 0xd7f12385 创建新的 DOS 磁盘标签。
命令(输入 m 获取帮助):n (分配磁盘)
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
分区号 (1-4,默认 1):
起始 扇区 (2048-20971519,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-20971519,默认为 20971519):**+500M**(分配500m)
分区 1 已设置为 Linux 类型,大小设为 500 MiB
分配主分区大小
命令(输入 m 获取帮助):n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p):
Using default response p
分区号 (2-4,默认 2):
起始 扇区 (1026048-20971519,默认为 1026048):
将使用默认值 1026048
Last 扇区, +扇区 or +size{K,M,G} (1026048-20971519,默认为 20971519):
将使用默认值 20971519
分区 2 已设置为 Linux 类型,大小设为 9.5 GiB
命令(输入 m 获取帮助):w (写入退出)
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
3.再次查看磁盘分配情况
4.格式化磁盘
[root@sunnyli sunnyli]# mkfs.ext4 /dev/sdb1
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=1024 (log=0)
分块大小=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
128016 inodes, 512000 blocks
25600 blocks (5.00%) reserved for the super user
第一个数据块=1
Maximum filesystem blocks=34078720
63 block groups
8192 blocks per group, 8192 fragments per group
2032 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409
Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (8192 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
[root@sunnyli sunnyli] mkfs.ext4 /dev/sdb2
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
623392 inodes, 2493184 blocks
124659 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=2151677952
77 block groups
32768 blocks per group, 32768 fragments per group
8096 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
5.创建目录,并挂载新的磁盘
mount临时挂载,重启失效
6.安装grub, 内核文件拷贝至目标磁盘
q:拷贝boot分区到新的硬盘时为什么用到了grub?
a:Linux GRUB是一个引导加载程序,用于启动并加载Linux操作系统。它的主要功能是在计算机启动时加载操作系统,并提供一个菜单,让用户选择要启动的操作系统或系统内核。此外,GRUB还提供了一些高级功能,例如在启动时设置内核参数、在多个硬盘之间切换等。它也可以用于修复系统启动问题,例如修复损坏的引导记录或修复损坏的文件系统。
在拷贝boot分区到新的硬盘时使用GRUB是因为GRUB是一个引导加载程序,可以帮助您在新的硬盘上启动操作系统。当您拷贝boot分区到新的硬盘时,您需要安装GRUB并将其配置为在新硬盘上启动操作系统。这通常包括将GRUB安装到新硬盘的MBR(主引导记录)或EFI系统分区,并在GRUB配置文件中指定要启动的操作系统或内核。通过使用GRUB,您可以确保新硬盘上的操作系统可以正确启动,并且可以避免出现启动问题。
拷贝boot分区
7.修改/mnt/boot/grud2/grud.cfg文件
lsblk -l 查看sdb分区uuid
修改文件
将文件中的sdb /boot uuid替换sda /boot,主分区也替换。
可以使用vim查找 /关键字 按n下一个
在linux16开头的行最后添加selinux=0 init=/bin/bash
拷贝指令
mkdir -pv /mnt/sysroot/{etc/rc.d,usr,var,proc,sys,dev,lib,lib64,bin,sbin,boot,srv,mnt,media,home,root}
这是一个Linux命令,意思是创建一个名为/sysroot的目录,并在其中创建多个子目录,包括/etc/rc.d、/usr、/var、/proc、/sys、/dev、/lib、/lib64、/bin、/sbin、/boot、/srv、/mnt、/media、/home和/root。选项-p表示如果目录不存在,则递归创建所有父目录,选项-v表示在创建目录时显示详细信息。
cp /lib64/. /mnt/sysroot/lib64/
cp /bin/bash /mnt/sysroot/bin/
拷贝其他指令
cp /bin/ls /mnt/sysroot/bin/
cp /bin/* /mnt/sysroot/bin/
cp /sbin/* /mnt/sysroot/sbin/
新建虚拟机,替换磁盘为我们的sdb
完成(没有配置环境变量用绝对路径)
q:
我在移植linux时首先#mount /dev/sdb1 /mnt/boot #mount /dev/sdb2 /mnt/sysroot/
然后cp -rf /boot/* /mnt/boot/,最后修改/mnt/boot/grub2/grub.cfg文件中原来的uuid为sdb的uuid。这个过程中sdb2挂载的目录名称有要求吗?
a:
在移植Linux时,挂载目录的名称没有特定要求。您可以自己定义一个有意义的名称。只需确保您在使用该目录时,使用正确的路径即可。在上述命令中,/mnt/sysroot/是一个常用的目录名称,但您可以使用其他名称,只要您在使用该目录时使用正确的路径即可。
q:
他怎么不把boot目录识别为根目录,根目录识别为boot目录呢,是不是有什么文件
a:
Linux系统中的根目录通常是由启动加载程序(如GRUB)指定的。在启动时,启动加载程序会读取指定的根文件系统,并将其挂载为根目录。通常情况下,根文件系统的指定是通过修改启动加载程序配置文件(如GRUB配置文件)中的参数来实现的。
/boot目录通常包含启动加载程序和内核映像文件,但它不是根目录。根目录是Linux文件系统中的顶级目录,它包含了整个文件系统的层次结构。
因此,即使您将/boot目录复制到新的磁盘分区上并将其挂载为/boot目录,Linux系统仍然会将/sysroot目录视为根目录,因为这是由启动加载程序指定的。如果您将/boot目录挂载为根目录,则该文件系统中的所有其他目录和文件都将被挂载为/boot目录的子目录,这可能会导致系统无法正常启动。
q:
所以系统之所以可以识别是因为我修改了grud文件的uuid吗
a:
是的,如果您在新系统中使用了原始系统的文件系统,并将其挂载到/sysroot目录下,那么您需要更新GRUB的配置文件(grub.cfg)以反映新的文件系统的UUID信息。因为GRUB启动加载程序会使用该UUID信息来找到并挂载根文件系统。
如果您不更新GRUB的配置文件,则GRUB启动加载程序无法正确识别新的文件系统,并可能导致系统无法正常启动。所以,更新GRUB的配置文件以反映新的文件系统的UUID信息是非常必要的。
q:
有个问题,根目录中包含了/boot,为什么还会有boot分区,难道有两个boot吗
a:
在Linux系统中,/boot目录通常包含了启动加载程序和内核映像文件等文件。这些文件通常存储在根文件系统中的/boot目录中。但是,在某些情况下,/boot目录可能无法存放在根文件系统中,例如,如果根文件系统使用的是某些特殊的文件系统格式(如Btrfs),则/boot目录可能无法支持该格式,因此需要单独挂载为一个独立的分区。
因此,/boot分区的作用就是为了存放/boot目录中的文件。这样做的好处是,它可以使/boot目录的文件系统格式与根文件系统的格式独立,从而提高了系统的灵活性和可靠性。同时,将/boot目录单独挂载为一个分区还可以提高系统的安全性,因为/boot分区可以进行单独的加密和保护,从而增加了系统的安全性。
q:
那两个boot内容一样吗
a:
在大多数情况下,/boot分区中的内容和根文件系统中的/boot目录中的内容是相同的。因为/boot分区通常是为了存放/boot目录中的文件而存在的,所以它们的内容应该是一致的。
然而,在某些情况下,/boot分区中的内容可能会与根文件系统中的/boot目录中的内容不同。例如,如果您手动复制了一些文件到/boot分区中,而没有同步更新根文件系统中的/boot目录,则它们的内容将不同步。这种情况下,可能会导致系统无法正常启动或出现其他问题。
因此,为了确保系统的正确性和稳定性,通常建议将/boot分区和根文件系统中的/boot目录保持同步,即它们的内容应该是一致的。