blog-186/source/_posts/debootstrap.md

415 lines
17 KiB
Markdown
Raw Normal View History

2020-12-19 14:55:12 +00:00
---
title: 如何使用debootstrap构建一个最小化的Ubuntu
date: 2020-12-19 22:39:33
tags:
- Ubuntu
- Linux
- Debootstrap
---
> debootstrap是debian及其附属分支下的一个工具用来构建一套基本的系统(根文件系统)。生成的目录符合Linux文件系统标准(FHS),即包含了/boot、/etc、/bin、/usr等等目录但它比发行版本的Linux体积小很多
<!--more-->
## 0.0 debootstrap介绍
### 0.1 啥是debootstrap
debootstrap是debian及其附属分支下的一个工具用来构建一套基本的系统(根文件系统)。生成的目录符合Linux文件系统标准(FHS),即包含了/boot、/etc、/bin、/usr等等目录但它比发行版本的Linux体积小很多
~~似曾相识燕归来~~
### 0.2 debootstrap有啥用
debootstrap可以用来快速 简便的构建一个最小化的debian及其附属分支的最小化rootfs
我们可以用其构建一个最小化的rootfs (主要是这个相较于 Ubuntu Server版本还是小得多)
### 0.3 如何使用debootstrap
其实 使用debootstrap很简单 他已经被放入到默认源了 我们只需要apt install即可
``` bash
sudo apt install debootstrap
```
如何使用呢 ~~自己看~~ 详情wiki
```bash
sudo debootstrap [--arch 架构(可选项)][发行版本] [目录] [映像源(可选项)]
```
## 1.0 开始动手构建自己的Ubuntu
我们这里使用Ubuntu Server 20.04作为Live CD来进行构建
### 1.1 进入Shell并安装debootstrap
![Ubuntu ISO shell](https://cdn.jsdelivr.net/gh/186526/jsdelivr@master/img/Ubuntu%20ISO.png)
1. 点击Help
2. Enter Shell
3. 可选修改sources.list
4. update sourcelist并安装debootstrap
``` bash
$ sudo apt update && apt install debootstrap
Ign:1 cdrom://Ubuntu-Server 20.04 LTS _Focal Fossa_ - Release amd64 (20200423) focal InRelease
Hit:2 cdrom://Ubuntu-Server 20.04 LTS _Focal Fossa_ - Release amd64 (20200423) focal Release
Get:4 http://mirrors.aliyun.com/ubuntu focal InRelease [265 kB]
Get:5 http://mirrors.aliyun.com/ubuntu focal-updates InRelease [107 kB]
Get:6 http://mirrors.aliyun.com/ubuntu focal-backports InRelease [98.3 kB]
Get:7 http://mirrors.aliyun.com/ubuntu focal-security InRelease [107 kB]
Get:8 http://mirrors.aliyun.com/ubuntu focal/main amd64 Packages [970 kB]
Get:9 http://mirrors.aliyun.com/ubuntu focal/main Translation-en [506 kB]
Get:10 http://mirrors.aliyun.com/ubuntu focal/main amd64 c-n-f Metadata [29.5 kB]
Get:11 http://mirrors.aliyun.com/ubuntu focal/restricted amd64 Packages [22.0 kB]
Get:12 http://mirrors.aliyun.com/ubuntu focal/restricted Translation-en [6212 B]
Get:13 http://mirrors.aliyun.com/ubuntu focal/restricted amd64 c-n-f Metadata [392 B]
Get:14 http://mirrors.aliyun.com/ubuntu focal/universe amd64 Packages [8628 kB]
Get:15 http://mirrors.aliyun.com/ubuntu focal/universe Translation-en [5124 kB]
Get:16 http://mirrors.aliyun.com/ubuntu focal/universe amd64 c-n-f Metadata [265 kB]
Get:17 http://mirrors.aliyun.com/ubuntu focal/multiverse amd64 Packages [144 kB]
Get:18 http://mirrors.aliyun.com/ubuntu focal/multiverse Translation-en [104 kB]
Get:19 http://mirrors.aliyun.com/ubuntu focal/multiverse amd64 c-n-f Metadata [9136 B]
Get:20 http://mirrors.aliyun.com/ubuntu focal-updates/main amd64 Packages [197 kB]
Get:21 http://mirrors.aliyun.com/ubuntu focal-updates/main Translation-en [77.7 kB]
Get:22 http://mirrors.aliyun.com/ubuntu focal-updates/main amd64 c-n-f Metadata [5676 B]
Get:23 http://mirrors.aliyun.com/ubuntu focal-updates/restricted amd64 Packages [11.0 kB]
Get:24 http://mirrors.aliyun.com/ubuntu focal-updates/restricted Translation-en [3000 B]
Get:25 http://mirrors.aliyun.com/ubuntu focal-updates/restricted amd64 c-n-f Metadata [116 B]
Get:26 http://mirrors.aliyun.com/ubuntu focal-updates/universe amd64 Packages [110 kB]
Get:27 http://mirrors.aliyun.com/ubuntu focal-updates/universe Translation-en [51.9 kB]
Get:28 http://mirrors.aliyun.com/ubuntu focal-updates/universe amd64 c-n-f Metadata [4092 B]
Get:29 http://mirrors.aliyun.com/ubuntu focal-updates/multiverse amd64 Packages [1172 B]
Get:30 http://mirrors.aliyun.com/ubuntu focal-updates/multiverse Translation-en [540 B]
Get:31 http://mirrors.aliyun.com/ubuntu focal-updates/multiverse amd64 c-n-f Metadata [116 B]
Get:32 http://mirrors.aliyun.com/ubuntu focal-backports/main amd64 c-n-f Metadata [112 B]
Get:33 http://mirrors.aliyun.com/ubuntu focal-backports/restricted amd64 c-n-f Metadata [116 B]
Get:34 http://mirrors.aliyun.com/ubuntu focal-backports/universe amd64 Packages [2784 B]
Get:35 http://mirrors.aliyun.com/ubuntu focal-backports/universe Translation-en [1272 B]
Get:36 http://mirrors.aliyun.com/ubuntu focal-backports/universe amd64 c-n-f Metadata [192 B]
Get:37 http://mirrors.aliyun.com/ubuntu focal-backports/multiverse amd64 c-n-f Metadata [116 B]
Get:38 http://mirrors.aliyun.com/ubuntu focal-security/main amd64 Packages [106 kB]
Get:46 http://mirrors.aliyun.com/ubuntu focal-security/universe amd64 c-n-f Metadata [1612 B]
Get:47 http://mirrors.aliyun.com/ubuntu focal-security/multiverse amd64 Packages [1172 B]
Get:48 http://mirrors.aliyun.com/ubuntu focal-security/multiverse Translation-en [540 B]
Get:49 http://mirrors.aliyun.com/ubuntu focal-security/multiverse amd64 c-n-f Metadata [116 B]
Fetched 17.1 MB in 6s (3096 kB/s)
Reading package lists... Done
Building dependency tree
Reading state information... Done
65 packages can be upgraded. Run 'apt list --upgradable' to see them.
Reading package lists... Done
Building dependency tree
Reading state information... Done
Suggested packages:
arch-test squid-deb-proxy-client
The following NEW packages will be installed:
debootstrap
0 upgraded, 1 newly installed, 0 to remove and 65 not upgraded.
Need to get 39.4 kB of archives.
After this operation, 299 kB of additional disk space will be used.
Get:1 http://mirrors.aliyun.com/ubuntu focal-updates/main amd64 debootstrap all 1.0.118ubuntu1.1 [39.4 kB]
Fetched 39.4 kB in 0s (221 kB/s)
Selecting previously unselected package debootstrap.
(Reading database ... 33860 files and directories currently installed.)
Preparing to unpack .../debootstrap_1.0.118ubuntu1.1_all.deb ...
Unpacking debootstrap (1.0.118ubuntu1.1) ...
Setting up debootstrap (1.0.118ubuntu1.1) ...
Processing triggers for man-db (2.9.1-1) ...
$ debootstrap
I: usage: [OPTION]... <suite> <target> [<mirror> [<script>]]
I: Try `debootstrap --help' for more information.
E: You must specify a suite and a target.
```
### 1.2 给硬盘分区
这步没啥好说的 用cfdisk进行分区 使用mkfs.ext4来格式化硬盘请记住如何分区的后面编写fstab会涉及到
| /dev路径 | 挂载位置 | 分区模式 | 作用 |
| --------- | -------- | -------- | ----------- |
| /dev/sda1 | /boot | fat32 | 负责efi引导 |
| /dev/sda2 | swap | swap | 内存交换 |
| /dev/sda3 | / | ext4 | 根目录 |
```bash
$ mkfs.ext4 /dev/sda3
mke2fs 1.45.5 (07-Jan-2020)
Creating filesystem with 9311995 4k blocks and 2330160 inodes
Filesystem UUID: fbe7f7fe-1997-4ab3-929f-52aa73aa72eb
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624
Allocating group tables: done
Writing inode tables: done
Creating journal (65536 blocks): done
Writing superblocks and filesystem accounting information: done
$ mkswap /dev/sda2
Setting up swapspace version 1, size = 4 GiB (4294963200 bytes)s
no label, UUID=9fe83e8e-cd78-4a25-8a1e-ab305181c46d
$ swapon /dev/sda2
$ mkfs.vfat /dev/sda1
mkfs.fat 4.1 (2017-01-24)
```
### 1.3 挂载分区并释放rootfs
这里构建选择最新的Focal X86_64位
```bash
$ mkdir /target
$ mount /dev/sda3 /target
$ debootstrap focal /target http://mirrors.aliyun.com/ubuntu
I: Retrieving InRelease
I: Checking Release signature
I: Valid Release signature (key id F6ECB3762474EDA9D21B7022871920D1991BC93C)
I: Retrieving Packages
I: Validating Packages
I: Resolving dependencies of required packages...
I: Resolving dependencies of base packages...
I: Checking component main on http://mirrors.aliyun.com/ubuntu...
I: Retrieving adduser 3.118ubuntu2
I: Validating adduser 3.118ubuntu2
I: Retrieving apt 2.0.2
I: Validating apt 2.0.2
…………………………………………………………
I: Configuring console-setup...
I: Configuring kbd...
I: Configuring ubuntu-minimal...
I: Configuring libc-bin...
I: Configuring systemd...
I: Configuring ca-certificates...
I: Base system installed successfully. ##当你看到这句时 说明你的操作没有问题
```
### 1.4 chroot并进行基本设置
#### 1.4.1 修改软件源
默认rootfs中的软件源不完整 我们这里cp一下live cd的软件源
``` bash
cp /etc/apt/sources.list /target/etc/apt/sources.list;sed -i 3d /target/etc/apt/sources.list
```
``` bash
$ cat >> /target/etc/apt/sources.list << EOF
# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted
# deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted
## Major bug fix updates produced after the final release of the
## distribution.
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted
# deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted
## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.
deb http://mirrors.aliyun.com/ubuntu/ focal universe
# deb-src http://mirrors.aliyun.com/ubuntu/ focal universe
deb http://mirrors.aliyun.com/ubuntu/ focal-updates universe
# deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates universe
## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team, and may not be under a free licence. Please satisfy yourself as to
## your rights to use the software. Also, please note that software in
## multiverse WILL NOT receive any review or updates from the Ubuntu
## security team.
deb http://mirrors.aliyun.com/ubuntu/ focal multiverse
# deb-src http://mirrors.aliyun.com/ubuntu/ focal multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates multiverse
# deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates multiverse
## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
# deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
## Uncomment the following two lines to add software from Canonical's
## 'partner' repository.
## This software is not part of Ubuntu, but is offered by Canonical and the
## respective vendors as a service to Ubuntu users.
# deb http://archive.canonical.com/ubuntu focal partner
# deb-src http://archive.canonical.com/ubuntu focal partner
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted
# deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted
deb http://mirrors.aliyun.com/ubuntu/ focal-security universe
# deb-src http://mirrors.aliyun.com/ubuntu/ focal-security universe
deb http://mirrors.aliyun.com/ubuntu/ focal-security multiverse
# deb-src http://mirrors.aliyun.com/ubuntu/ focal-security multiverse
```
#### 1.4.2 编写fstab
这里推荐一下这篇文章 [linux之fstab文件详解 来自csdn richerg85](https://blog.csdn.net/richerg85/article/details/17917129)
fstab主要由这几部分组成
``` text
<file system> <dir> <type> <options> <dump> <pass>
/dev下的位置挂载位置文件系统挂载参数dump 工具通过它决定何时作备份fsck 读取 <pass> 的数值来决定需要检查的文件系统的检查顺序。)
```
这里以我的fstab文件作为实例
```bash
$ cat >> /target/etc/fstab << EOF
tmpfs /tmp tmpfs nodev,nosuid 0 0
/dev/sda2 none swap defaults 0 0
/dev/sda3 / ext4 defaults,noatime 0 0
```
#### 1.4.3 chroot进入系统
先挂载efi分区
```bash
mkdir /target/boot/efi && \
mount /dev/sda1 /target/boot/efi
```
挂载proc等分区
```bash
for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /target$i; done
```
挂载并安装grub和kernel(这里安装的是虚拟化内核)
```bash
$ sudo chroot /target
$ sudo passwd ##配置passwd
New password:
Retype new password:
passwd: password updated successfully
$ sudo apt install grub-efi-amd64 linux-virtual -y ##安装grub和kernel
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
efibootmgr gettext-base grub-common grub-efi-amd64-bin grub-efi-amd64-signed grub2-common libefiboot1 libefivar1
libfreetype6 libfuse2 libpng16-16 linux-headers-generic linux-headers-virtual os-prober sbsigntool secureboot-db
Suggested packages:
rvice.
Running in chroot, ignoring request: daemon-reload
Running in chroot, ignoring request: is-active
Running in chroot, ignoring request: start
Setting up libefiboot1:amd64 (37-2ubuntu2) ...
Setting up linux-virtual (5.4.0.26.32) ...
Setting up libfreetype6:amd64 (2.10.1-2) ...
Setting up efibootmgr (17-1) ...
Setting up grub-common (2.04-1ubuntu26) ...
Running in chroot, ignoring request: daemon-reload
Running in chroot, ignoring request: daemon-reload
Running in chroot, ignoring request: is-active
Running in chroot, ignoring request: restart
update-rc.d: warning: start and stop actions are no longer supported; falling back to defaults
Running in chroot, ignoring request: daemon-reload
Running in chroot, ignoring request.
Running in chroot, ignoring request: daemon-reload
Running in chroot, ignoring request: is-active
Running in chroot, ignoring request: restart
Setting up os-prober (1.74ubuntu2) ...
Setting up grub-efi-amd64-bin (2.04-1ubuntu26) ...
Setting up grub2-common (2.04-1ubuntu26) ...
Setting up grub-efi-amd64 (2.04-1ubuntu26) ...
Setting up grub-efi-amd64-signed (1.142+2.04-1ubuntu26) ...
Processing triggers for systemd (245.4-4ubuntu3) ...
Running in chroot, ignoring request: daemon-reload
Processing triggers for libc-bin (2.31-0ubuntu9) ...
```
#### 1.4.4 安装grub2
```bash
$ grub-install /dev/sda
update-grub Installing for x86_64-efi platform.
Installation finished. No error reported.
$ update-grub
Sourcing file `/etc/default/grub'
Sourcing file `/etc/default/grub.d/init-select.cfg'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.4.0-26-generic
Found initrd image: /boot/initrd.img-5.4.0-26-generic
Adding boot menu entry for UEFI Firmware Settings
done
```
#### 1.4.5 设置网络
Ubuntu 18.04及其上的Server版本默认使用systemd-networkd联网
先使用ip a获取设备
```bash
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 ## ens33就是网络设备
link/ether 00:0c:29:9d:a0:73 brd ff:ff:ff:ff:ff:ff
inet 192.168.57.140/24 brd 192.168.57.255 scope global dynamic ens33
valid_lft 5433596sec preferred_lft 5433596sec
inet6 fe80::20c:29ff:fe9d:a073/64 scope link
valid_lft forever preferred_lft forever
```
配置所有网卡DHCP联网
```bash
$ cat >> /etc/systemd/network/ens33.network << EOF
[Match]
Name=*
[Network]
DHCP=both
```
#### 1.4.6 重启
```bash
$ exit
exit
reboot
```
PS: 第一次开机会有一点点慢(就亿点点)
### 1.5 重启并配置网络
启动systemd-networkd
```bash
$ systemctl enable --now systemd-networkd
Created symlink /etc/systemd/system/dbus-org.freedesktop.network1.service → /lib/systemd/system/systemd-networkd.service.
Created symlink /etc/systemd/system/multi-user.target.wants/systemd-networkd.service → /lib/systemd/system/systemd-networkd.service.
Created symlink /etc/systemd/system/sockets.target.wants/systemd-networkd.socket → /lib/systemd/system/systemd-networkd.socket.
Created symlink /etc/systemd/system/network-online.target.wants/systemd-networkd-wait-online.service → /lib/systemd/system/systemd-networkd-wait-online.service.
```
修改hostname并添加hosts
```bash
$ hostnamectl set-hostname vm-ubuntu-test
$ cat >> /etc/hosts << EOF
127.0.0.1 vm-ubuntu-test localhost
::1 vm-ubuntu-test localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
```
最后reboot生效
享受全新的ubuntu体验吧