利用debootstrap制作最小化Debian

写在开头

一般的从DVD安装系统总是有大量的我们不需要的软件,那么我们可以使用debootstrap来获取一个根文件系统,然后再在这个最小化rootfs上添砖加瓦。
我这里是制作一个最小化的无桌面环境的Debian系统,需要桌面的可以在后期安装。

系统环境:Debian9 LiveCD
虚拟环境:VMBOX 虚拟机

我是先在虚拟机创建个新磁盘,然后再上面安装测试,最后等合适的时候再把rootfs拷到新主机上用的。
我的主机是以UEFI方式启动的,它执行硬盘上第一个为Fat32的分区上的EFI\boot\bootx64.efi来引导系统启动,所以后面配置引导程序非常简单。

准备工作

  1. 由于我的硬盘还未分区和格式化,所以先在LiveCD中使用命令 sudo fdisk /dev/sdb 来分区,我的分区情况如下:

Device Start End Sectors Size Type
/dev/sdb1 2048 207000 204953 100.1M Fat32
/dev/sdb2 208896 20971486 20762591 9.9G Ext4

  1. 接下来执行下面命令分区并挂载。
1
2
3
4
sudo mkfs.vfat /dev/sdb1
sudo mkfs.ext4 /dev/sdb2
sudo mount /dev/sda1 /media/efi/
sudo mount /dev/sda2 /media/root/
  1. 安装debootstrap:sudo apt install debootstrap

开始获取

关于 debootstrap 的用法请网上搜索,这里就省略了。

  1. 执行下面第一句命令来获取Debian的根文件系统,出现 I: Base system installed successfully. 字样表示成功获取。

  2. 执行下面第二句命令来挂载相关文件夹

  3. 执行下面第三句命令来切换根目录到已获取的根文件系统下。

1
2
3
4
5
sudo debootstrap --arch=amd64 stretch /media/root/ http://mirrors.aliyun.com/debian

sudo mount -o bind /dev /media/root/dev && mount -o bind /proc /media/root/proc && mount -o bind /sys /media/root/sys

sudo chroot /media/root/ /bin/bash -l

修改相关

好了,现在可以说就在新根文件系统中了,为新系统做初始设置吧!

  1. 修改root密码
  2. 添加用户及组
  3. 配置域名解析
  4. 配置软件源
  5. 改为东八区时
  6. 修改主机名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
passwd root

groupadd <用户组>
useradd -m -g <用户组> -s /bin/bash <用户名>
passwd <用户名>

echo "nameserver 114.114.114.114" > /etc/resolv.conf

echo "deb http://mirrors.aliyun.com/debian/ stretch main non-free contrib" > /etc/apt/sources.list

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

HOSTNAME=<你的主机名>
echo $HOSTNAME > /etc/hostname
sed -i '/localhost/s/$/\t'"$HOSTNAME"'/g' /etc/hosts

安装软件

  1. 安装内核,没有内核就无法启动
1
apt install linux-image-amd64
  1. 安装你需要的软件(根据你的需要安装)
1
2
3
apt install sudo vim openssh-server htop
apt install pciutils usbutils acpi
apt install net-tools wireless-tools wpasupplicant rfkill

其他配置

  1. 首先执行 lsblk -f 获取磁盘的UUID
1
2
3
4
NAME   FSTYPE LABEL UUID                            FSAVAIL FSUSE% MOUNTPOINT
sda
|-sda1 vfat boot 9A46-9516 100.1M 2% /boot/efi
`-sda2 ext4 root 004e6e14-b1bd-384b-84a5-93d03fdcf964 9.9G 7% /
  1. 修改 /etc/fstab 的开机挂载,我的/etc/fstab 的内容为:
1
2
UUID=9A46-9516				   /boot/efi  vfat defaults	0 1
UUID=004e6e14-b1bd-384b-84a5-93d03fdcf964 / ext4 defaults,noatime 0 1
  1. 有的UEFI默认 startup.nsh 为EFI初始启动脚本,所以添加一个:
1
echo "fs0:\efi\boot\bootx64.efi" > /media/efi/startup.nsh
  1. grub配置,由于我的grub是自己提取的单文件,只要放EFI/boot/bootx64.efi就行了,所以不用安装grub了。

这步请根据你实际的硬件来配置,我的 /boot/efi/efi/boot/grub.cfg 内容为:

1
2
3
4
5
6
7
8
9
10
11
12
set timeout=1
set menu_color_normal=cyan/blue
set menu_color_highlight=white/blue

menuentry "Debian GNU/Linux (kernel 4.9-amd64)" {
echo 'Set Root ...'
search --no-floppy --fs-uuid --set=root 004e6e14-b1bd-384b-84a5-93d03fdcf964
echo 'Loading Kernel ...'
linux /vmlinuz root=UUID=004e6e14-b1bd-384b-84a5-93d03fdcf964 quiet
echo 'Loading Initial Ramdisk ...'
initrd /initrd.img
}

准备启动

前面种种操作完成后就可以退出chroot环境了。

  1. 执行 exit 退出chroot环境。

  2. 执行下面命令卸载挂载的目录。

1
sudo umount /media/root/dev && umount /media/root/proc && umount /media/root/sys
  1. 把磁盘装到新虚拟机上开机。

系统调教

现在已经可以进入新系统了,但还是有一些问题需要优化。

  1. 网络问题
1
2
3
4
常用网驱:firmware-realtek firmware-atheros firmware-iwlwifi firmware-brcm80211 
查看网卡:ifconfig -a
启用网卡:ifconfig <interface_name> up
获取DHCP:dhclient <interface_name>
  1. 开机启动rc.local

Debian 9 默认不带 /etc/rc.local 文件,而 rc.local 服务却还是自带的,为了解决这个问题,我们需要手工添加一个 /etc/rc.local 文件

1
2
3
4
5
6
7
echo "#!/bin/sh -e" > /etc/rc.local
echo "exit 0" >> /etc/rc.local # 新建 rc.local 脚本

chmod +x /etc/rc.local # 添加执行权限

systemctl start rc-local # 启动 rc-local 服务
systemctl status rc-local # 查看 rc-local 服务状态

后记

  1. 因为每个人的硬件不同,所以您需要修改相关路径已适用您的主机。

  2. 本文仅供参考,具体请自行摸索,本人不对您出现的问题负任何责任。

  3. 因为只是用来备忘,所以过程有点马虎,建议您有一定基础再参考。

End