返回主页

自建linux记录 | 组装linux



特别感谢:
字体德意黑 https://github.com/atelier-anchor/smiley-sans
哔哩哔哩up主于小乐_Unics的视频: 【教程】带你编译内核,手搓自己的Linux发行版!


1.打开文件夹
也就是存放存放busybox和kernel内核文件的文件夹
接下来我们需要建立一个后缀为img镜像文件
命令是


dd if=/dev/zero of=./linux.img bs=512M count=1 status=progress


要注意!!!!
dd是非常危险的指令!!!
请一定要三思而后行!!!
千万不要绝对路径!!!因为手滑最可怕!!!


命令解析:
我写的命令是,使用dd读取/dev/zero/输出到当前目录下的linux.img,每个块输出512M,输出1个块,并且列出过程
完成后会输出:
1+0 records in
1+0 records out
536870912 bytes (537 MB, 512 MiB) copied, 0.725475 s, 740 MB/s
接着输入:


ls -lh linux.img


得到:
-rw-r--r-- 1 root root 512M Jan  3 02:52 linux.img
接下来就需要建立一个文件夹了


mkdir root



2.镜像分区
确认当前目录下有linux.img这个文件
输入命令:


fdisk linux.img

Welcome to fdisk (util-linux 2.41.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS (MBR) disklabel with disk identifier 0xf8678042.

Command (m for help): 
查询状态:


p

Disk linux.img: 512 MiB, 536870912 bytes, 1048576 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xf8678042

Command (m for help): 
我的个人习惯是bios的启动方式确认当前type是msdos也就可以下一步了
输入:


n

就可以建立新分区了
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): 

根据提示,选择


p

Partition number (1-4, default 1): 
可以回车默认,也可以选择1
我用alpine的时候就碰到了需要手动按1的情况
所以我个人比较建议手动按1
First sector (2048-1048575, default 2048): 
这个是选择扇区起始位置
一般默认回车就行了
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-1048575, default 1048575): 
接下来就是分配大小了
这个可以看实际情况,我是512M的空间,分配100M就好了
当然,具体可以看自己分配内核只有16M,正常来说,大于16M的空间就够了

要注意命令,输入分配空间的时候要加上+
比方说:


+100M


接下来再建立一个分区
输入:


n



p


一路回车就好了
如下列:
Command (m for help): n
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 2
First sector (206848-1048575, default 206848): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (206848-1048575, default 1048575): 

Created a new partition 2 of type 'Linux' and of size 411 MiB.

Command (m for help): 
接下来,输入:


p

得到下列:
Disk linux.img: 512 MiB, 536870912 bytes, 1048576 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xf8678042

Device     Boot  Start     End Sectors  Size Id Type
linux.img1        2048  206847  204800  100M 83 Linux
linux.img2      206848 1048575  841728  411M 83 Linux

Command (m for help): 
最后,最关键的一步


w

保存修改

The partition table has been altered.
大功告成!!!!!
恭喜你,完成30%!!!!

3.挂载镜像

注意: 以下命令均需要root用户来操作
请各位手动切换至root用户


su root


接下来输入挂载img到设备命令:


losetup -f -P linux.img


回车后成功挂载,如果想查看是否挂载成功,可以输入:


lsblk

NAME               MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
loop0                7:0    0   512M  0 loop  
├─loop0p1          259:2    0   100M  0 part  
└─loop0p2          259:3    0   411M  0 part  
sda                  8:0    0  59.6G  0 disk  
├─sda1               8:1    0     1G  0 part  /boot
└─sda2               8:2    0  58.6G  0 part  
  └─arch-lv_root   253:0    0    40G  0 lvm   /
sdb                  8:16   0 465.8G  0 disk  
└─md127              9:127  0 931.3G  0 raid6 
  └─vg_nas-lv_data 253:1    0   500G  0 lvm   /mnt/nas_data
sdc                  8:32   0 465.8G  0 disk  
└─md127              9:127  0 931.3G  0 raid6 
  └─vg_nas-lv_data 253:1    0   500G  0 lvm   /mnt/nas_data
sdd                  8:48   0 465.8G  0 disk  
└─md127              9:127  0 931.3G  0 raid6 
  └─vg_nas-lv_data 253:1    0   500G  0 lvm   /mnt/nas_data
sde                  8:64   0 465.8G  0 disk  
└─md127              9:127  0 931.3G  0 raid6 
  └─vg_nas-lv_data 253:1    0   500G  0 lvm   /mnt/nas_data
sdf                  8:80   1  14.9G  0 disk  
└─sdf1               8:81   1  14.9G  0 part  
我的是这样的,可以看到
loop0                7:0    0   512M  0 loop  
├─loop0p1          259:2    0   100M  0 part  
└─loop0p2          259:3    0   411M  0 part  
这个就是挂载的img镜像的了
接下来就是给分区初始化文件系统的格式了
通用起见我选择ext4

要注意!!!!
接下来的命令是非常危险的!!!
请一定要三思而后行!!!
千万不要写错路径!!!因为手滑最可怕!!!


第一个分区是boot的


mkfs.ext4 /dev/loop0p1

mke2fs 1.47.3 (8-Jul-2025)
Discarding device blocks: done                            
Creating filesystem with 102400 1k blocks and 25584 inodes
Filesystem UUID: 6d4cac90-2dba-43db-a63b-aa2453593477
Superblock backups stored on blocks: 
	8193, 24577, 40961, 57345, 73729

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done 
第二个是root的


mkfs.ext4 /dev/loop0p2

mke2fs 1.47.3 (8-Jul-2025)
Discarding device blocks: done                            
Creating filesystem with 420864 1k blocks and 105248 inodes
Filesystem UUID: 957b83b2-0fa5-464c-9d9b-53a5a089c60f
Superblock backups stored on blocks: 
	8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done 
这样我们就初始化文件系统完毕了
下面输入:


mount /dev/loop0p2 ./root


这个命令是挂载img镜像的第二个分区到当前目录下的root文件夹
接下来再是


cd root && mkdir boot


这个命令是进入当前目录下的root文件夹后建立boot文件夹
这个boot文件夹就是我们要存放内核和安装引导的文件夹了


mount /dev/loop0p1 ./boot


这样就挂载完毕了
当然,我们还需要输入


lsblk


NAME               MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
loop0                7:0    0   512M  0 loop  
├─loop0p1          259:2    0   100M  0 part  /home/kami/Desktop/MBL/root/boot
└─loop0p2          259:3    0   411M  0 part  /home/kami/Desktop/MBL/root
当我们看到了之前载入设备的dev/loop后面跟上了文件夹的时候就完成啦~~~~

4.安装grub
依旧是需要root用户来操作
不过在此之前,需要先确定自己的启动方式
因为个人习惯,我比较偏向于传统的引导方式
也就是bios引导
需要uefi引导可以去看
哔哩哔哩up主
于小乐_Unics的视频: 【教程】带你编译内核,手搓自己的Linux发行版!

首先我们需要再次输入


lsblk


NAME               MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
loop0                7:0    0   512M  0 loop  
├─loop0p1          259:2    0   100M  0 part  /home/kami/Desktop/MBL/root/boot
└─loop0p2          259:3    0   411M  0 part  /home/kami/Desktop/MBL/root
得到以下信息后,就可以开始安装grub了


grub-install --target=i386-pc --boot-directory=./boot/ /dev/loop0


输入完后,你就会得到
Installing for i386-pc platform.
Installation finished. No error reported.
欸?奇怪,为什么会error呢?
每错,这就是最迷惑人的,这个是no error,也就是没问题的意思
我第一次也吓了一跳,当然即便是吓了一跳我也是一遍过的重复安装了5次

5.配置启动项
好的,现在grub安装完毕,我们就要配置启动项了
首先找到自己存放编译后产物的文件夹
我的分别是:
busybox 编译后产物
/home/kami/Desktop/MBL/busybox/

linux 内核
/home/kami/Desktop/MBL/bzImage

文件系统根路径
/home/kami/Desktop/MBL/root/

文件系统根路径下的boot文件夹
/home/kami/Desktop/MBL/root/boot/
接下来就需要把指定文件复制到指定位置了


cp -a /home/kami/Desktop/MBL/busybox/* /home/kami/Desktop/MBL/root/


把busybox编译后的产物复制到文件系统根路径
我这个是例子,大家可以按照自己的来


cp -a /home/kami/Desktop/MBL/bzImage /home/kami/Desktop/MBL/root/boot/


把linux内核复制到文件系统根路径下的boot文件夹
我这个是例子,大家可以按照自己的来
接下来建立三个文件夹


mkdir sys dev proc


这是必备的三个文件夹,非常只要哦
根据我的测试少了任何一个都会出现奇奇怪怪的问题
下面就要配置grub的启动脚本了


cd /home/kami/Desktop/MBL/root/boot/grub/


打开grub所在的文件夹


touch grub.cfg


新建grub.cfg文件
接下来用任意你喜欢的文件编辑器打开grub.cfg
修改里面内容为

menuentry "linux 0.1"{
  insmod ext2

  search --fs-uuid --set=root {UUID}
  linux /boot/bzImage root=PARTUUID={PARTUUID} rw 
  init=/init rootdelay=5 
}


这只是一个参考,如过要正确填入,需要查询UUID和PARTUUID


blkid /dev/loop0p{1,2}

root@arch-cat /h/k/D/MBL# blkid /dev/loop0p{1,2}
/dev/loop0p1: UUID="6d4cac90-2dba-43db-a63b-aa2453593477" BLOCK_SIZE="1024" TYPE="ext4" PARTUUID="f8678042-01"
/dev/loop0p2: UUID="957b83b2-0fa5-464c-9d9b-53a5a089c60f" BLOCK_SIZE="1024" TYPE="ext4" PARTUUID="f8678042-02"
root@arch-cat /h/k/D/MBL# 
这样就会列出这两个分区的UUDI和PARTUUID了
按照我的模板像这样填进去就好了

menuentry "linux 0.1"{
  insmod ext2

  search --fs-uuid --set=root 6d4cac90-2dba-43db-a63b-aa2453593477
  linux /boot/bzImage root=PARTUUID=f8678042-02 rw 
  init=/init rootdelay=5 
}

不过要注意,第一个UUID填的的应该是第一个分区的
第二个PARTUUID是第二个分区的


差不多了~只剩下init初始化脚本了

#!/bin/sh

mount -t proc none /proc
mount -t sysfs none /sys
mount -t devtmpfs devtmpfs /dev

#mount UUID=6d4cac90-2dba-43db-a63b-aa2453593477 /boot

#export HOME="/root"

clear

sleep 3

exec /sbin/init


完事了~大功告成
接下来就可以qemu启动啦~
不对不对,忘记赋予可执行的权限了


chmod +x init


接下来,就可以qemu启动了

6.qemu启动镜像


qemu-system-x86_64 linux.img -enable-kvm


最后不出意外会出现
can't run '/etc/init.d/rcS': No such file or directory

Please press Enter to activate this console. _
没关系,这是正常的按下回车就可以进入系统了
/ #
/ #
那么大功告成啦~~~
感谢您的阅读~~



留言区:

昵称: (20字)
留言内容: (100字)

2026-01-07 06:00:04
[傲娇绿坝娘~@arch-cat ArchLinux]
$ ⭐️~河蟹你全家~⭐️

2026-01-07 05:59:00
[哈基米南北绿豆@arch-cat ArchLinux]
$ 建站愉快,恭喜~

2026-01-07 05:56:14
[SkimrMe@arch-cat ArchLinux]
$ 有没有人成功呢?我这里一直卡黑屏,怎么办呢?

2026-01-07 05:43:20
[SkimrMe@arch-cat ArchLinux]
$ 写好咯~