一:前期准备
拿一个U盘刻录成Arch Linux的启动盘,可以用dd命令,或者到Windows下使用Refus以dd方式刻录成启动盘,注意最好不要使用其他方法,本人试过多个刻写启动盘的软件,很多不是刻好后无法启动,就是启动过程出现各种各样的问题,比如Ultral-ISO。
其他可以刻写成功并启动的还有:unetbootin(Linux和Windows版本都有)
1. 先下载Arch系统的镜像:
Arch系统镜像地址:
Arch官方下载区(可选国家及镜像源地址): https://www.archlinux.org/download/
这里提供一个清华源下载地址:https://mirrors.tuna.tsinghua.edu.cn/archlinux/iso/2019.05.02/
可自行删掉URL后面的日期寻找看这篇文章时候的最新镜像
2. 在Linux下使用dd命令制作启动盘
- 打开终端,切换到镜像所在目录
- 插入U盘,注意不要进行挂载操作!!!
- 如果是系统自动挂载的,不要用鼠标直接弹出或者点击Unmount之类的,请执行以下操作
- 在终端输入以下命令查看U盘设备号和分区号
123fdisk -l
会看到类似以下的输出,一般通过U盘的大小就能知道哪个是U盘设备号。
123456789101112Disk /dev/sda: 14.4 GiB, 15502147584 bytes, 30277632 sectorsDisk model: DataTraveler 3.0Units: sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisklabel type: dosDisk identifier: 0x2ec1b483Device Boot Start End Sectors Size Id Type/dev/sda1 8064 30277631 30269568 14.4G c W95 FAT32 (LBA)
比如我的是/dev/sda, 注意设备号后面一定没有数字,/dev/sda1是分区号!!!记住你自己的U盘设备号,等一下要用。 - 输入以下命令进行U盘弹出:
123umount /dev/sda1 #注意弹出使用的是分区号
- 在终端输入以下命令获取U盘设备号,前面如果已经获取了,请跳过这步。
123lsblk
看到类似以下输出,找到自己U盘的设备号,比如下面sda即是我U盘的设备号:
12345NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTsda 8:0 1 14.4G 0 disk└─sda1 8:1 1 14.4G 0 part - 使用以下dd命令刻写U盘,注意将if等于号后面的镜像改成你自己的,of等号后面的改成你U盘的设备号,而且是非数字结尾的!!! 不能是/dev/sda1!!!
123sudo dd bs=4M if=./archlinux-2019.05.02-x86_64.iso of=/dev/sda status=progress oflag=sync
还有其他各种各样的方法,请参考Arch Wiki:https://wiki.archlinux.org/index.php/USB_flash_installation_media#BIOS_and_UEFI_bootable_USB
3. 用refus刻录U盘启动盘
如果已经用dd方式制作完成请跳过这步
- 具体方法请网上自行搜索,比较简单不再赘述,记得一定要使用dd方式写入U盘即可。
- 还有其他各种各样的方法,请参考Arch Wiki:https://wiki.archlinux.org/index.php/USB_flash_installation_media#BIOS_and_UEFI_bootable_USB
4. 关机启动到U盘
- 完全关机后,按电源键开机,在屏幕出现灯光的时候,按几下F12或对应型号电脑进入启动项选择的快捷键(如果不是F12,请网上自行查找或者多试几个其他键,或者进入BIOS手动选择第一启动项)。
- 进入到开机项选择后,选择U盘启动的项目(按方向键选择),然后回车
- 等待进入U盘或者回车直接进入(Boot Arch Linux(x86_64))
5. 连接网络
1 2 3 |
wifi-menu #使用此命令按指示连接好无线网络 |
或者连接的是有线网络的话,执行以下命令获取IP:
1 2 3 |
dhcpcd |
全称是Dynamic Host Configuration Protocol Client Daemon,即动态主机配置协议客户端进程
如果是校园网,有些是需要登录操作的,暂时不知道解决办法,一般都是连接无线网络,或者有双系统的话,先切换到另一个系统登录后关机启动到U盘可以不用再登录,网络即可用
6. 同步时间
1 2 3 |
timedatectl set-ntp true |
二:分析问题,解决问题
1. 更新内核后无法启动,报错类似premature end of file /boot/vmlinuz
一般这种情况进行重装内核即可,请执行以下步骤,当然,也可以通过grub选择回退版本内核启动。
- 查看Linux系统分区并执行挂载操作
123fdisk -l
识别出你的根分区和启动分区,先挂载根分区到/mnt, 再挂载启动分区到/mnt/boot, 示例
1234mount /dev/nvme0n1p2 /mntmount /dev/nvme0n1p1 /mnt/boot #请将分区号换成你自己的 - Arch-chroot到受损系统
123arch-chroot /mnt - 重新安装内核
123456pacman -S linux#如果是lts内核,请替换成如下命令pacman -S linux-lts - 关机重启,如果依旧无法启动,再执行后面的操作
1234exitreboot - 如果上述操作无法解决问题,重复前面的步骤,最后的内核重装命令换成下面的:
123pacman -Syyuu linux - 如果上述操作依旧无法解决问题,尝试降级内核
1234pacman -U /var/cache/pacman/pkg/linux-5.0.12.arch2-1-x86_64.pkg.tar.xz#将最后的linux内核包换成你自己的上一个可用的内核版本 - 如果上述所有方法都失败了,请参照下述磁盘空间转移导致引导失败的解决办法,进行格式化启动分区,进行整个分区的引导信息重写。
2. 磁盘空间转移导致引导失败的解决办法
此方法适用于有独立引导分区的情况,如果boot是作为文件夹在根分区而不是作为独立分区挂载到根分区的话,请不要执行下述操作!!!,因为这将清除分区的所有信息。
注:为什么不直接删除引导分区的所有文件进行重写引导分区信息?
答:本人试过,如果是这样的话,将会在重写的过程中发生各种各样的错误,不限于生成报错,ReadOnly filesystem等等。
具体步骤(由于上一次操作有点久,具体可能有点偏差,请读者自行鉴别):
- 不要挂载引导分区,如果挂载了请先umount
123umount /dev/sda1 #将sda1换成你自己的引导分区号 - 格式化引导分区
123mkfs.fat -F32 /dev/sdx1 #将sda1换成你自己的引导分区号
接下来查看分区格式是否正确
123456789fdisk -l对应引导分区输出应类似如下:Device Start End Sectors Size Type/dev/nvme0n1p1 2048 1050623 1048576 512M EFI System重要的是显示的是EFI System
如果不是的话执行以下命令格式化对应分区
123456fdisk /dev/nvme0n1#注意这里指的是一整个设备号,而不是分区号#将nvme0n1换成你自己的设备号,如sda,不含数字#如果是固态的话,就是类似我的这样,不包含最后的p几。
然后输入t,选择分区号,再根据提示选择更改的分区类型,p打印将更改成的信息。确认后输入w写入所有操作。 - 挂载根分区和引导分区
123456mount /dev/nvme0n1p2 /mntmount /dev/nvme0n1p1 /mnt/boot#nvme0n1p1换成你自己的引导分区号,相应的nvme0n1p2换成你的根分区号 - 选择镜像源
12345678910111213vim /etc/pacman.d/mirrorlist#找到China的行,将它复制到文件最前面,并将网址前的‘#’号反注释掉如下是我的配置示例:## ChinaServer = http://mirror.lzu.edu.cn/archlinux/$repo/os/$arch## ChinaServer = http://mirrors.tuna.tsinghua.edu.cn/archlinux/$repo/os/$arch## ChinaServer = http://mirrors.ustc.edu.cn/archlinux/$repo/os/$arch#这些内容可以手动输入
选择好后保存退出。 - 重新安装linux到磁盘
123pacstrap /mnt base - 转移操作权到待修复系统
123arch-chroot /mnt - 安装相关依赖包(对于EFI/GPT引导方式)
123pacman -S intel-ucode os-prober grub efibootmgr
如果是BIOS/MBR引导,请参见https://www.viseator.com/2017/05/17/arch_install/内容 - 部署Grub
12345grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=grub#如果grub生成出现了非下列错误,请先卸载os-prober包,#据笔者记忆,os-prober包导致过中途某个环节的失败。
“如果报 warning failed to connect to lvmetad,falling back to device scanning.错误。简单的方法是编辑 /etc/lvm/lvm.conf这个文件,找到 use_lvmetad = 1将 1修改为 0,保存,重新配置grub。如果报 grub-probe: error: cannot find a GRUB drive for /dev/sdb1, check your device.map类似错误,并且 sdb1这个地方是你的u盘,这是u盘 uefi分区造成的错误,对我们的正常安装没有影响,可以不用理会这条错误。”
- 生成配置文件
123grub-mkconfig -o /boot/grub/grub.cfg
- 检查
123cat /boot/grub/grub.cfg
查看有没有Linux的入口,有的话就行,Windows的无关紧要,进入系统后可以再来生成。
- 如果入口不存在
123ls /boot
查看是否有下列文件等
12345initramfs-linux.imgintel-ucode.imgvmlinuz-linux如果没有,重新安装linux,生成配置文件
1234pacman -S linuxgrub-mkconfig -o /boot/grub/grub.cfg - 检查如果已经有了入口了,退出重启
1234exitreboot
3. 卸载软件的时候不小心将系统核心依赖连带卸载,系统多数命令无法正常使用
如果pacman还可以用的话,直接重新安装对应依赖即可,如果卸载的依赖造成pacman都无法使用的话,需要用启动盘进行修复。
参照这篇文章https://poemdear.com/2019/05/06/invalid-or-corrupted-gpg-errors-pacstrap-mnt-base/
安装基本包,会将核心依赖自动补上即可解决问题。