背景
所用笔记本为HP ProBook 440 G2。先前一直是win 10 + Arch + MBR/BIOS双系统,但是突然想给Arch装上LVM,这样以后能动态调整分区大小。所以就决定重装一次Arch:先用引导修复工具将MBR重写,接着进win 10删除Linux分区,然后下载最新Arch镜像,刻录,重装。
一直到安装GRUB之前都没有任何问题,但是就在GRUB安装时出错了,报错意思是我的core.img文件太大,放不下。这时看了看磁盘分区表,发现sda1是从63开始的,不是从2048开始的。
百度后知道了,引导修复工具重写MBR时,会写成从63开始,这样的话sda1前面的空间也就32k、33k,而一个core.img就要比33k大。随后又换了几种引导修复工具,也没有能改成从2048开始的。要么移动所有分区,要么重装系统。最后决定备份文件、清空整个磁盘,重装windows。因为以前一直是用着MBR+BIOS,借着这次重装的机会,想换成GPT+UEFI玩玩。然后进BIOS改了启动方式、顺利安装好了windows 10。接下来就开始Arch的安装。
Arch Linux安装 (GPT+UEFI+LVM)
全程参照Arch Wiki Installation Guide
制作U盘镜像
先在官网或者国内镜像站下载好镜像文件。
然后,如在Windows下,可用软件rufus制作镜像盘。因为这次主板改成了UEFI启动,所以也将U盘改成了uefi启动。
制作完成后,就可以重启电脑、从U盘启动、进入安装环境了。
联网
成功进入安装环境后,先检查网络状态:
- ping -c 5 www.baidu.com
- ip addr
- ip link
上面三个,任选一条命令执行,都可以知道当前网络状况。如果是插着网线,系统应该会自动连上网络;如果没有有线网络,可以执行wifi-menu
连接无线网络。
更新时间
# timedatectl set-ntp true
这个无所谓,执行不执行都行。等安装好系统后,可以慢慢查看Wiki里有关时间、UTC、RTC的网页,根据自己需要设置合适的时间。
分区
wiki在这步提示说,如果需要LVM、RAID、加密之类的,就要在这步和下步之间动手了。因为我只简单安装了LVM,所以在这儿只记录LVM的安装。
安装好win 10后,我进磁盘管理从最后一个盘划出了150G的空间,用来安装linux。
我的linux分区:70G的 / partition、70G的 /home partition、几个G的swap file。
分区工具我习惯使用cfdisk。执行cfdisk后,找到那个free space(因为我在win下只是划出了空间,没有格式化系统,所以是free space)。因为要装LVM,所以这次就没再把这150G的free space又分好几个区,直接将一整块分区new一下就好了,类型选为Linux LVM。然后write,quit。
接下来参照wiki里LVM页面,创建pv、vg、lv。vg的名字我就是按照wiki里的起的 “VolGroup00”,lv是lvolroot、lvolhome。
格式化、挂载
我的是这样的:
# mkfs.ext4 /dev/VolGroup00/lvolroot
# mkfs.ext4 /dev/VolGroup00/lvolhome
# mount /dev/VolGroup00/lvolroot /mnt
# mkdir /mnt/home
# mkdir /mnt/efi
# mount /dev/VolGroup00/lvolhome /mnt/home
# mount /dev/sda1 /mnt/efi
# mkdir /mnt/hostlvm
# mount --bind /run/lvm /mnt/hostlvm
最后两条是解决之后grub安装时可能发生的一个问题的。
选择镜像网址
打开文件/etc/pacman.d/mirrorlist,将以下网址放在最前面(手输的话,写上一两条就行了,等以后安装好了,直接复制剩余的)
Server = http://mirrors.tuna.tsinghua.edu.cn/archlinux/$repo/os/$arch
Server = http://mirrors.163.com/archlinux/$repo/os/$arch
Server = http://mirrors.ustc.edu.cn/archlinux/$repo/os/$arch
Server = http://mirrors.zju.edu.cn/archlinux/$repo/os/$arch
保存、退出。
装包(Install the base packages)
# pacstrap /mnt base base-devel
生成fstab文件
# genfstab -U /mnt >> /mnt/etc/fstab
进入chroot
# arch-chroot /mnt
# ln -s /hostlvm /run/lvm
这条是接着之前说的可能发生的问题的解决办法
各种配置
时区: # ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
时间:# hwclock --systohc
Localization:进入文件/etc/locale.gen,将包含en_US、zh_CN、zh_HK、zh_TW的行的注释去掉。保存退出。执行# locale-gen
。执行# echo LANG=en_US.UTF-8 > /etc/locale.conf
网络配置:# echo myhostname > /etc/hostname
,将以下信息输入文件/etc/hosts
127.0.0.1 localhost
::1 localhost
127.0.1.1 myhostname.localdomain myhostname
重新生成initramfs image
因为之前安装了LVM,所以需要修改mkinitcpio.conf。具体看此处。
设置Root密码
# passwd
新建普通用户并设置密码
# useradd -m -g users -G wheel -s /bin/bash username
# passwd username
我创建用户一直是用着这条命令,已经忘了各个option是什么意思了……
安装、配置GRUB
因为是Windows+Linux双系统,所以多安装一些东西。
# pacman -S grub os-prober ntfs-3g exfat-utils
因为我的root分区、boot分区都在LVM里,所以还需要对/etc/default/grub修改:GRUB_PRELOAD_MODULES="... lvm"
,就是在这行引号里面最后添加一个lvm。
然后安装、配置grub跟着wiki就可以了。click here
(我运行的安装命令是:# grub-install --removable --target=x86_64-efi --efi-directory=/efi --bootloader-id=GRUB
)
推荐一个网络管理器——Connman
有关它的安装、使用看这里。
遇到的问题
-
grub生成配置文件时报错“Device xxx not initialized 什么什么”,解决办法在wki grub的troubleshooting最后一个。如果是按本文操作安装的,应该不会出现这个问题了。
-
生成grub.cfg配置文件时,os-prober无法检测到windows。这个在wiki grub troubleshooting里也有相关说明,关了什么fast boot/HiberBoot/安全启动之类的。那里也说了,如果还不行的话,就把Windows分区挂载一下(记得安装ntfs-3g)。如果还检测不到,就退出安装镜像,拔了U盘,进入新系统,重新生成grub配置文件。如果还是不行,就自己写一个menuentry。
Win 10 menuentry:自己创建的menuentry可以写到/etc/grub.d/40_custom,然后重新生成grub配置文件就可以了。
MBR+BIOS:menuentry 'Windows 10 (on /dev/sda1)' --class windows --class os $menuentry_id_option 'osprober-chain-6C5CD5375CD4FCB0' { insmod part_msdos insmod ntfs set root='hd0,msdos1' if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 6C5CD5375CD4FCB0 else search --no-floppy --fs-uuid --set=root 6C5CD5375CD4FCB0 fi parttool ${root} hidden- drivemap -s (hd0) ${root} chainloader +1 }
这段是os-prober自动生成的,如果有时检测不到Windows,可以自己照着这段修改一下,添加到40_custom里。“6C5CD5375CD4FCB0”这是Windows系统所在分区的id,可以通过/etc/fstab文件或者cfdisk/parted等分区工具得到。
GPT+UEFI:menuentry "Win 10" { insmod part_gpt insmod fat set root=(hd0,gpt1) chainloader (${root})/EFI/Microsoft/Boot/bootmgfw.efi boot }
这段是我根据wiki里说的(wiki grub里“Windows installed in UEFI/GPT mode”),自己造的一段menuentry。自己用时需要注意磁盘的efi分区在哪个区里,是sda1,就写gpt1,sda2就写gpt2;然后要知道自己的Windows的efi文件的路径。(改天添加osprober自动生成的)
-
我装好arch后,缺少两个固件,一个aic什么什么,一个wd719什么什么。aic这个好解决,在aur中找到包,按照aur安装指南安装就行了。但是安装wd719这个时出了问题,有个网址在国内连接不上。因为以前安装过这俩个估计,重装前也有备份,看了一下发现aur里wd719更新到1.4版本了,我以前是1.3版本。试了几次都装不上1.4版本,那个网址死活连不上。后来想到换个网址,于是把1.4版本的PKGBUILD里的source换成了1.3版本的。之后成功安装。
-
在grub安装好后(此时还没检测到win 10),我重启了电脑,结果是直接进入了win 10,连grub界面都没出现,不管我怎样放置grub的efi文件,开机都不会出现grub界面。后来开机按F9,有个Boot from efi files,进去后发现,Microsoft的文件夹总是排在第一位,而且Boot是排在它后面的,很奇怪。百度了半天没有找到原因,后来在Arch Wiki里找,竟然又找到了原因和解决办法,参见这里。我选的解决办法就是创建一个Customized Boot,路径为
\EFI\boot\bootx64.efi
,然后将UEFI启动顺序的第一个改为Customized Boot。 -
为什么感觉csdn现在的markdown编辑这么难用……