红联Linux门户
Linux帮助

迁移至GPT硬盘

发布时间:2012-01-17 09:39:43来源:红联作者:pl_014
[i=s] 本帖最后由 pl_014 于 2012-1-19 08:26 编辑 [/i]

出于对新鲜技术的好奇,再加上对mbr硬盘4个主分区这一局限的不满,本人近日将一块160G的硬盘转为了GPT硬盘,并将已安装的debian迁移过去,并从GPT硬盘启动,系统的运行基本正常,多数软件均可以正常运行,现将其过程与经验分享给大家,希望对大家能有所帮助
环境:
操作系统:debian squeeze单系统
内核:2.6.32-5-amd64
bootloader:grub2
主板:磐正P35+(bios主板)
CPU:Intel Core2 Duo
硬盘:西部数据、希捷

我的debian原来是安装在希捷的那块硬盘上,本人将西部数据的那块硬盘转为GPT,并将debian完全迁移到西部数据的那块硬盘上,具体步骤如下:
第一步:准备工作
1.备份mbr
在你进行下一步之前,建议你先备份mbr,给自己留一个后路,要备份mbr,可执行命令[code]dd if=/dev/sda of=/boot/boot.NNNN bs=512 count=1 [/code]如果仅备份引导部分,可只备份前446字节[code]dd if=/dev/sda of=/boot/boot.NNNN bs=446 count=1 [/code]恢复的话执行[code]dd if=/boot/boot.NNNN of=/dev/sda bs=512 count=1 [/code]或[code]dd if=/boot/boot.NNNN of=/dev/sda bs=446 count=1 [/code]2.确认内核已启用对GPT的支持
对于新内核,可能已经默认开启了对GPT的支持,那样你就不必操心了,但对于较老的内核,可能并没有开启这种支持,你需要确认一下你的内核是否已经开启了这种支持,如果没有开启,需要重新编译内核,否则你可能将为无法启动而困扰。我的内核是2.6.32-5-amd64已有对GPT的支持,不需要重新编译。
3.grub
传统的grub本身并不支持GPT,但有对GPT支持的补丁,如果你仍在使用传统的grub,可尝试安装这个补丁。对于grub2,包含对GPT的支持,无需安装补丁。
4.分区工具
老的分区工具不支持GPT,你需要使用支持GPT的分区工具进行分区操作,gnu parted(使用parted命令运行)及其前端gparted等都支持GPT,同时还要注意你所用的分区工具是否可以无损地由mbr转换到gpt
5.备份文件
如果你不能确认你所用的分区工具是否可以无损地由mbr转换到gpt,那么我建议你最好先将重要的文件备份一下。

第二步:转换硬盘
本人是先将硬盘清空(即先删掉所有的分区,以免建立一个MBR/GPT混合的硬盘),将其再转为GPT硬盘,不过我没有尝试无损转换。
引用:
注意:当你将硬盘分区表转换为GPT后,不要重新启动计算机,除非你有较新版本linux的livecd,否则你将为无法启动而困扰。


在gparted下,点击一块未分配的空间(注:此时,本人的整块硬盘都是未分配的空间),再点设备->新建分区表,在弹出的对话框中点那个“高级”,在复选框里选“gpt”(如下图)
[attach]36867[/attach]

对于bios主板,需要建立一个保护分区,保护分区需要建在硬盘前2TB的位置,一般为磁盘的开头,大小在1~2M之间即可,文件系统选“未格式化”,也就是说只建立一个空分区,不进行格式化
应用更改,成功后右键点击新建的那个分区,选择“管理标志”,在弹出的对话框中勾选“bios_gpt”,将此分区设置“bios_gpt”标记(如下图)
[attach]36868[/attach]
注意:分区建立好之后不要将其格式化,更不要建立为某种文件系统。

第三步:安装grub
使用dd命令将/boot/grub/core.img写入到刚才建立的保护分区中,具体如下:
1.先执行ls -l /boot/grub/core.img命令,查该文件的大小(精确到字节)
2.执行dd if=/boot/grub/core.img of=/dev/sda1 bs=25436 count=1 (用你的/boot/grub/core.img文件的大小替换25436)命令,将该文件写入到保护分区中。

创建一个boot分区,将/boot下的文件复制到此分区中,建议将此分区设置“boot”标记,也可以直接进行分区复制。

引用:
注意:如果用cp命令复制文件时,建议使用-a参数,而不要仅用-R参数,否则许多文件的权限等重要信息会丢失掉,影响系统的启动与运行。下同


执行命令[code]mount /dev/sda2 /boot[/code]将新建的引导分区挂载至/boot

执行命令[code]grub-install --root-directory=/boot/grub /dev/sda[/code]将grub2安装至GPT硬盘上
注:可能有的人会认为应该是--root-directory=/boot,但网上有的资料说应该设置为/boot/grub目录,反正我就是这样做的。

第四步:复制文件
由于我是先将磁盘清空,所以我需要复制文件,这一步根据你自己的情况而定,也可以直接复制整个分区,用cp命令复制文件时注意不要仅用-R参数。

第四步:修改/boot/grub/grub.cfg
debian下grub的启动菜单的配置文件为/boot/grub/grub.cfg,如果你的发行版不是,请按照你的发行版来。
grub2以(hd0,msdos1)这种形式来表示分区,其实这里的msdos对应的就是mbr分区表,当你改为GPT硬盘后,需要将msdos对应改为gpt,同时还要在前面加上insmod part_gpt,另外,由于分区表和分区结构的改变,你需要将一些形如“dcd5fddcd5fd7b-a784-4155-8e97-78fd568a5ad37b-a784-4155-8e97-78fd568a5ad3”的部分换为对应的分区设备,如/dev/sda2,有些需要在整条语句前加#注释掉
列出一部分供参考
参考分区结构为:
/dev/sda1:2M保护分区
/dev/sda2:引导分区
/dev/sda3:grub
/dev/sda4:/home[code]### BEGIN /etc/grub.d/00_header ###
if [ -s $prefix/grubenv ]; then
load_env
fi
set default="0"
if [ "${prev_saved_entry}" ]; then
set saved_entry="${prev_saved_entry}"
save_env saved_entry
set prev_saved_entry=
save_env prev_saved_entry
set boot_once=true
fi

function savedefault {
if [ -z "${boot_once}" ]; then
saved_entry="${chosen}"
save_env saved_entry
fi
}

function load_video {
insmod vbe
insmod vga
insmod video_bochs
insmod video_cirrus
}

insmod part_gpt
insmod ext2
set root='(hd0,gpt3)'
#search --no-floppy --fs-uuid --set dcd5fd7b-a784-4155-8e97-78fd568a5ad3
if loadfont /usr/share/grub/unicode.pf2 ; then
set gfxmode=640x480
load_video
insmod gfxterm
fi
terminal_output gfxterm
insmod part_gpt
insmod ext2
set root='(hd0,gpt2)'
#search --no-floppy --fs-uuid --set 056d51f0-c22b-4d88-982a-d57dc927926e
set locale_dir=($root)/grub/locale
set lang=zh
insmod gettext
set timeout=5
### END /etc/grub.d/00_header ###

### BEGIN /etc/grub.d/05_debian_theme ###
insmod part_gpt
insmod ext2
set root='(hd0,gpt3)'
#search --no-floppy --fs-uuid --set dcd5fd7b-a784-4155-8e97-78fd568a5ad3
insmod png
if background_image /usr/share/pixmaps/splash/debian-edu-splash-grub.png; then
set color_normal=white/black
set color_highlight=magenta/black
else
set menu_color_normal=cyan/blue
set menu_color_highlight=white/blue
fi
### END /etc/grub.d/05_debian_theme ###

### BEGIN /etc/grub.d/50_linux ###
menuentry 'Debian GNU/Linux, with Linux 2.6.32-5-amd64' --class debian --class gnu-linux --class gnu --class os {
insmod part_gpt
insmod ext2
set root='(hd0,gpt2)'
#search --no-floppy --fs-uuid --set=root 056d51f0-c22b-4d88-982a-d57dc927926e
echo 'Loading Linux 2.6.32-5-amd64 ...'
linux /vmlinuz-2.6.32-5-amd64 root=/dev/sda2 ro quiet
echo 'Loading initial ramdisk ...'
initrd /initrd.img-2.6.32-5-amd64
}
[/code]这样改完以后可能会使grub2的界面变得比较丑陋,不过没关系,将系统成功引导后再刷新一下grub即可,但不要急于现在就做。

第五步:修改/etc/fstab
由于分区表类型的修改,各挂载点所对应的分区也必然会有所变化,在重启之前请一定要记住修改/etc/fstab,其它的就不多说了,直接把参考文件放上去[code]#
proc /proc proc defaults 0 0
# / was on /dev/sdb6 during installation
/dev/sda3 / ext4 errors=remount-ro 0 1
# /boot was on /dev/sdb2 during installation
/dev/sda2 /boot ext2 defaults 0 2
# /home was on /dev/sdb9 during installation
/dev/sda4 /home ext4 defaults 0 2
# swap was on /dev/sdb7 during installation
#UUID=0a9a16c7-a03c-4c72-83c4-6ab0d934d0f6 none swap sw 0 0
/dev/scd0 /media/cdrom0 udf,iso9660 user,noauto 0 0[/code]第六步:重启
现在你已经可以重新引导你的系统了,来看看效果吧,如果出现问题,就找一个livecd来修复。

其它注意事项:
1.windows对GPT的支很糟糕,如果你想要在GPT硬盘下引导windows,需要先将主板换为罕见的EFI主板,还要将系统换为64位windows,至于windows对GPT的支持,请参考网上的资料,在下面wikipedia的资料上就有。
2.ntfs文件系统和ext3/ext4文件系统的GUID是完全一样的(不知道为什么),所以有些分区工具无法将这两种文件系统区分开来,尤其是在windows下。对于windows分区和ext4分区共存的硬盘下,一定要注意这一点。

参考资料:
GPT初步应用心得:http://blog.163.com/prevBlogPerma.do?host=wood_elf@126&srl=6515979120114783815940&mode=prev
通过 GPT 和 Linux 充分利用大型驱动器:http://www.ibm.com/developerworks/cn/linux/l-gpt/
GRUB2(arch wiki):https://wiki.archlinux.org/index.php/GRUB2_%28%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%29
GUID Partition Table(arch wiki):https://wiki.archlinux.org/index.php/GUID_Partition_Table
全局唯一标识分区表(wikipedia):http://zh.wikipedia.org/wiki/GUID%E7%A3%81%E7%A2%9F%E5%88%86%E5%89%B2%E8%A1%A8
文章评论

共有 31 条评论

  1. xingfu_168 于 2013-09-29 21:11:29发表:

  2. 依米超 于 2013-01-27 19:02:16发表:

    人才啊 人才啊

  3. daizhiqiang 于 2013-01-09 11:21:10发表:

    楼主辛苦了!!

  4. maomaomiao 于 2013-01-08 15:05:07发表:

    非常不错的资料,感谢楼主

  5. liuyun007 于 2013-01-08 14:27:27发表:

    学习中

  6. 石头玩家 于 2012-12-31 10:44:42发表:

    没有试过。

  7. youxinzhai 于 2012-12-13 11:21:03发表:

    good

  8. gky2009514 于 2012-12-07 12:51:21发表:

    新手完成任务,求下书籍~

  9. 寂寞弯刀 于 2012-10-05 00:27:10发表:

    学习了!

  10. liuyanqiu0807 于 2012-06-14 15:05:09发表:

    高手,写得很好、很细致

  11. fate3008 于 2012-03-30 10:34:00发表:

    :0)1

  12. fyjc87 于 2012-03-11 12:14:00发表:

    新手参考,不敢如此大胆冒进

  13. gogo11 于 2012-03-03 10:40:25发表:

    引用:
    写得很好、很细致。 但是我想问一下,因为原来的mbr分区可以进行mbr和分区表的备份还原操作,所以使用起来只要有备份就不怕;但GPT分区虽然支持更大容量的硬盘,只是还没有如同备份还原mbr分区表这样的类似资料可查( ...
    okzokz123 发表于 2012-1-18 19:05

    也可以用dd命令备份,不过bs=??改一下就行了

  14. sky11726 于 2012-03-02 20:52:27发表:

    新来

  15. topcloud 于 2012-03-02 19:13:34发表:

    顶阿顶。

  16. topcloud 于 2012-03-02 18:40:56发表:

    学习了 (6)m:b

  17. linuxian 于 2012-03-01 20:06:22发表:

  18. frankhht 于 2012-01-28 18:01:41发表:

    这种实战的经验最难得了

  19. pl_014 于 2012-01-19 13:32:44发表:

    [i=s] 本帖最后由 pl_014 于 2012-1-19 13:45 编辑 [/i]

    引用:
    10# pl_014
    目前所知 GPT硬盘第一扇区似乎是GTP头即EFI信息区,2到33扇区是分区表;中间是数据分区;后面是对称于前面的两个备份分区。
    如果发生不能正确识别和引导分区的时候可以从后面的备份分区恢复到前面1到 ...
    okzokz123 发表于 2012-1-19 11:49

    我没研究过GPT硬盘的备份问题,至于具体操作,前面的东西用dd命令肯定可以,而最后的东西,可以用dd命令的skip=blocks和seek=blocks参数,也可以自己写个C程序试试。

  20. okzokz123 于 2012-01-19 11:49:21发表:

    10# pl_014
    目前所知 GPT硬盘第一扇区似乎是GTP头即EFI信息区,2到33扇区是分区表;中间是数据分区;后面是对称于前面的两个备份分区。
    如果发生不能正确识别和引导分区的时候可以从后面的备份分区恢复到前面1到33扇区的分区表,但是每个硬盘容量都不同有个体差异,查找尾部的备份分区是个问题;换种思路就是直接先备份前面1到33扇区,以后直接还原,不知道这样是否正确,还有就是如何操作的问题了。

  21. pl_014 于 2012-01-19 07:57:19发表:

    [i=s] 本帖最后由 pl_014 于 2012-1-19 08:13 编辑 [/i]

    引用:
    GUID是不可能有重?的,LZ可以用blkid指令查看分割?各文件系?的GUID(也??UUID)。
    grand 发表于 2012-1-18 23:19

    GUID和UUID是不太一样的,UUID是一种标准的算法,GUID是微软对这种标准的一种实现,这种概念不能搞混,GPT硬盘的分区采用了GUID作为文件系统的标识符,不代表每个分区的UUID也用这种同样的标识符,否则的话,磁盘分区软件还怎么区分每个分区的文件系统类型?windows的基本数据分区的GUID和linux的数据分区的GUID在wikipedia上有说明,至于为什么重复,不得而知,只能去问问微软了。

  22. pl_014 于 2012-01-19 07:03:42发表:

    引用:
    64位元的WIndows 7,包括64位元的Windows 2008 Server以及Windows 2008 Server R2,都支援GPT分割?,但是需要你的主板支援UEFI才可以?GPT分割?引?。
    grand 发表于 2012-1-18 23:11

    哦,确实是这样

  23. pl_014 于 2012-01-19 07:02:37发表:

    引用:
    写得很好、很细致。 但是我想问一下,因为原来的mbr分区可以进行mbr和分区表的备份还原操作,所以使用起来只要有备份就不怕;但GPT分区虽然支持更大容量的硬盘,只是还没有如同备份还原mbr分区表这样的类似资料可查( ...
    okzokz123 发表于 2012-1-18 19:05

    这个问题可以多研究研究关于GPT原理及组织结构的问题,首先一点就是分区表是不可能没有的,只不过GPT不是把分区表存在mbr上,而是LBA上,这一点在wikipedia上有较详细的介绍,否则就很容易也出现像你所说的某个分区不见了、错乱等情况,而且这也将会导致启动速度、分区软件运行速度变慢等,同时,这样从原理上讲也就可以没有分区数的限制了,但事实上GPT还是有128个分区的限制。不仅每块GPT硬盘都有自己的分区表,而且还是一式两份----磁盘开始有一份,磁盘的最后还有一份。
    至于备份,也不困难,只要搞清楚LBA的总大小即可,不过需要注意的一点是磁盘开头有个LBA0,这个LBA0是处于兼容性考虑仍然存储了一份传统的MBR,在磁盘最后是没有的。磁盘的开头部分的LBA和最后的LBA的组织形式不大相同,需要分别备份。

  24. grand 于 2012-01-18 23:19:17发表:

    GUID是不可能有重?的,LZ可以用blkid指令查看分割?各文件系?的GUID(也??UUID)。

  25. grand 于 2012-01-18 23:11:53发表:

    64位元的WIndows 7,包括64位元的Windows 2008 Server以及Windows 2008 Server R2,都支援GPT分割?,但是需要你的主板支援UEFI才可以?GPT分割?引?。

  26. okzokz123 于 2012-01-18 19:05:26发表:

    写得很好、很细致。 但是我想问一下,因为原来的mbr分区可以进行mbr和分区表的备份还原操作,所以使用起来只要有备份就不怕;但GPT分区虽然支持更大容量的硬盘,只是还没有如同备份还原mbr分区表这样的类似资料可查(GPT没有mbr,这还是个新事物,但想有个备份应该是好的),目前我还没找到。万一某天分区不见了或出现错乱怎么办呢,望指教。

  27. Growth兆 于 2012-01-18 10:04:40发表:

    感谢pl_014的分享,本贴加入到论坛顶置的Linux应用贴中

  28. pl_014 于 2012-01-17 20:56:05发表:

    引用:
    pl_014你已经转了啊,我也看了下,不过目前还不准备转,我是双系统要用windows,用一块新硬盘到是可以用gpt试试
    mengfei52306 发表于 2012-1-17 19:09

    恩,原来的XP已经慢到家了,而且也基本上用不到了,干脆也就不要了,所以我只试了linux,至于windows怎样,就难说了,也许grub能在bios主板下引导windows,即使如此还要注意对GPT的支持怎样,我在最后列出的维基百科的可以查到。

  29. mengfei52306 于 2012-01-17 19:09:21发表:

    pl_014你已经转了啊,我也看了下,不过目前还不准备转,我是双系统要用windows,用一块新硬盘到是可以用gpt试试

  30. pl_014 于 2012-01-17 11:08:33发表:

    引用:
    牛,关看我都没信心去做了,呵呵~~
    onquer 发表于 2012-1-17 10:24

    呃,不会吧

  31. onquer 于 2012-01-17 10:24:50发表:

    牛,关看我都没信心去做了,呵呵~~