Archlinux_2013 安装细则

今天从http://releng.archlinux.org/isos/2012.07.16_04-00-01下载了最新的archlinux安装盘,发现现在仅仅提供netinstall形式的安装盘。启动后安装,发现熟悉的/arch/setup已经不再存在。询问万能的Google同学后,得知这是新的安装方法(为啥要换呢?难道老的方式不好维护了?),现记录下来。

Step 1

准备好磁盘用户安装,创建磁盘分许与文件系统。如果需要使用LVM/RAID类似的功能,同样创建之。

1 cfdisk /dev/sda
2 mkfs.ext4 -L ROOT /dev/sda1
3 mkswap -L SWAP /dev/sda2

 

Step 2

根据文件系统,挂载root分区到/mnt,当然同样包含其他需要使用的相应分区。例如,mount /dev/sda1 /mnt/boot

1 mount /dev/sda1 /mnt
2 swapon /dev/sda2

Step 3

连接因特网用于过去软件包,dhcpcd之。

修改mirrorlist到mirrors.163.com,这是我获取仓库最快的地址。

复制代码

   1: #!/bin/bash

   2:  

   3: #

   4: # Assumptions:

   5: #  1) User has partitioned, formatted, and mounted partitions on /mnt

   6: #  2) Network is functional

   7: #  3) Arguments passed to the script are valid pacman targets

   8: #  4) A valid mirror appears in /etc/pacman.d/mirrorlist

   9: #

  10:  

  11: shopt -s extglob

  12:  

  13: out() { printf "$1 $2\n" "${@:3}"; }

  14: error() { out "==> ERROR:" "$@"; } >&2

  15: msg() { out "==>" "$@"; }

  16: msg2() { out "  ->" "$@";}

  17: die() { error "$@"; exit 1; }

  18:  

  19: in_array() {

  20:   local i

  21:   for i in "${@:2}"; do

  22:     [[ $1 = "$i" ]] && return

  23:   done

  24: }

  25:  

  26: api_fs_mount() {

  27:   if ! mountpoint -q "$1"; then

  28:     mount -B "$1" "$1" && ROOT_IS_BIND=1

  29:   fi &&

  30:   mount -t proc proc "$1/proc" -o nosuid,noexec,nodev &&

  31:   mount -t sysfs sys "$1/sys" -o nosuid,noexec,nodev &&

  32:   mount -t devtmpfs udev "$1/dev" -o mode=0755,nosuid &&

  33:   mount -t devpts devpts "$1/dev/pts" -o mode=0620,gid=5,nosuid,noexec &&

  34:   mount -t tmpfs shm "$1/dev/shm" -o mode=1777,nosuid,nodev &&

  35:   mount -t tmpfs run "$1/run" -o nosuid,nodev,mode=0755 &&

  36:   mount -t tmpfs tmp "$1/tmp" -o mode=1777,strictatime,nodev,nosuid,size=50M

  37: }

  38:  

  39: api_fs_umount() {

  40:   umount \

  41:     "$1/tmp" \

  42:     "$1/run" \

  43:     "$1/dev/shm" \

  44:     "$1/dev/pts" \

  45:     "$1/dev" \

  46:     "$1/sys" \

  47:     "$1/proc"

  48:  

  49:   (( ROOT_IS_BIND )) && umount "$1"

  50: }

  51:  

  52: valid_number_of_base() {

  53:   local base=$1 len=${#2} i=

  54:  

  55:   for (( i = 0; i < len; i++ )); do

  56:     (( (${2:i:1} & ~(base - 1)) == 0 )) || return

  57:   done

  58: }

  59:  

  60: mangle() {

  61:   local i= chr= out=

  62:  

  63:   unset {a..f} {A..F}

  64:  

  65:   for (( i = 0; i < ${#1}; i++ )); do

  66:     chr=${1:i:1}

  67:     case $chr in

  68:       [[:space:]\\])

  69:         printf -v chr '%03o' "'$chr"

  70:         out+=\\

  71:         ;;&

  72:         # fallthrough

  73:       *)

  74:         out+=$chr

  75:         ;;

  76:     esac

  77:   done

  78:  

  79:   printf '%s' "$out"

  80: }

  81:  

  82: unmangle() {

  83:   local i= chr= out= len=$(( ${#1} - 4 ))

  84:  

  85:   unset {a..f} {A..F}

  86:  

  87:   for (( i = 0; i < len; i++ )); do

  88:     chr=${1:i:1}

  89:     case $chr in

  90:       \\)

  91:         if valid_number_of_base 8 "${1:i+1:3}" ||

  92:             valid_number_of_base 16 "${1:i+1:3}"; then

  93:           printf -v chr '%b' "${1:i:4}"

  94:           (( i += 3 ))

  95:         fi

  96:         ;;&

  97:         # fallthrough

  98:       *)

  99:         out+=$chr

 100:     esac

 101:   done

 102:  

 103:   printf '%s' "$out${1:i}"

 104: }

 105:  

 106: fstype_is_pseudofs() {

 107:   # list taken from util-linux source: libmount/src/utils.c

 108:   local pseudofs_types=('anon_inodefs'

 109:                         'autofs'

 110:                         'bdev'

 111:                         'binfmt_misc'

 112:                         'cgroup'

 113:                         'configfs'

 114:                         'cpuset'

 115:                         'debugfs'

 116:                         'devfs'

 117:                         'devpts'

 118:                         'devtmpfs'

 119:                         'dlmfs'

 120:                         'fuse.gvfs-fuse-daemon'

 121:                         'fusectl'

 122:                         'hugetlbfs'

 123:                         'mqueue'

 124:                         'nfsd'

 125:                         'none'

 126:                         'pipefs'

 127:                         'proc'

 128:                         'pstore'

 129:                         'ramfs'

 130:                         'rootfs'

 131:                         'rpc_pipefs'

 132:                         'securityfs'

 133:                         'sockfs'

 134:                         'spufs'

 135:                         'sysfs'

 136:                         'tmpfs')

 137:   in_array "$1" "${pseudofs_types[@]}"

 138: }

 139:  

 140:  

 141:  

 142: newroot=/mnt

 143: hostcache=0

 144:  

 145: usage() {

 146:   cat <<EOF

 147: usage: ${0##*/} [options] root [packages...]

 148:  

 149:   Options:

 150:     -c             Use the package cache on the host, rather than the target

 151:     -d             Allow installation to a non-mountpoint directory

 152:  

 153: pacstrap installs packages to the specified new root directory. If no packages

 154: are given, pacstrap defaults to the "base" group.

 155:  

 156: EOF

 157: }

 158:  

 159: if [[ -z $1 || $1 = @(-h|--help) ]]; then

 160:   usage

 161:   exit $(( $# ? 0 : 1 ))

 162: fi

 163:  

 164: (( EUID == 0 )) || die 'This script must be run with root privileges'

 165:  

 166: while getopts ':cd' flag; do

 167:   case $flag in

 168:     d)

 169:       directory=1

 170:       ;;

 171:     c)

 172:       hostcache=1

 173:       ;;

 174:     :)

 175:       die '%s: option requires an argument -- '\''%s'\' "${0##*/}" "$OPTARG"

 176:       ;;

 177:     ?)

 178:       die '%s: invalid option -- '\''%s'\' "${0##*/}" "$OPTARG"

 179:       ;;

 180:   esac

 181: done

 182: shift $(( OPTIND - 1 ))

 183:  

 184: (( $# )) || die "No root directory specified"

 185: newroot=$1; shift

 186: pacman_args=("${@:-base}")

 187:  

 188: if (( ! hostcache )); then

 189:   pacman_args+=(--cachedir="$newroot/var/cache/pacman/pkg")

 190: fi

 191:  

 192: [[ -d $newroot ]] || die "%s is not a directory" "$newroot"

 193: if ! mountpoint -q "$newroot" && (( ! directory )); then

 194:   die '%s is not a mountpoint!' "$newroot"

 195: fi

 196:  

 197: # create obligatory directories

 198: msg 'Creating install root at %s' "$newroot"

 199: mkdir -p "$newroot/var/lib/pacman" "$newroot"/{dev,proc,sys,run,tmp,etc}

 200:  

 201: # always call umount on quit after this point

 202: trap 'api_fs_umount "$newroot" 2>/dev/null' EXIT

 203:  

 204: # mount API filesystems

 205: api_fs_mount "$newroot" || die "failed to setup API filesystems in new root"

 206:  

 207: msg 'Installing packages to %s' "$newroot"

 208: if ! pacman -r "$newroot" -Sy --noconfirm "${pacman_args[@]}"; then

 209:   die 'Failed to install packages to new root'

 210: fi

 211:  

 212: # if there's a keyring on the host, copy it into the new root, unless it exists already

 213: if [[ -d /etc/pacman.d/gnupg && ! -d $newroot/etc/pacman.d/gnupg ]]; then

 214:   cp -a /etc/pacman.d/gnupg "$newroot/etc/pacman.d/"

 215: fi

 216:  

 217: # install the host's mirrorlist onto the new root

 218: cp -a /etc/pacman.d/mirrorlist "$newroot/etc/pacman.d/"

 219:  

 220: # vim: et ts=2 sw=2 ft=sh:
 
复制代码

 

我的操作命令是

1 pacstrap /mnt base syslinux vim

Step 5

如果你忘记安装了必要的包,现在可以通过如下指令补救:

1 pacman -r /mnt -Sy package

在漫长的等待之后,基本上接下来的工作就是系统配置了。首先,我们切换root目录

1 arch-chroot /mnt

Setp 6

配置bootloader,我这里使用syslinux

1 syslinux-install_update -iam
2 vim /boot/syslinux/syslinux.cfg

Step 7

配置系统

复制代码
 1 exit # exit arch-chroot
 2 genfstab -p /mnt >> /mnt/etc/fstab
 3 arch-chroot /mnt
 4 cd /etc
 5 echo "hostname" > hostname
 6 echo "en_US.UTF-8" > locale.conf
 7 vi locale.gen
 8 locale-gen
 9 ln -s /usr/share/zoneinfo/Zone/Subzone localtime
10 exit
11 cp /etc/mkinitcpio.conf /mnt/etc/
12 arch-chroot /mnt
13 mkinitcpio -p linux
14 exit
15 umount /mnt
16 reboot
复制代码

 

 



 

 

 

posted @ 2013-05-13 17:45  彧喜喜  阅读(394)  评论(0)    收藏  举报
编辑推荐:
· 没有调度器的协程不是好协程,零基础深入浅出 C++20 协程
· 别做抢活的导演:代码中的抽象层次原则
· 从 Redis 客户端超时到 .NET 线程池挑战
· C23和C++26的#embed嵌入资源指南
· 「EF Core」框架是如何识别实体类的属性和主键的
阅读排行:
· 博客园众包线下沙龙第1期:云栖开发者基地,共建技术新天地
· 别做抢活的导演:代码中的抽象层次原则
· .NET周刊【7月第1期 2025-07-06】
· Claude Code如何集成到VSCode、PyCharm IDE及使用技巧
· 基于外卖系统的RBAC实现
点击右上角即可分享
微信分享提示