将LD安装到自定义的btrfs+subvolume
Tofloor
poster avatar
woodelf
deepin
2013-12-01 07:33
Author
由于LD的安装程序目前并没有提供自定义btrfs subvolume的功能,在选择btrfs作为/的情况下,默认只会有@和@home这两个subvolume,难以适应多样化的存储和配置需求。

在经过多次测试之后,我终于顺利将LD安装到了我自己定制的btrfs+subvolume上,因此撰写本文,提供给有需要的朋友。

注意,本文仅适用于LD 2013版本,更早的版本有bug,会导致lightdm无法启动。当然,我也希望LD尽快完善安装程序,提供自定义subvolume的功能。另外,本文需要输入大量终端命令,因此不建议新手使用。

关于btrfs的诸多优势就不介绍了,网上铺天盖地了。btrfs最吸引我的两点特性是瞬间备份的快照和文件系统透明压缩,非常适合喜欢折腾系统的玩家。

如无特殊说明,本文涉及的命令都需要root权限。

以下就是具体的步骤:

首先进入LD 2013的LiveCD环境,安装必要的工具:
  1. apt-get install btrfs-tools squashfs-tools
Copy the Code
根据需要划分分区,我的是全盘GPT,分了四个分区。另外,为了安全起见,强烈建议把/boot单独分区,否则可能会有无法启动的风险。我的分区规划如下,/dev/sda2即为/boot,/dev/sda4就是btrfs分区:
1.png
把你的btrfs分区挂载到/mnt,同时指定挂载选项:
  1. mount -o defaults,compress=lzo,space_cache,autodefrag /dev/sda4 /mnt
Copy the Code
进入/mnt,首先创建一个根subvolume,作为以后的/,名字可以随便命名:
  1. cd /mnt
  2. btrfs subvolume create deepin
Copy the Code
然后继续创建其他必要的subvolume系统结构,可以根据自己需要随意创建:
  1. btrfs subvolume create deepin/home
  2. btrfs subvolume create deepin/opt
  3. btrfs subvolume create deepin/usr
  4. btrfs subvolume create deepin/src
  5. btrfs subvolume create deepin/var
  6. mkdir -p deepin/var/cache/apt
  7. btrfs subvolume create deepin/var/cache/apt/archives
Copy the Code
注意,这种方式创建出来的subvolume是树形结构的,和一般的目录结构无异。还有另一种创建平级subvolume的方法,不过个人觉得那种方式不利于管理,因此在这里我不作涉及。

创建未来的/boot,把/dev/sda2挂载过去:
  1. mkdir /mnt/deepin/boot
  2. mount /dev/sda2 /mnt/deepin/boot
Copy the Code

接着,把你的光驱挂载到/mnt2,以便稍后安装系统:
  1. mkdir /mnt2
  2. mount /dev/sr0 /mnt2
Copy the Code
可以正式进行系统安装了。熟悉Ubuntu安装方式的朋友应该知道,Ubuntu安装过程本质上就是把光盘里面casper目录下的filesystem.squashfs解压到目标分区罢了。LD 也是一样,因此,我们这里就依葫芦画瓢:
  1. unsquashfs -f -d /mnt/deepin /mnt2/casper/filesystem.squashfs
Copy the Code
等待解压过程完成,系统就算是安装好了。接着,我们需要chroot到安装好的系统里面去,进行一些必要的配置:
  1. cd /mnt/deepin
  2. mount --bind /dev dev
  3. mount --bind /dev/pts dev/pts
  4. mount --bind /proc proc
  5. mount --bind /sys sys
  6. chroot /mnt/deepin /bin/bash
Copy the Code
首先要进行配置的就是/etc/fstab了,这个配置文件非常重要。先查看一下各个subvolume的ID,稍后会有用:
  1. btrfs subvolume list /mnt
Copy the Code
2.png
接着用blkid命令查看你各个分区的UUID,分别写入/etc/fstab中。千万不要把UUID错写成UUID_SUB的值。格式按照我的来就行了:
  1. # UNCONFIGURED FSTAB FOR BASE SYSTEM
  2. UUID=db640880-7314-49d7-9b1c-4bf894b7508f  /boot  ext4  defaults,noatime  1 2
  3. UUID=96afad01-3ed3-448d-a39b-02110cbe57f4  none   swap  sw                0 0
  4. UUID=82efb462-fded-4a79-b1df-f6e3153c2840  /                btrfs defaults,subvolid=256,compress=lzo,space_cache,autodefrag  0 0
  5. UUID=82efb462-fded-4a79-b1df-f6e3153c2840  /home        btrfs defaults,subvolid=258,compress=lzo,space_cache,autodefrag  0 0
  6. UUID=82efb462-fded-4a79-b1df-f6e3153c2840  /opt           btrfs defaults,subvolid=259,compress=lzo,space_cache,autodefrag  0 0
  7. UUID=82efb462-fded-4a79-b1df-f6e3153c2840  /usr            btrfs defaults,subvolid=260,compress=lzo,space_cache,autodefrag  0 0
  8. UUID=82efb462-fded-4a79-b1df-f6e3153c2840  /usr/src      btrfs defaults,subvolid=261,compress=no,space_cache,autodefrag  0 0
  9. UUID=82efb462-fded-4a79-b1df-f6e3153c2840  /var            btrfs defaults,subvolid=262,compress=lzo,space_cache,autodefrag  0 0
  10. UUID=82efb462-fded-4a79-b1df-f6e3153c2840  /var/cache/apt/archives      btrfs defaults,subvolid=262,compress=lzo,space_cache,autodefrag  0 0
Copy the Code
btrfs挂载选项中的subvolid就是之前查看的那些ID。

然后还要修改/etc/hostname,改成你喜欢的主机名即可。另外,还要修改默认locale,否则会fallback到POSIX。创建/etc/default/locale文件,写入以下内容:
  1. LANG="zh_CN.UTF-8"
  2. LANGUAGE="zh_CN.UTF-8:zh_CN
Copy the Code
还要修改/etc/default/useradd文件,把SHELL=/bin/sh改为SHELL=/bin/bash。

创建一个新用户,按照我的来即可,已经指定了所有必要的组:
  1. useradd -m -G disk,cdrom,audio,video,plugdev,games,users,bluetooth YOURUSERNAME
Copy the Code
别忘了设置root和用户密码:
  1. passwd
  2. passwd YOURUSERNAME
Copy the Code
通过visudo命令,把你的用户加入sudoer,在root ALL=(ALL:ALL) ALL下面添加一行:
  1. YOURUSERNAME ALL=(ALL:ALL) ALL
Copy the Code
把grub安装到/dev/sda,并更新initramfs,忽略错误提示。这里我们还不能更新grub.cfg,因为grub还无法识别根分区:
  1. grub-install /dev/sda
  2. update-initramfs -c -k all
Copy the Code
然后重启,意料之中,进入了grub rescue模式。不要着急,先输入以下命令手动启动系统,具体的硬盘和分区编号根据你自己的情况修改:
  1. insmod part_gpt
  2. insmod ext2
  3. set root=(hd0,gpt2)
  4. linux /vmlinuz-3.8.0-33-generic root=/dev/sda4 quiet rootflags=subvol=deepin nosplash
  5. initrd /initrd-3.8.0-33-generic
  6. boot
Copy the Code
注意以上rootflags=subvol=deepin内核参数,后面的deepin改为你先前创建的根subvolume名称。另外,我的是GPT,如果你是MBR,分别把第一行和第三行中的gpt改为msdos即可。

不出意外,应该可以顺利登录系统了,效果和安装程序安装的系统一样。记得生成一份grub.cfg配置文件:
  1. update-grub
Copy the Code
OK!这样一来就全部完成了,放两张我的效果图。可以看到,经过lzo压缩以后,安装完成以后的系统体积比安装在ext4文件系统减少了1.2GiB左右:
6.png
7.png
本安装方法其实也不局限于自定义btrfs+subvolume,你也可以通过这种方法自定义如LUKS,LVM等各种分区规划。而这些是安装程序所无法提供的特性。当然,也期待安装程序以后可以更灵活,更强大。
Reply Favorite View the author
All Replies
summving
deepin
2013-12-01 22:53
#1
很给力,虽然用不上,支持!
Reply View the author
Ldeepin
deepin
2015-02-17 07:13
#2
姗姗来迟的赞给你!
Reply View the author
whytlze
deepin
2015-03-25 19:03
#3
谢谢!用这个方法安装了2014.2到btrfs subvolume中,以前一直以为不能这样安装。
Reply View the author