grub2 + 虚拟磁盘 或 grub2 + ntboot 启动 bios + gpt 上的 Windows 2022

感谢:wzy,wintoflash,minlearn

需求:主机商提供的产品存储超过2TB容量,且仅支持bios方式启动机子。Linux系统能在 bios + gpt 的环境中正常安装和运行,但 Windows 系统要求 bios + mbr 或 uefi + gpt 的组合,不支持 bios + gpt 的场景。

方案A:从网友 wzy 的博客来看,Windows的启动管理bootmgr.exe不认gpt分区,所以启动不了。解决方法是创建一个包含启动代码和文件的虚拟磁盘文件来启动Windows。缺点:无法Windows更新

方案B:从网友 minlearn 在无忧论坛里和 ntboot 作者 wintoflash 交流帖可知,通过 ntboot 是可以启动 bios + gpt 磁盘上已经安装的Windows系统(不支持Windows安装,会报“Windows安装程序 - 无法将 Window 配置为在此计算机的硬件上运行”的错误)。缺点:无法Windows更新

方案C:用grub4dos的ntloader来启动Windows。测试失败,用grub4dos的ntloader可以让gpt上的windows进入到桌面,但如计算机名、配置网卡静态IP地址等更改操作在重启系统后不生效。

这里记录一下实践的过程:

方案A:

  1. 创建一个vhd固定大小的虚拟磁盘,如 18 GB,名称为win2022.vhd
  2. 该vhd虚拟磁盘至少有三个分区,第一个是BIOS Partition,这个特别的分区是grub2必需的,可通过Linux系统里的cfdisk程序来创建。如下边的分区例子:

    Device                                Start                   End               Sectors               Size Type
    >>  /dev/sdb1                              2048                 32767                 30720                15M BIOS boot
    /dev/sdb2                             32768                647167                614400               300M EFI System
    /dev/sdb3                            647168                679935                 32768                16M Microsoft reserved
    /dev/sdb4                            679936              37746687              37066752              17.7G Microsoft basic data
  3. 创建第二个vhd固定大小的虚拟磁盘,本例的容量为64MB,名称为bootmgr.vhd。磁盘用MBR分区,创建一个主分区,且设置为活动分区
  4. 在Windows系统里附加两个vhd虚拟磁盘,假如本例中,第一个大的虚拟磁盘的NTFS分区盘符是M:,ESP分区盘符是L:;第二个虚拟磁盘的分区的分区盘符是B:
  5. 将已经安装好的Windows映像释放到NTFS分区中,如本例中的第4个分区M:,执行 bcdboot.exe M:\Windows /s L: /v /f uefi 将创建uefi相关的启动文件到 L: 分区 ;执行 bcdboot.exe M:\Windows /s B: /v /f bios 将创建bois相关的启动文件到 B: 分区;执行 bootsect /nt60 B: /mbr 将在B:上创建启动代码
  6. 分离第二个虚拟磁盘
  7. 将bootmgr.vhd的虚拟磁盘文件放到第一个vhd虚拟磁盘中的esp分区中L:
  8. 分离第一个虚拟磁盘
  9. 将win2022.vhd磁盘挂到一个debian系统的虚拟机里,挂载后,esp分区/dev/sdb2路径为/mnt/1,用grub-install将grub2安装到vhd磁盘。如例:grub-install --target=i386-pc /dev/sdb --boot-directory=/mnt/1;复制/usr/lib/syslinux/memdisk 文件 到esp分区/mnt/1
  10. 复制或创建一个grub的配置文件,放在grub目录里,配置文件需有bootmgr.vhd的启动项内容,如本例的部分内容:

     menuentry "bootmgr.vhd" {
    insmod part_msdos
    insmod part_gpt
    insmod fat
    insmod ntfs
    linux16 /memdisk raw
    initrd16 /bootmgr.vhd
    }

    11.正常的情况下,该包含有grub2,bootmgr.vhd和Windows的gpt vhd虚拟磁盘,能在VirtualBox的bios或efi虚拟机里启动

方案B:

  1. 下载ntboot的源码,通过grub-mkimage创建好grub2的core.img,再用grub-install安装到vhd磁盘。如例:grub-install --target=i386-pc /dev/sdb --boot-directory=/mnt/1 --directory=/home/liujia/grub/i386-pc/ 这例里,是将vhd磁盘挂到debian系统里安装grub2,/mnt/1路径是vhd的第2个分区,即esp分区 /home/liujia/grub/i386-pc/ 是ntboot源码的目录路径
  2. 将windows的安装光盘iso里的sources/boot.wim/1/Windows/Boot/PXE/bootmgr.exe文件提取出来,放到ESP分区中
  3. 复制或创建一个grub的配置文件,放在grub目录里,配置文件需有ntboot的启动项内容,如本例的部分内容:

    menuentry 'nbtoot' {
    insmod part_msdos
    insmod part_gpt
    insmod fat
    insmod ntfs
    set root='hd0,gpt2'
    ntboot --efi=/bootmgr.exe --win (hd0,gpt4);
    }
  4. 将已经安装好的Windows映像释放到NTFS分区中,如本例中的第4个分区,且Windows是从uefi环境中引导的(ESP中有Windows的相应目录和文件,如上边的步骤,执行 bcdboot.exe M:\Windows /s L: /v /f uefi
  5. 正常的情况下,该包含有grub2,ntboot和Windows的gpt vhd虚拟磁盘,能在VirtualBox的bios或efi虚拟机里启动

问题:因为Windows是已经安装的,所以如将这个win2022.vhd复制使用,Windows的SID、计算机名称等是一样的。微软建议用sysprep来生成新的SID,避免机子加域时遇到问题。

bios-gpt-2.png

参考:

看小说——红楼梦

和平社区的张老师发了张帖,提到《红楼梦》里本书。我很早就知得,《红楼梦》系名著,但以为系本爱情小说,所以我一直不曾翻看。里次,我从“维基文库”网站里下载电子版本,再放到电子阅读器里睇。我大概每工睇半零回,睇了差不多四只月,好睇,好好睇。真系:过年前开始睇,睇到过年,睇到出十五。

第一好,系人物写得有特点,好真。生活中,我一般不睇面来认人。我睇小说也系,我记不住书中众多人物的名字,经常系爱倒转前面一、两行去看话是谁说的,动作是谁做的。跟随着书中的情节发展,我不仅认得到林黛玉、薛宝钗了,连迎春、探春、惜春也知得了,甚至是走过场般的司棋丫头也有印象。我是从侧面来认人物的。如黛玉、宝钗俩人,在打杂说的闲话中,廖廖几只字就描绘得生动、深刻:怕说话的气吹倒了林黛玉,热气雪化了薛宝钗。当我看到这,感叹写这书的人,真真来得到。还有,在林黛玉拿话调侃惜春作画时间那,忍不住笑道:“又要照着这样儿慢慢的画,可不得二年的功夫!”我也是跟着她般,笑出了声。当看到宝玉听紫鹃说林黛玉要回江南,吵闹着要取下摆在架子上的汽船,给藏到被子里,要阻止林家的人来接走林黛玉这一节时,我更是笑得在床碌来碌驷。

第二好,系书中的文学、风俗知识多。他们开诗社,作诗接龙等,我只是看热闹,不懂得诗句意思和押韵等,更体会不到字句之妙了。倒是林黛玉教香菱读诗、作诗时,说到要起、承、转几个字,我记住了。还有,薛宝钗要为惜春准备画画用品时,罗列了一长江,诸如大小不一的笔头、颜料、调色盘和纸张时,我看得张大了口,想怎么她画张画,要这么讲究的。当他们争先恐后比赛放风筝时,我才知道,原来放风筝是要在线放尽、放完时,将线剪断,放走风筝,让它随风飞走的,寓意是将晦气放走,迎来好运,这真的是放风筝。当贾老太太摆桌吃饭,听戏行令时,我不太明白怎么玩,幸好凤姐儿说的笑话我看得明白,我也乐呵呵的。

我发现,书中有一些词语,和客家日常话是相同的。如:二人便上马仍回旧路。茗烟在后面只嘱咐。“二爷好生骑着。这马总没大骑的,手里提紧着”。这里的“好生”词。再如:小燕放在案上,走去拿了小菜并碗箸过来,拨了一碗饭。这里的“碗箸”词。现在我在家,经常能听到家里人说,“捡碗箸,准备食饭”;“好生扛菜,汤每打洒”。如此,我在书中有了“新发现”,想跟人说说。

一天,我跟吖后在河边,边走边聊。我问,
“尔睇过《水许传》、《红楼梦》咪?”
吖后听了,停步侧头,想了想,反问道,
“吖咪《水壶(浒)传》?”
我懵了下,赶紧点了又点头,“系。系《水浒传》。”
“睇过。尔想问惹?”
“我想问,之前嘅书都系用繁体字。在历史上,繁体字沿用了嘅久,做惹里下一下子就变成了简体字?”
吖后想了好一会,“我亦不知啊。我就知得粤语的发音与以前汉字注音、读音相近。手机短视频中,有人用粤语朗读古诗,好靓听。”

我回想小时候,认字是从“围哒”(竹编的,有两床这么大的,主要用来晒稻谷)、打禾机和碗底上的字开始的,因为以前农村各户集中在大屋居住,各家农具、生活用品怕打混,所以会在器具角落或中心位置写上各家的名字。如,排名老二家的围哒,左上角可能就会简写一个“贰”字。还有,大屋大门上的匾额,也是用繁体字写的,如“校書第”。我小时候是认得“書”字,但不晓得写。小学里的老师是不会教繁体字的。我第一次认真、多次练繁体字,系“劉”字。那时,流行歌星是香港的“四大天王”。因其中之一“刘德华”是共姓,我尤其追捧,不仅买他的贴画、买他的《天意》录音机磁带,还模仿他的签名——“劉德華”。“劉”字比“刘”的笔画多得多,可我练得有劲头。之后,“劉”繁体字是晓写了,但从不敢在作业本或考卷上写名时写“劉”字,仍是写“刘”。

当我看到《红楼梦》里“劉姥姥”几次出场,是挺高兴的。但当听到林黛玉取笑她是“蝗虫”时,我理应当怨黛玉刻薄,但事实上,我又是忍不住跟着笑了。

参考:https://zh.wikisource.org/wiki/%E7%B4%85%E6%A8%93%E5%A4%A2

在 iredmail 里批量添加邮箱用户

环境:debian11,iredmail-1.5.1。例子,创建user5@anqun.orguser6@anqun.org两个邮箱用户。

步骤:

  1. cd iRedMail-1.5.1/tools # 转到 iRedmail 安装目录中的tools子目录
  2. bash create_mail_user_SQL.sh user5@anqun.org 'mima881' >> user.sql
    bash create_mail_user_SQL.sh user6@anqun.org 'mima882' >> user.sql # 生成一个包含sql语句的文件。sql语句是创建user5和user6两个用户,且设置密码
  3. mysql -u root vmail < user.sql # 将此文件导入到vmail数据库中

参考:https://docs.iredmail.org/sql.create.mail.user.html

在 iredmail 里设置一个可以代收不存在用户邮件的邮箱 - catch-all

环境:debian11,iredmail-1.5.1。例子,将@anqun.org域中,不存在的用户邮件发到存在的admin@anqun.org 收件箱。

步骤:

  1. echo 'INSERT INTO forwardings (address, forwarding, domain, dest_domain) VALUES ('anqun.org', 'admin@anqun.org', 'anqun.org', 'anqun.org');' > catch.sql # 生成一个包含sql语句的文件
  2. mysql -u root vmail < catch.sql # 将此文件导入到vmail数据库中

参考:https://docs.iredmail.org/sql.create.catch-all.html

在 debian 11 里安装 iredmail 1.5.1

概要:需要在debian 11系统里安装 iredmail 1.5.1。本例是需要设置 anqun.org 的收件域。

先要解析好域名,如设置 a 记录 mail.anqun.org 到debian 11系统的公网IP,如 47.97.19.216;设置 mx 记录到 mail.anqun.org。

步骤:

  1. echo mail > /etc/hostname # 设置主机名为 mail
  2. echo 127.0.0.1 mail.anqun.org mail localhost localhost.localdomain > /etc/hosts # 设置完整的主机名为 mail.anqun.org
  3. wget https://github.com/iredmail/iRedMail/archive/refs/tags/1.5.1.tar.gz # 下载 iredmail 1.5.1 安装包
  4. tar xzvf 1.5.1.tar.gz # 解压缩安装包
  5. cd iRedMail-1.5.1 # 转到安装包目录
  6. bash iRedMail.sh # 开始安装
  7. iRedMail 安装欢迎界面
  8. 设置邮件存储目录,可保持默认,/var/vmail
  9. 选择web服务,可保持默认,nginx
  10. 选择存储邮件用户名的数据库类别,可选择 MariaDB
  11. 填写第一个电子邮局的域名,要与主机名区别开来,如本例的 mail.anqun.org
  12. 设置邮局管理员的密码,本例默认管理员用户名是:postmaster@mail.anqun.org
  13. 选择要安装的其它组件,可保持默认,安装 iRedAdmin(类似postfixadmin,可通过web浏览器管理邮局域),Roundcubemail(邮箱用户可通过浏览器收发邮件), Fail2ban
  14. 再次确认要安装的组件或功能。请选择y
  15. 询问是否启用防火墙。请选择n
  16. 完成iRedMail安装,会有相应的登录信息提示。之后,重启系统

参考:https://docs.iredmail.org/install.iredmail.on.debian.ubuntu.html