本文希望能尽可能地帮助没有任何基础知识但对Linux十分感兴趣的同学完成Arch Linux的安装,但本文不以安装为目的,而以学习为目的。

前言

我从上个暑假开始接触Linux,当时正值新冠疫情网课,家里的电脑和我同一个辈分,是WinXP的系统,有各种弹窗,运行速度令人担忧,并且WinXP已经停止维护了。于是上网查了一下,发现了这篇文章安装Bodhi Linux让老旧电脑重新焕发活力,于是开始了Linux的奇妙旅程。后来又了解到Arch Linux,便经过了一番努力,拥有了自己的U盘上的Arch Linux。它的确帮助我解决了不少问题,也让我学会了新的知识。

现在,有许多同学问我Linux学起来难吗,要花费多少精力,我也清楚没有任何基础接触Linux的尴尬,于是我想写下这篇文章,帮助大家减轻心理负担。

下面,请允许我把读者视为只会在Windows上点点鼠标的初学者。我会把基本的概念一一解释,其中也有不少废话,有能力的人请自行跳过。

安装前的准备

心理准备(可跳)

学习Arch Linux,至少就我而言,是一件趣事。不必太心急,遇到一个困难,解决一个困难,每解决一个困难都会有巨大的成就感。

遇到困难,要学会自己寻找解决方法,ArchWiki是你第一个应该参考的,如果不行,便要善用其他网络资源。

当然,你也可以向其他人寻求帮助。(Feel free to ask me!虽然我的回答不一定及时)

物质准备

一台计算机,网络,两个USB。

  • 计算机没有要求
  • 网络最好是有线网,因为Arch的安装需要通过网络来获取,有线连接较稳定。
  • 为了方便,我们把一个U盘叫作系统盘,另一个称作引导盘。系统盘就是最终安装Arch Linux的U盘,读写速度要快(USB3.0差不多了),容量要大(毕竟以后作为使用,要装软件,要放文件。我使用的是32G的USB3.0,有需求的可以再大,有钱的可以直接用移动硬盘。)

基础问答(可跳)

  • 什么是Linux?

    和Windows、Mac一样,Linux也是一种操作系统。操作系统,换言之,就是计算机的思想,由她来管理整个计算机。Linux还有传奇的发展历史,有兴趣的同学可以自行搜索。

  • 为什么使用Linux?

    我的建议是有钱当然可以选择Mac,打游戏就基本是Windows了。根据我使用Linux的经历来看,Linux有以下特点:

    • 开源(请自行搜索开源协议)
    • 安全(这也是开源带来的好处,毕竟源码公开,没人往里面塞病毒)
    • 稳定(大部分服务器都使用Linux,可以一直跑很多年)
    • 快速(Linux对计算机的要求很低,绝大部分的运行都很出色)

    总而言之,如果你烦透了Windows的各种推销、各种坑钱,那么Linux可以给你纯朴、高效的体验。

  • 为什么选择Arch Linux?

    Linux有许多发行版包括著名的RedHat、CentOS、Debian、Ubuntu等等。大家可以看看Archwiki的官方描述,事实上Arch拥有所有Linux发行版中最大的软件仓库,提供了可高度定制化的环境,可以说是个人用户的首选。

  • 为什么安装在U盘上?

    现在大家去买电脑,都会送Windows系统,盗版的系统也到处都是,Windows也能满足正常的办公,没有必要把Linux装在硬盘上了。而装在U盘上的系统可以随身携带,加上Archlinux的高度适应性,就可以在几乎任何一台别人的计算机上使用自己的系统了,隐私性也很高。

Tips

  • 所有命令输入完毕按Enter执行
  • 命令可以用Tab键补全
  • Live环境中大写锁定切换为Shift+CapsLk,chroot环境为CapsLk

安装

先贴一下参考链接:

Installatino guide–Archwiki

ArchLinux USB

Install Arch Linux on a removable medium (简体中文)

准备启动盘

  1. 下载安装镜像

    镜像站,找到China,选择镜像站(随便选),下载archlinux- -x86_64.iso

  2. 刻录U盘(启动盘)

    • Linux系统

      直接使用dd命令

      dd if=/路径/arch...iso of=/dev/sdx	# /dev/sdx为启动盘的位置
    • Windows系统

      使用刻录软件,如Rufusultraiso,等。

进入Live环境

将启动盘插入计算机,开机,进入主板

有些主板在开机界面会有按键提示(请注意界面左下角)进入bios(主板);如果没有,可以根据自己的主板型号搜索。将Secure Boot设置为disabled以禁用安全启动,然后允许U盘启动。具体请搜索bios设置u盘启动。

进入启动菜单,选择自己的启动盘,启动

系统盘分区(以UEFI启动,32G的U盘为例)

分区是将硬盘的可用空间划分为多个可以独立访问的区块。

每个分区在使用前需要格式化为 文件系统

分区信息被存放在分区表中。目前有两种主流的模式:传统的 Master Boot Record 和新的 GUID Partition Table。后者功能更强大,解决了许多MBR的限制。

  • 根分区

    根目录是目录树的顶层,这里是主文件系统挂载和其他文件系统挂靠的地方。所有文件和目录都在根目录 / 显示,即使它们实际上存储在其他的物理设备上。根文件系统中的内容应该足以启动、恢复、修复系统。因此 / 目录下的特定目录是不能作为独立分区的。

    / 分区或叫根分区是最重要而且必需的,需要最先挂载,其他其他分区可以被它取代。

  • EFI系统分区

    EFI 系统分区(也称为 ESP 或者 EFISYS)是一个 FAT32 格式的物理分区 (在硬盘主分区表上,而不是 LVM 或软件 RAID 等等) ,从这里 UEFI 固件启动 UEFI 引导器和应用程序。

    它与操作系统无关而是作为 EFI 固件要启动的引导器和应用程序的存储空间,是 UEFI 启动所必须。

    推荐使用 GPT 和 UEFI 搭配因为有的 UEFI 固件不支持 UEFI-MBR 启动。

    • 交换空间(可选) 参阅:swap

    交换空间通常是一个磁盘分区,但是也可以是一个文件。用户可以在安装 Arch Linux 的时候创建交换空间,或者在安装后的任何时间建立交换空间。交换空间可用于两个目的,将虚拟内存扩大到超过已安装的物理内存的容量,也可用于 suspend-to-disk 支持。

    使用swap扩展您的虚拟内存是否有好处取决与您的物理内存。如果物理内存不足以支撑您日常使用全部的程序的话(体现在日常使用时内存满了导致的卡顿,死机),使用swap也许会对您有些帮助。这样可以避免 out of memory conditions,Linux内核OOM Killer机制将尝试通过杀进程的方式来自动释放内存。如果您想让虚拟内存足够使用,请添加相应的差值(或更多)作为交换空间。

    启用交换的最大缺点是性能较低,请参阅:#性能优化。因此,启用swap是个人喜好问题:当物理内存用完时,有些人更喜欢杀死程序而不是启用交换,而另一些人更喜欢启用交换和较慢的系统。

    由于U盘的空间有限,加上现在的计算机内存越来越大,在这里我不推荐使用swap分区。如果你使用固态硬盘并且有需求,可以自己增加。

  • 目录

    Linux系统使用目录树的形式对硬盘(包括虚拟内存盘)进行读取,所有其他目录都挂载在/目录下,再依次挂载下去。

    /目录下面挂有如下目录:bin boot dev etc home lib lib64 mnt opt proc root run sbin srv sys tmp usr var .这些目录中我们涉及到/boot /home 需要了解。

    • /boot

      /boot 分区包含内核、ramdisk 镜像以及 bootloader 配置文件和 bootloader stage。它也可以存放内核在执行用户态程序之前所使用的其他数据。/boot 在日常系统运行中并不需要,只在启动和内核升级(包括重建initial ramdisk)的时候用到。

    • /home

      /home目录包含用户定义的配置文件、缓存、应用程序数据和媒体文件。简单来说/home就是用户个人场所。

      可以设置home分区并将其挂载在/home下,当然,如果U盘大小不允许,也可以不设置,我个人是不使用的(32G的U盘)

挂载点 分区 分区类型 建议大小
/mnt/boot/efi /dev/*efi_system_partition(efi 系统分区)* EFI 系统分区 至少 260 MiB
/mnt /dev/*root_partition(根分区)* Linux x86-64 根目录 (/) 自定义(/分区要用于安装软件,20~50G即可)
/home /dev/*home_partition(home分区)* Linux home 自定义
  • 建立硬盘分区

    将系统盘插入计算机,在Live环境中使用fdisk命令查看分区(也可以使用lsblk),并创建分区(也可以使用cfdisk等)。以下以fdisk为例:

    fdisk -l		# 查看分区

    找到自己的系统盘

    Disk /dev/nvme0n1: 476.94 GiB, 512110190592 bytes, 1000215216 sectors
    Disk model: SAMSUNG MZVLB512HBJQ-000L2              
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disklabel type: gpt
    Disk identifier: 9192D0F6-8CA5-465B-9B8C-B68598D3ED72
    
    Device             Start        End   Sectors   Size Type
    /dev/nvme0n1p1      2048     534527    532480   260M EFI System
    /dev/nvme0n1p2    534528     567295     32768    16M Microsoft reserved
    /dev/nvme0n1p3    567296  419997695 419430400   200G Microsoft basic data
    /dev/nvme0n1p4 419997696  788451327 368453632 175.7G Microsoft basic data
    /dev/nvme0n1p5 788451328  998164479 209713152   100G Microsoft basic data
    /dev/nvme0n1p6 998166528 1000214527   2048000  1000M Windows recovery environment
    
    
    Disk /dev/sda: 28.65 GiB, 30765219840 bytes, 60088320 sectors
    Disk model:  SanDisk 3.2Gen1
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disklabel type: gpt
    Disk identifier: D59BCF13-45C9-4E42-8034-0E098AEDFC88
    
    Device      Start      End  Sectors  Size Type
    /dev/sda1    2048   616447   614400  300M EFI System
    /dev/sda2  616448 60088286 59471839 28.4G Linux root (x86)
    
    

    在这里(实例中)就是/dev/sda,可以看到我的U盘是SanDisk 3.2Gen1

    细心的同学可以发现32G的U盘只有28.65G

    这是计算方法不同造成的

    存储制造商为了计算方便,使用十进制计算方法,是以1000(103)为换算单位的,即1GB=1000MB ;而计算机使用二进制,系统是用1024(210)为换算单位的,即1GB=1024MB 。这样计算机识别出的U盘容量就要小于U盘生产厂标称的容量,实际使用容量约为标示容量的90%左右。因此,所有U盘的实际容量都要小于标注容量,一般来说,8G为7.45G左右,16G为14.9G左右,以此类推。

    因为存储的最小单位为字节(Byte)以16G的U盘为例,计算如下:

    制造商计算的容量为:16G=1610001000*1000(Byte)=16000000(Bytes)

    而系统计算的实际容量应为:

    16000000/1024/1024/1024=14.9012(GB)

    得出的结果和14.7GB差不多。

    1KB=1000Bytes

    1MB=1000KB

    1GB=1000MB 。

    而操作系统的换算则为

    1KB=1024Bytes

    1MB=1024KB

    1GB=1024MB 。

    这就产生了存储设备标配容量和实际使用容量出现差异的情况。

    创建分区(以/dev/sda为例,32G的U盘,300M的EFI分区,剩余都划给根分区)

    fdisk /dev/sda

    先按m for help(按下m然后Enter回车),如下帮助

    Help:
    GPT
    M   enter protective/hybrid MBR
    
    Generic
    d   delete a partition
    F   list free unpartitioned space
    l   list known partition types
    n   add a new partition
    p   print the partition table
    t   change a partition type
    v   verify the partition table
    i   print information about a partition
    
    Misc
    m   print this menu
    x   extra functionality (experts only)
    
    Script
    I   load disk layout from sfdisk script file
    O   dump disk layout to sfdisk script file
    
    Save & Exit
    w   write table to disk and exit
    q   quit without saving changes
    
    Create a new label
    g   create a new empty GPT partition table
    G   create a new empty SGI (IRIX) partition table
    o   create a new empty DOS partition table
    s   create a new empty Sun partition table
    1. g创建新的GPT分区表

    2. n创建第一个新分区,起始位置默认即可(按下Enter),终止位置:+300M

    3. n创建第二个新分区,都默认。

    4. t改变分区类型

      不同的分区类型有不同的UUID,可以理解为有不同的身份证明,便于操作系统识别,在之后会有用处

      选择1,即我们的300M的EFI分区

      l查看分区类型的种类,列出部分如下:

      1 EFI System                     C12A7328-F81F-11D2-BA4B-00A0C93EC93B
      2 MBR partition scheme           024DEE41-33E7-11D3-9D69-0008C781F39F
      3 Intel Fast Flash               D3BFE2DE-3DAF-11DF-BA40-E3A556D89593
      4 BIOS boot                      21686148-6449-6E6F-744E-656564454649
      5 Sony boot partition            F4019732-066E-4E12-8273-346C5641494F
      6 Lenovo boot partition          BFBFAFE7-A34F-448A-9A5B-6213EB736C22
      7 PowerPC PReP boot              9E1A2D38-C612-4316-AA26-8B49521E5A8B
      8 ONIE boot                      7412F7D5-A156-4B13-81DC-867174929325
      9 ONIE config                    D4E6E2CD-4469-46F3-B5CB-1BFF57AFC149
      10 Microsoft reserved             E3C9E316-0B5C-4DB8-817D-F92DF00215AE
      11 Microsoft basic data           EBD0A0A2-B9E5-4433-87C0-68B6B72699C7
      12 Microsoft LDM metadata         5808C8AA-7E8F-42E0-85D2-E1E90434CFB3
      13 Microsoft LDM data             AF9B60A0-1431-4F62-BC68-3311714A69AD
      14 Windows recovery environment   DE94BBA4-06D1-4D40-A16A-BFD50179D6AC
      15 IBM General Parallel Fs        37AFFC90-EF7D-4E96-91C3-2D7AE055B174
      16 Microsoft Storage Spaces       E75CAF8F-F680-4CEE-AFA3-B001E56EFC2D
      17 HP-UX data                     75894C1E-3AEB-11D3-B7C1-7B03A0000000
      18 HP-UX service                  E2A1E728-32E3-11D6-A682-7B03A0000000
      19 Linux swap                     0657FD6D-A4AB-43C4-84E5-0933C84B4F4F
      20 Linux filesystem               0FC63DAF-8483-4772-8E79-3D69D8477DE4
      21 Linux server data              3B8F8425-20E0-4F3B-907F-1A25A76F98E8
      22 Linux root (x86)               44479540-F297-41B2-9AF7-D131D5F0458A
      23 Linux root (x86-64)            4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709 

      :q 退出查看

      选择1 EFI System

      t改变类型,选择2,即我们的根分区,选择23 Linux root (x86-64)

    5. p打印当前分区表

      Disk /dev/sda: 28.65 GiB, 30765219840 bytes, 60088320 sectors
      Disk model:  SanDisk 3.2Gen1
      Units: sectors of 1 * 512 = 512 bytes
      Sector size (logical/physical): 512 bytes / 512 bytes
      I/O size (minimum/optimal): 512 bytes / 512 bytes
      Disklabel type: gpt
      Disk identifier: D59BCF13-45C9-4E42-8034-0E098AEDFC88
      
      Device      Start      End  Sectors  Size Type
      /dev/sda1    2048   616447   614400  300M EFI System
      /dev/sda2  616448 60088286 59471839 28.4G Linux root (x86)
      
      

      如图,我们创建了两个分区,一个为/dev/sda1,是EFI分区;一个为/dev/sda2,是根分区。

    6. w保存并退出(写入新的分区表)

    7. 格式化分区(决定分区的文件系统

      文件系统控制数据的读和写。如果没有文件系统,储存介质里的信息就会变成一块无法理解的数据。通过把数据分块、命名,不同的信息就可以被隔离、分辨。每组数据被命名为“文件”是取自纸质信息系统的命名方式。而“文件系统”是指用于管理信息的分组和命名的结构和逻辑规则。

      文件系统有很多,每个磁盘分区可以而且只可以使用其中的某一个。每种文件系统有自己的优缺点和独有特性。

      EFI分区需要fat32格式,/分区需要ext4格式,如果创建了home分区(可以选择ext4格式,读写较快;也可以选择ntfs或exfat,便于与Windows进行数据交换,Windows无法识别ext4)

      分区格式化命令:

      mkfs.fat -F32 /dev/sda1		# EFI分区
      mkfs.ext4 /dev/sda2		# /分区
      mkswap /dev/swap_partition		# 交换分区
      mkfs.ntfs /dev/home_partition		# home分区格式化为ntfs
      mkfs.exfat /dev/home_partition		# home分区格式化为exfat

      可以给分区加上Lable(卷标,也就是名字),则命令如下:

      mkfs.fat -F32 /dev/sda1 -n "名字"
      mkfs.ext4 /dev/sda2 -L "名字"
      mkswap /dev/swap_partition
      mkfs.ntfs -f /dev/home_partition -L "名字"	# -f表示快速格式化,最好加上
      mkfs.exfat /dev/home_partition -L "名字"

      将home分区格式化为ext4之外的格式并写入fstab默认挂载会使得该分区的所有者为root,新建用户后出现权限问题,请做好调试的准备——2022/2/8更新

    8. 挂载分区

      先回忆一下表格

      挂载点 分区 分区类型 建议大小
      /mnt/boot/efi /dev/*efi_system_partition(efi 系统分区)* 我们的/dev/sda1 EFI 系统分区 至少 260 MiB
      /mnt /dev/*root_partition(根分区)* 我们的/dev/sda2 Linux x86-64 根目录 (/) 自定义(/分区要用于安装软件,20~50G即可)
      /home /dev/*home_partition(home分区)* Linux home 自定义
      • 挂载根分区

        mount /dev/sda2 /mnt
      • 挂载EFI分区(不推荐现在挂载,因为EFI分区只在启动时被读取,内核启动后就没用了,所以没有必要写入fstab默认挂载,可以在后面挂载) —— 2022/2/8更新

        mkdir /mnt/boot
        mkdir /mnt/boot/efi
        mount /dev/sda1 /mnt/boot/efi
      • 挂载home分区

        mkdir /mnt/home
        mount /dev/home_partition /mnt/home
      • 启用swap分区

        swapon /dev/swap_partition

      mkdir就是新建一个文件夹,mount就是把分区挂载到某个文件夹下使其能被访问

安装

  • 联网

    • 有线网

      dhcpcd
    • 无线网

      iwctl		# 进入iwd的交互界面
      [iwd]# help		# 查看帮助
      [iwd]# device list		#查看网卡
      [iwd]# station wlan0 scan		# 扫描
      [iwd]# station wlan0 get-networks		# 查看网络
      [iwd]# station wlan0 connect ****		# 连接
      [iwd]# exit		# 退出交互界面
    • 有线网(静态ip)

      ip l	# 查看网卡
      ip l set enps0(网卡) up	# 打开网卡
      ip a add 192.168.17.201/24 dev enps0	# 加入ip根据自己的
      ip r add default via 192.168.17.1	# 增加网关,与上面对应
    • 检查网络连接

      ping -c 4 www.baidu.com

      出现如下则成功

      PING www.a.shifen.com (182.61.200.6) 56(84) bytes of data.
      64 bytes from 182.61.200.6 (182.61.200.6): icmp_seq=1 ttl=50 time=28.1 ms
      64 bytes from 182.61.200.6 (182.61.200.6): icmp_seq=2 ttl=50 time=30.5 ms
      64 bytes from 182.61.200.6 (182.61.200.6): icmp_seq=3 ttl=50 time=30.5 ms
      64 bytes from 182.61.200.6 (182.61.200.6): icmp_seq=4 ttl=50 time=30.2 ms
      
      --- www.a.shifen.com ping statistics ---
      4 packets transmitted, 4 received, 0% packet loss, time 3005ms
      rtt min/avg/max/mdev = 28.132/29.863/30.549/1.007 ms
      
      
  • 安装

    pacstrap /mnt base linux linux-firmware base-devel vim nano dhcpcd iwd intel-ucode amd-ucode

    这一步就是将ArchLinux的内核、驱动、基本包、文本编辑器、联网工具、微码安装到/mnt即我们的根分区上

  1. 配置系统

    1. Fstab

      用以下命令生成 fstab 文件 (用 -U-L 选项设置UUID 或卷标,前提是已经设置卷标):

      genfstab -U /mnt >> /mnt/etc/fstab

      检查一下生成的 /mnt/etc/fstab 文件是否正确:

      cat /mnt/etc/fstab
    2. Chroot

      Change root 到新安装的系统:

      arch-chroot /mnt
    3. 本地化

      程序和库如果需要本地化文本,都依赖 Locale,后者明确规定了地域、货币、时区日期的格式、字符排列方式和其他本地化标准。

      需在这两个文件设置:locale.genlocale.conf

      编辑 /etc/locale.gen,然后取消掉 en_US.UTF-8 UTF-8zh_CN.UTF-8 UTF-8 前的注释(#)。

      nano /etc/locale.gen

      在nano中Ctrl+w可以查找,Ctrl+x退出(退出时按y确认修改,再按Enter)

      接着执行 locale-gen 以生成 locale 信息:

      locale-gen

      然后创建 locale.conf(5) 文件

      echo "LANG=en_US.UTF-8" >> /etc/locale.conf
    4. 创建主机名

      echo "你自己取的主机名" >> /etc/hostname

      编辑/etc/hosts(使用nano)如下:

      127.0.0.1	localhost
      ::1		localhost
      127.0.1.1	myhostname.localdomain	myhostname
    5. Initramfs(此步骤为U盘安装必需)

      创建新的 initramfs

      创建 RAM Disk 前,修改 /etc/mkinitcpio.conf,将 blockkeyboard 钩子移动到 autodetect 前面。只有这样生成的早期用户空间才能包含支持不同的系统硬件的模块。

      nano /etc/mkinitcpio.conf

      HOOKS(即钩子)修改如下:

      HOOKS=(base udev block keyboard autodetect modconf filesystems fsck)

      生成新的RAM Disk

      mkinitcpio -P
    6. Root 密码

      root是Linux中的管理员用户,拥有最高权限

      设置 Root 密码

      passwd
    7. 安装引导程序

      因为这里需要使用Pacman(Archlinux的包管理器)安装软件,先修改Pacman的配置

      nano /etc/pacman.d/mirrorlist

      默认已经按照速度排序,先Ctrl+\将所有Server替换成#Server,再除去第一个Server#即可

      安装grub和efibootmgr

      pacman -Sy grub efibootmgr

      EFI挂载

      mkdir -p /boot/efi
      mount /dev/sda1 /boot/efi

      ——2022/2/8更新

      设置grub

      grub-install --target=x86_64-efi --efi-directory=/boot/efi --removable --recheck 

      生成 GRUB 配置:

      grub-mkconfig -o /boot/grub/grub.cfg
    8. 添加用户

      正常情况下应该使用普通用户登录,故创建用户如下:

      useradd -m -g wheel -s /bin/bash username(你的用户名)

      设置用户密码

      passwd username(你的用户名)

      为用户添加sudo权限:

      nano /etc/sudoers

      除去## %wheel ALL=(ALL)ALL前的##

    9. 重启

      输入 exit 或按 Ctrl+d 退出 chroot 环境。

      执行reboot重启。

    10. 结束


2022/2/8更新

有同学根据这篇文章完成了第一次ArchLinux的安装,并且发现其中有一些笔误和需要更新的地方而向我指出。在此感谢各位,Arch的安装经常有变化,希望大家发现问题后能够指出。

此外,由于部分主板不支持UEFI启动,在参考文章ArchLinux USB中已经有BIOS&UEFI双引导的方案提高兼容性。由于现在大部分计算机都已支持UEFI,所以之前没有特别指出这一点。但是有同学遇到了不支持UEFI的情况,并已对此提供了详尽的解释和解决方案。传送门:ggdab~~

再次感谢各位!