LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1264|回复: 12

虚拟机中测试使用全btrfs + GPT 过程需要注意的事项[分享]

[复制链接]
发表于 2011-8-22 16:57:47 | 显示全部楼层 |阅读模式
https://wiki.archlinux.org/index.php/Installing_on_Btrfs_root 官方文档

http://tincman.wordpress.com/201 ... legacy-bios-system/  

为即将到来的btrfs做准备,在虚拟机上玩玩btrfs, 为 > 2T硬盘做准备,所以想到了GPT
还没有试过bios的电脑上使用GPT分区来使用 windows XP是咋样的,有经验的朋友请分享一下

注意事项:
1. 按arch官方wiki安装无法引导grub2
对比了另一个文档 后发现要设置btrfs的/boot所在分区为
  1. 2 - legacy BIOS bootable
复制代码
否则grub2找不到引导目录,开机停在 grub 就没反应了
2. 官方文档也说了为什么要mount /var/lib/btrfs-root /mnt/boot
因为grub2引导时找/boot进不到 subvol里去,所以需要将boot弄到subvol的外面来,
3. 目前在vmware 下测试ok, 使用btrfs要小心

以下是虚拟机里分区情况

  1. # gdisk -l /dev/sda
  2. GPT fdisk (gdisk) version 0.7.2

  3. Partition table scan:
  4.   MBR: protective
  5.   BSD: not present
  6.   APM: not present
  7.   GPT: present

  8. Found valid GPT with protective MBR; using GPT.
  9. Disk /dev/sda: 4194304 sectors, 2.0 GiB
  10. Logical sector size: 512 bytes
  11. Disk identifier (GUID): A9D31E04-1413-49FD-9A1E-90C5063BB770
  12. Partition table holds up to 128 entries
  13. First usable sector is 34, last usable sector is 4194270
  14. Partitions will be aligned on 2048-sector boundaries
  15. Total free space is 2014 sectors (1007.0 KiB)

  16. Number  Start (sector)    End (sector)  Size       Code  Name
  17.    1            2048           22527   10.0 MiB    EF02  efi
  18.    2           22528         3094527   1.5 GiB     8300  root
  19.    3         3094528         4194270   537.0 MiB   8200  swap

复制代码


使用的是archboot来启动的,因为用不来里面的parted所以就手工gdisk 来分区,然后安装grub2, 将引导安到硬盘上grub-install --no-floppy /dev/sda ,再配置一下grub.cfg就搞定了
其实第一和第三个分区没用上,如果要用笔记本休眠的话还是给分个出来
当初实体电脑上用lvm + reiserfs 还非得分一个/boot做引导用,有了 btrfs 后现在连 /boot 单独分区都省了

简单记录一下,有真正使用btrfs的朋友介绍下经验,若有错误请高手指正。
发表于 2011-8-22 18:14:25 | 显示全部楼层
GPT+BtrFS我一直是用syslinux引导的,不过syslinux不能从压缩的BtrFS分区启动,所以我还是将/boot单独分了出来(我的/启用了压缩)。不知道GRUB2对压缩的BtrFS支持如何?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-8-22 19:29:38 | 显示全部楼层
楼上这位兄台是用在实在机上的吗?
官方文档就是用的syslinux,不过用习惯了grub2觉得功能挺强大的
压缩功能刚才加上,加到fstab
  1. /dev/disk/by-label/btrfs-root  /                    btrfs  defaults,noatime,compress  0  0
复制代码
默认用的是zlib来压缩,这样的话因为添加的地方是 subvol=__active 这里,应该对 boot没啥影响
因为后加上的,所以不能真正测试到一开始就启用压缩是什么效果,加上subvolid=0 没启用压缩功能,也没办法证实你说的情况
不过以我的理解,连 subvolid=0也压缩的话,没啥必须,建我个subvolume针对需要压缩的再设置压缩就行了,不需要连累整个分区

以下是mount的结果
  1. /dev/disk/by-label/btrfs-root[/__active] on / type btrfs (rw,noatime,compress=zlib) 默认开启zlib
  2. /dev/sda2 on /var/lib/btrfs-root type btrfs (rw,noatime,subvolid=0)  这个没压缩
  3. /var/lib/btrfs-root/boot on /boot type none (rw,bind)  
复制代码

后来看到现在新版的btrfs支持lzo压缩,然后就改了一下
  1. /dev/disk/by-label/btrfs-root  /                    btrfs  defaults,noatime,compress=lzo  0  0
复制代码

mount的结果
  1. /dev/disk/by-label/btrfs-root[/__active] on / type btrfs (rw,noatime,compress=lzo)
复制代码

试着加了 -o acl 结果提示出错,原来默认是开了acl支持,看了文档使用-o noacl关闭acl功能
noacl - Do not enable ACL's.

https://btrfs.wiki.kernel.org/index.php/Getting_started btrfs官方wiki入门文档
回复 支持 反对

使用道具 举报

发表于 2011-8-22 21:53:26 | 显示全部楼层
lz 竟然说自己是菜鸟……我想一头撞死了……
我 vbox 里装的 arch 就是用的 btrfs + GPT + grub2……用的 archboot 安装……没遇到啥问题……
回复 支持 反对

使用道具 举报

发表于 2011-8-22 23:23:11 | 显示全部楼层
我早上玩火,新装了arch,用的就是btrfs文件系统,结果很糟糕,在开机启动时,我手贱地按了电源按钮,然后再开机时,使用btrfs格式的/root和/home分区挂掉了,引导时无法自动挂载了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-8-23 09:36:31 | 显示全部楼层
Post by jtshs256;2148001
lz 竟然说自己是菜鸟……我想一头撞死了……
我 vbox 里装的 arch 就是用的 btrfs + GPT + grub2……用的 archboot 安装……没遇到啥问题……

好吧,把菜鸟去掉
你不设置 分区为 : 2 - legacy BIOS bootable   也可以引导吗?
你用的是archboot来安的,莫非是他的脚本里处理了?我再读一下他的脚本看看,因为不会用parted所以手工安装的
我的vmware下反正将分区设置一下才能引导的
折腾BTRFS, GPT的毕竟是少数,大伙有经验的分享一下,为稳定版的到来铺路

-->>>

看了一下archboot的脚本
http://projects.archlinux.org/ar ... oot/installer/setup
第1944行开始
  1. elif ! [[ "$(parted -s ${DISC} print | grep 'bios_grub')" ]]; then
  2.             DIALOG --yesno "Setup detected no bios_grub flag on ${DISC}.\n\nDo you want to create a small 1MB bios_grub partition for grub2 now on ${DISC}?" 0 0 && CREATE_BIOS_GRUB=1
  3.         fi
复制代码
  1.    if [[ "${CREATE_BIOS_GRUB}" = "1" && "${GUID_DETECTED}" = "" ]]; then
  2.         # assume new partitiontable,if no GUID was already there,
  3.         # no user interaction needed for bios_grub partition, jippie
  4.         GUID_PART_SIZE="2"
  5.         parted -a optimal -s ${DISC} mkpart 1 1 ${GUID_PART_SIZE} >${LOG}
  6.         parted -a optimal -s ${DISC} set 1 bios_grub on >${LOG}
  7.     else
复制代码

还有1823行
  1.    # we assume a /dev/hdX format (or /dev/sdX)
  2.     if [[ "${GUIDPARAMETER}" = "yes" ]]; then
  3.         PART_ROOT="${DEVICE}4"
  4.         # GUID(GPT) is only supported by 'parted'
  5.         printk off
  6.         DIALOG --infobox "Partitioning ${DEVICE}" 0 0
  7.         # clean partitiontable to avoid issues!
  8.         dd if=/dev/zero of=${DEVICE} bs=512 count=2048 >/dev/null 2>&1
  9.         parted -a optimal -s ${DEVICE} mklabel GPT >${LOG}
  10.         parted -a optimal -s ${DEVICE} mkpart 1 1 ${GUID_PART_SIZE} >${LOG}
  11.         parted -a optimal -s ${DEVICE} set 1 bios_grub on
  12.         parted -a optimal -s ${DEVICE} name 1 GRUB2
  13.         parted -a optimal -s ${DEVICE} mkpart 2 ${GUID_PART_SIZE} $((${GUID_PART_SIZE}+${BOOT_PART_SIZE})) >${LOG}
  14.         parted -a optimal -s ${DEVICE} mkpart 3 $((${GUID_PART_SIZE}+${BOOT_PART_SIZE})) $((${GUID_PART_SIZE}+${BOOT_PART_SIZE}+${SWAP_PART_SIZE})) >${LOG}
  15.         parted -a optimal -s ${DEVICE} mkpart 4 $((${GUID_PART_SIZE}+${BOOT_PART_SIZE}+${SWAP_PART_SIZE})) $((${GUID_PART_SIZE}+${BOOT_PART_SIZE}+${SWAP_PART_SIZE}+${ROOT_PART_SIZE})) >${LOG}
  16.         parted -a optimal -s ${DEVICE} mkpart 5 $((${GUID_PART_SIZE}+${BOOT_PART_SIZE}+${SWAP_PART_SIZE}+${ROOT_PART_SIZE})) 100% >${LOG}
  17.     else
  18.         PART_ROOT="${DEVICE}3"
  19.         # start at sector 1 for 4k drive compatibility and correct alignment
  20.         printk off
  21.         DIALOG --infobox "Partitioning ${DEVICE}" 0 0
  22.         # clean partitiontable to avoid issues!
  23.         dd if=/dev/zero of=${DEVICE} bs=512 count=2048 >/dev/null 2>&1
  24.         # create DOS MBR with parted
  25.         parted -s ${DEVICE} mklabel msdos >/dev/null 2>&1
  26.         parted -a optimal -s ${DEVICE} mkpart primary 1 $((${GUID_PART_SIZE}+${BOOT_PART_SIZE})) >${LOG}
  27.         parted -a optimal -s ${DEVICE} toggle 1 boot >${LOG}
  28.         parted -a optimal -s ${DEVICE} mkpart primary $((${GUID_PART_SIZE}+${BOOT_PART_SIZE})) $((${GUID_PART_SIZE}+${BOOT_PART_SIZE}+${SWAP_PART_SIZE})) >${LOG}
  29.         parted -a optimal -s ${DEVICE} mkpart primary $((${GUID_PART_SIZE}+${BOOT_PART_SIZE}+${SWAP_PART_SIZE})) $((${GUID_PART_SIZE}+${BOOT_PART_SIZE}+${SWAP_PART_SIZE}+${ROOT_PART_SIZE})) >${LOG}
  30.         parted -a optimal -s ${DEVICE} mkpart primary $((${GUID_PART_SIZE}+${BOOT_PART_SIZE}+${SWAP_PART_SIZE}+${ROOT_PART_SIZE})) 100% >${LOG}
  31.     fi
  32.     if [[ $? -gt 0 ]]; then
  33.         DIALOG --msgbox "Error partitioning ${DEVICE} (see ${LOG} for details)" 0 0
  34.         printk on
  35.         return 1
  36.     fi
复制代码

在旁边的贴子中看到syslinux的wiki链接发现
https://wiki.archlinux.org/index.php/Syslinux
  1. GUID Partition Table aka GPT
  2. Main article GUID_Partition_Table
  3. Bit 2 of the attributes for the /boot partition need to be set.
  4. # sgdisk /dev/sda --attributes=1:set:2
  5. This would toggle the attribute legacy bios bootable on partition 1
  6. Verify:
  7. # sgdisk /dev/sda --attributes=1:show
  8. 1:2:1 (legacy BIOS bootable)
  9. Install the master boot record:
  10. # dd bs=440 conv=notrunc count=1 if=/usr/lib/syslinux/gptmbr.bin of=/dev/sda
复制代码

之前竟然没注意到 gptfdisk包中的sgdisk工具,以后命令行下做自动化处理脚本可以用得上了
PS: 还是感觉 gdisk 比 parted 好用些
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-8-23 09:40:09 | 显示全部楼层
Post by nobbs;2148009
我早上玩火,新装了arch,用的就是btrfs文件系统,结果很糟糕,在开机启动时,我手贱地按了电源按钮,然后再开机时,使用btrfs格式的/root和/home分区挂掉了,引导时无法自动挂载了。

开机启动的时候有个提示,还没按过呢,莫非还会有自动格式化功能呀,不会吧,一切答案尽在脚本中,偶先看看先

查找 btrfs_advanced脚本发现启动时按任意键来触发进行btrfs高级模式
完成一些生成快照还有回滚之类的操作
看来是你自己手工去format的吧
回复 支持 反对

使用道具 举报

发表于 2011-8-23 10:17:02 | 显示全部楼层
Post by axlrose;2147987
楼上这位兄台是用在实在机上的吗?

是的,应该和在虚拟机中没什么区别吧

Post by axlrose;2147987
官方文档就是用的syslinux,不过用习惯了grub2觉得功能挺强大的

估计写官方文档时和我一样,那时GRUB2还不支持btrfs,没得选择。

Post by axlrose;2147987
压缩功能刚才加上,加到fstab

  1. /dev/disk/by-label/btrfs-root  /                    btrfs  defaults,noatime,compress  0  0
复制代码

默认用的是zlib来压缩,这样的话因为添加的地方是 subvol=__active 这里,应该对 boot没啥影响
因为后加上的,所以不能真正测试到一开始就启用压缩是什么效果,加上subvolid=0 没启用压缩功能,也没办法证实你说的情况
不过以我的理解,连 subvolid=0也压缩的话,没啥必须,建我个subvolume针对需要压缩的再设置压缩就行了,不需要连累整个分区

以下是mount的结果

  1. /dev/disk/by-label/btrfs-root[/__active] on / type btrfs (rw,noatime,compress=zlib) 默认开启zlib

  2. /dev/sda2 on /var/lib/btrfs-root type btrfs (rw,noatime,subvolid=0)  这个没压缩

  3. /var/lib/btrfs-root/boot on /boot type none (rw,bind)  

复制代码


后来看到现在新版的btrfs支持lzo压缩,然后就改了一下


  1. /dev/disk/by-label/btrfs-root  /                    btrfs  defaults,noatime,compress=lzo  0  0
复制代码


mount的结果

  1. /dev/disk/by-label/btrfs-root[/__active] on / type btrfs (rw,noatime,compress=lzo)

复制代码


试着加了 -o acl 结果提示出错,原来默认是开了acl支持,看了文档使用-o noacl关闭acl功能
noacl - Do not enable ACL's.

https://btrfs.wiki.kernel.org/index.php/Getting_started btrfs官方wiki入门文档

针对子卷进行压缩是个不错的想法。不过我的整个卷已经压缩了,一时半会不好改过来。不知道有没有什么方法可以让压缩的卷快速变回没有压缩的状态。
另外,我看了一下Wiki,他之所以搞得这么复杂,是因为syslinux不支持从子卷启动(再囧一个)。如果GRUB2支持从子卷启动的话,那么对/boot的特殊处理完全可以省去,这样就简单多了。
回复 支持 反对

使用道具 举报

发表于 2011-8-23 10:25:11 | 显示全部楼层
Post by axlrose;2148034

你不设置 分区为 : 2 - legacy BIOS bootable   也可以引导吗?

BIOS机器启动GPT磁盘共有3种方法,syslinux的文档里写的有
http://git.kernel.org/?p=boot/sy ... doc/gpt.txt;hb=HEAD

这种方法我觉得是3种方法里最“正统”的。
archboot是会自动设置此标志位的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-8-23 10:51:15 | 显示全部楼层
Post by bhoppi;2148041
是的,应该和在虚拟机中没什么区别吧


估计写官方文档时和我一样,那时GRUB2还不支持btrfs,没得选择。


针对子卷进行压缩是个不错的想法。不过我的整个卷已经压缩了,一时半会不好改过来。不知道有没有什么方法可以让压缩的卷快速变回没有压缩的状态。
另外,我看了一下Wiki,他之所以搞得这么复杂,是因为syslinux不支持从子卷启动(再囧一个)。如果GRUB2支持从子卷启动的话,那么对/boot的特殊处理完全可以省去,这样就简单多了。


看来你好像用btrfs有段时间了喔
暂时没找到 grub2支持从subvolume的/boot引导的文章,估计不行吧,如果有多个subvolume都有boot的东西不知道在哪开始引导了,至少会看到grub2有关键字设置subvolume的才行
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表