Arch Linux 安装后要做的事

前言

本文是 Arch Linux UEFI 安装教程 的续作,含个人配置文件,望各位看官自行斟酌。

确保系统为最新

pacman -Syu  # 升级系统中全部包

准备非 root 用户

useradd -m -G wheel -s /bin/bash xiaoqi

参数说明:

参数 解释
-m 创建用户的同时创建用户家目录
-G 选项后指定附加组
-s 指定 shell 程序

然后设置新用户的密码:

passwd xiaoqi

最后使用 visudo 命令编辑 /etc/sudoers 文件:

EDITOR=vim visudo

找到如下这样的一行,把前面的注释符号 # 去掉:

- #%wheel ALL=(ALL:ALL) ALL
+ %wheel ALL=(ALL:ALL) ALL

配置支持库/中文社区仓库

编辑 /etc/pacman.conf 文件:

vim /etc/pacman.conf

去掉 [multilib] 中的两行的注释,开启 32 位库支持。

- #[multilib]
- #Include = /etc/pacman.d/mirrorlist
+ [multilib]
+ Include = /etc/pacman.d/mirrorlist

在结尾处加入下面的文字,来添加 archlinuxcn 源。

## Server 多选一
[archlinuxcn]
Server = https://mirrors.zju.edu.cn/archlinuxcn/$arch           ## 浙江大学 (浙江杭州) (ipv4, ipv6, http, https)
Server = https://mirrors.cqupt.edu.cn/archlinuxcn/$arch         ## 重庆邮电大学 (重庆) (ipv4, ipv6, http, https)
Server = https://mirrors.bfsu.edu.cn/archlinuxcn/$arch          ## 北京外国语大学 (北京) (ipv4, ipv6, http, https)
Server = https://mirrors.jlu.edu.cn/archlinuxcn/$arch           ## 吉林大学 (吉林长春) (ipv4, ipv6, http, https)
Server = https://mirrors.sustech.edu.cn/archlinuxcn/$arch       ## 南方科技大学 (广东深圳) (ipv4, ipv6, http, https)
Server = https://mirrors.hust.edu.cn/archlinuxcn/$arch          ## 华中科技大学 (湖北武汉) (ipv4, ipv6, http, https)
Server = https://mirror.lzu.edu.cn/archlinuxcn/$arch            ## 兰州大学 (甘肃兰州) (ipv4, ipv6, http, https)
Server = https://mirrors.xjtu.edu.cn/archlinuxcn/$arch          ## 西安交通大学 (陕西西安) (ipv4, ipv6, http, https)
Server = https://mirror.nyist.edu.cn/archlinuxcn/$arch          ## 南阳理工学院 (河南南阳) (ipv4, ipv6, http, https)
Server = https://mirrors.njtech.edu.cn/archlinuxcn/$arch        ## 南京工业大学 (江苏南京) (ipv4, ipv6, http, https)
Server = https://mirrors.shanghaitech.edu.cn/archlinuxcn/$arch  ## 上海科技大学 (上海) (ipv4, https)

其它镜像源在 archlinuxcn 官方 Github Repo 里面有提供:archlinuxcn/mirrorlist

最后记得刷新 pacman 数据库并更新:

pacman -Syyu

安装 yay

# 首先导入 GPG key
pacman -Sy archlinuxcn-keyring

2023 年 12 月后,在新系统下安装 archlinuxcn-keyring 时可能会出现错误:

error: archlinuxcn-keyring: Signature from "Jiachen YANG (Arch Linux Packager Signing Key) " is marginal trust

需要在本地信任 Jiachen YANG (Arch Linux Packager Signing Key)GPG key

sudo pacman-key --lsign-key "[email protected]"

最后在安装 yay:

# 首先导入 GPG key
pacman -Sy yay

安装桌面环境以及常用软件

# Install Basic
pacman -S stow
pacman -S xorg xorg-xinit bspwm rofi alacritty
pacman -S tmux fish neovim lf nautilus flameshot
pacman -S xf86-video-amdgpu brightnessctl alsa-utils
pacman -S iwd dhcpcd
yay -S google-chrome
pacman -S fzf ripgrep lf bat fd

# Install Tools
pacman -S sxhkd
pacman -S betterlockscreen
pacman -S nitrogen
pacman -S fcitx5
yay -Sy antidot-bin
pacman -S polybar
pacman -S playerctl
pacman -S awk
pacman -S imwheel

# Install Picom
git clone [email protected]:yaocccc/picom.git
cd picom
pacman -S meson ninja libev uthash libconfig pcre
git submodule update --init --recursive
meson --buildtype=release . build
sudo ninja -C build install

git clone --recursive https://github.com/wwxiaoqi/dotfiles
cd dotfiles
./install.sh

安装字体

yay -S wqy-microhei
yay -S nerd-fonts-jetbrains-mono
yay -S ttf-material-design-icons
yay -S ttf-joypixels
yay -S ttf-dejavu

安装输入法

sudo pacman -S fcitx5-im              # 输入法基础包组
sudo pacman -S fcitx5-chinese-addons  # 官方中文输入引擎
sudo pacman -S fcitx5-anthy           # 日文输入引擎
sudo pacman -S fcitx5-pinyin-moegirl  # 萌娘百科词库
sudo pacman -S fcitx5-material-color  # 输入法主题

接着配置下环境变量,通过 vim 创建并编辑文件 ~/.config/environment.d/im.conf

vim ~/.config/environment.d/im.conf

在文件中加入以下内容并保存退出:

GTK_IM_MODULE=fcitx
QT_IM_MODULE=fcitx
XMODIFIERS=@im=fcitx
SDL_IM_MODULE=fcitx
GLFW_IM_MODULE=ibus

设置 Timeshift 快照

sudo pacman -S timeshift

如果 Timeshift 没有自动备份,需要手动开启 cronie 服务:

sudo systemctl enable --now cronie.service

配置完成后建议执行下述指令删除 subvolid

sudo sed -i -E 's/(subvolid=[0-9]+,)|(,subvolid=[0-9]+)//g' /etc/fstab

否则,恢复 BTRFS 类型快照时,可能因子卷 ID 改变导致无法正常进入系统。

安装驱动

# Intel 核芯显卡
sudo pacman -S mesa lib32-mesa vulkan-intel lib32-vulkan-intel

# AMD 集成显卡
sudo pacman -S mesa lib32-mesa xf86-video-amdgpu vulkan-radeon lib32-vulkan-radeon

# 独立显卡
sudo pacman -S nvidia-open nvidia-settings lib32-nvidia-utils

如果同时拥有集成显卡与独立显卡的笔记本电脑,可以使用 optimus-manager 等工具自动切换。

代理

dae 利用了 Linux 内核中的 eBPF[1] 技术,采用了透明代理和流量分流套件,可以提升分流性能,具体工作原理请看 dae 如何工作

安装 dae 或者 daed

# 二选一
sudo pacman -S dae   # dae 核心
sudo pacman -S daed  # 自带 Web 操作界面的 dae

配置 daed

# 设置开机自启动 daed 且立刻启动
sudo systemctl enable --now daed

daed 直接打开浏览器访问 http://localhost:2023 配置 daed 即可。

配置 dae

dae 需要自行配置 /etc/dae/config.dae

global {
  # 绑定到 LAN 和/或 WAN 接口
  # lan_interface: docker0
  wan_interface: auto # 使用 "auto" 自动侦测 WAN 接口

  log_level: info
  allow_insecure: false
  auto_config_kernel_parameter: true
}

subscription {
  # 在下面填入你的订阅链接
}

# 更多的 DNS 样例见 https://github.com/daeuniverse/dae/blob/main/docs/en/configuration/dns.md
dns {
  upstream {
    googledns: 'tcp+udp://dns.google.com:53'
    alidns: 'udp://dns.alidns.com:53'
  }
  routing {
    request {
      fallback: alidns
    }
    response {
      upstream(googledns) -> accept
      ip(geoip:private) && !qname(geosite:cn) -> googledns
      fallback: accept
    }
  }
}

group {
  proxy {
    policy: min_moving_avg
  }
}

# 更多的 Routing 样例见 https://github.com/daeuniverse/dae/blob/main/docs/en/configuration/routing.md
routing {
  pname(NetworkManager) -> direct
  dip(224.0.0.0/3, 'ff00::/8') -> direct

  ### 以下为自定义规则

  # 禁用 h3,因为它通常消耗很多 CPU 和内存资源
  l4proto(udp) && dport(443) -> block
  dip(geoip:private) -> direct
  dip(geoip:cn) -> direct
  domain(geosite:cn) -> direct

  fallback: proxy
}

如果你更注重隐私和 DNS 泄露,可以考虑使用以下配置替换上述的 dns 部分:

dns {
  upstream {
    googledns: 'tcp+udp://dns.google.com:53'
    alidns: 'udp://dns.alidns.com:53'
  }
  routing {
    request {
      qname(geosite:cn) -> alidns
      fallback: googledns
    }
  }
}

配置完毕后启动:

# 设置开机自启动 dae 且立刻启动
sudo systemctl enable --now dae


  1. eBPF 是一种可以在特权上下文(例如操作系统内核)中运行程序的技术,为 Linux 提供了更多可能性。 ↩︎

19 个赞

很详细教程 :+1:支持一下

2 个赞

感谢分享,我现在使用的是 v2raya,dae 看起来比 v2raya 好,目前楼主用得稳定么?
另外,这个会把 docker 的 rootless 模式的流量也给代理了么?我想让 docker 直连。

1 个赞

建议整上肥猫出品维基百科词库 fcitx5-pinyin-zhwiki

2 个赞

学习了,晚上试试

1 个赞

确实很详细。

1 个赞

确实详细,值得一试

1 个赞

稳定,速度比 v2 系快多了。
docker 貌似是写了个虚拟网卡来进行操作的。

可以试试指定 lan_interface 来避免多余流量操作。

另外也可以参考:使用 dae 配合 Clash 实现 Linux 网卡级全局代理,支持代理 Docker 容器
这里也提到了设定规则 pname 的方式来指定 docker,可以反其道而行之。

2 个赞

感谢,很详细

我建议直接看archkylin

学习一下。

折腾manjaro好像也是差不多这样 :rofl:

我配到一半突然反应过来,我是 docker rootless 没有虚拟网卡啊。。。。
我之前就是因为 docker rootless 所有操作都在用户命名空间,没有虚拟网卡,只要开了透明代理就会被中转,所以就关闭了 v2raya 的透明代理
目前我的 docker rootless 是透过 pasta 出去的,这咋配置规则直连绕过透明代理啊 :tieba_009: :tieba_009: :tieba_009:

pasta (same binary as passt, different command) offers equivalent functionality, for network namespaces: traffic is forwarded using a tap interface inside the namespace, without the need to create further interfaces on the host, hence not requiring any capabilities or privileges.
pasta(与 passt 二进制相同,命令不同)为网络命名空间提供了同等功能:使用命名空间内的 tap 接口转发流量,无需在主机上创建其他接口,因此不需要任何能力或权限。

参考资料:

放弃了,而且还不支持 inbound: [Feature Request] Support custom inbound · Issue #291 · daeuniverse/dae · GitHub
sport 应该不是 inbound 的别名,我试了代理局域网,也连不上

惊,在你L站居然真的能看见linux相关贴子

厉害的很

刚好可以参考,最近从Debian换到了EndeavorOS,然后使用nekoray但是访问国内网站还是不方便,试试你说的dae

dae支持vless协议吗?

支持协议:dae/docs/en/proxy-protocols.md at main · daeuniverse/dae · GitHub

学习一下,确实有用

我这dae开启只有国内有网,外网就没什么回事?用那个配置也一样

global {
##### 软件选项

# 监听的tproxy端口。它不是HTTP/SOCKS端口,仅供eBPF程序使用。
# 在正常情况下,不需要使用它。
tproxy_port: 12345

# 设置为true以保护tproxy端口免受未经请求的流量。设置为false以允许用户使用自管理的iptables tproxy规则。
tproxy_port_protect: true

# 设置非零值以启用pprof。
pprof_port: 0

# 如果不为零,从dae发送的流量将设置SO_MARK。这对于使用iptables tproxy规则避免流量循环非常有用。
so_mark_from_dae: 0

# 日志级别:error, warn, info, debug, trace。
log_level: info

# 禁用在拉取订阅前等待网络。
disable_waiting_network: false

# 为本地TCP连接启用快速重定向。已知内核问题可能会破坏某些客户端/代理,例如nadoo/glider。用户可以自行承担风险启用此实验选项。
enable_local_tcp_fast_redirect: false

##### 接口和内核选项

# 绑定的LAN接口。如果您想代理LAN,请使用它。
# 多个接口用“,”分隔。
#lan_interface: docker0

# 绑定的WAN接口。如果您想代理本地主机,请使用它。
# 多个接口用“,”分隔。使用“auto”自动检测。
wan_interface: auto

# 自动配置Linux内核参数,如ip_forward和send_redirects。请查看
# https://github.com/daeuniverse/dae/blob/main/docs/en/user-guide/kernel-parameters.md 以了解dae将执行的操作。
auto_config_kernel_parameter: true

##### 节点连通性检查

# URL的主机应同时具有IPv4和IPv6(如果您在本地有双栈)。
# 第一个是URL,其余的是IP地址(如果给出)。
# 考虑到流量消耗,建议选择具有anycast IP和较少响应的站点。
#tcp_check_url: 'http://cp.cloudflare.com'
tcp_check_url: 'http://cp.cloudflare.com,1.1.1.1,2606:4700:4700::1111'

# 向`tcp_check_url`的HTTP请求方法。默认使用'HEAD',因为某些服务器实现会绕过这种流量的计费。
tcp_check_http_method: HEAD

# 该DNS将用于检查节点的UDP连通性。如果下面的dns_upstream包含tcp,它也将用于检查节点的TCP DNS连通性。
# 第一个是URL,其余的是IP地址(如果给出)。
# 该DNS应同时具有IPv4和IPv6(如果您在本地有双栈)。
#udp_check_dns: 'dns.google.com:53'
udp_check_dns: 'dns.google.com:53,8.8.8.8,2001:4860:4860::8888'

check_interval: 30s

# 只有当new_latency <= old_latency - tolerance时,组才会切换节点。
check_tolerance: 50ms

##### 连接选项

# dial_mode的可选值是:
# 1. "ip"。直接使用DNS中的IP拨号代理。这允许您的IPv4、IPv6分别选择最佳路径,并使应用程序请求的IP版本符合预期。例如,如果您使用curl -4 ip.sb,您将通过代理请求IPv4并获取IPv4回显。使用curl -6 ip.sb将请求IPv6。
# 这可能会解决一些奇怪的全锥问题(如果您的节点支持)。在此模式下将禁用嗅探。
# 2. "domain"。使用嗅探到的域拨号代理。如果您有不纯的DNS环境,这将在很大程度上缓解DNS污染问题。通常,此模式带来更快的代理响应时间,因为代理将在远程重新解析域,从而获得更好的IP结果以进行连接。此策略不会影响路由。
# 也就是说,域重写将在流量拆分后的路由之后,dae不会重新路由它。
# 3. "domain+"。基于domain模式,但不检查嗅探域的真实性。如果您的DNS请求不通过dae但希望获得更快的代理响应时间,则此选项很有用。请注意,如果DNS请求不通过dae,dae无法通过域拆分流量。
# 4. "domain++"。基于domain+模式,但强制使用嗅探到的域重新路由流量,以部分恢复基于域的流量拆分能力。它对直接流量不起作用,并消耗更多CPU资源。
dial_mode: domain

# 允许不安全的TLS证书。不建议启用,除非必须。
allow_insecure: false

# 等待嗅探的首次数据发送的超时时间。如果dial_mode是ip,它总是0。在高延迟的LAN网络中,设置更高的值很有用。
sniffing_timeout: 100ms

# TLS实现。tls使用Go的crypto/tls。utls使用uTLS,可以模仿浏览器的Client Hello。
tls_implementation: tls

# uTLS用于模仿的Client Hello ID。此选项仅在tls_implementation为utls时生效。
# 参见更多:https://github.com/daeuniverse/dae/blob/331fa23c16/component/outbound/transport/tls/utls.go#L17
utls_imitate: chrome_auto

}

此处定义的订阅将解析为节点并作为全局节点池的一部分进行合并。

支持为订阅添加标签,并在group部分中过滤来自给定订阅的节点。

subscription {
# 添加您的订阅链接
my_sub: ‘https://订阅地址
}

此处定义的节点将作为全局节点池的一部分进行合并。

node {
# 添加您的节点链接
# 支持socks5, http, https, ss, ssr, vmess, vless, trojan, tuic, juicity等。
# 完整支持列表:dae/docs/en/proxy-protocols.md at main · daeuniverse/dae · GitHub
‘socks5://localhost:1080’
mylink: ‘ss://LINK’
node1: ‘vmess://LINK’
node2: ‘vless://LINK’
chains: ‘tuic://LINK → vmess://LINK’
}

查看 dae/docs/en/configuration/dns.md at main · daeuniverse/dae · GitHub 获取完整示例。

dns {
# 例如,如果ipversion_prefer是4,并且域名同时具有A记录和AAAA记录,则dae将仅响应A记录查询,并对AAAA记录查询响应空答案。
#ipversion_prefer: 4

# 为域名指定固定ttl。零表示dae将每次向上游请求,不会缓存这些域名的DNS结果。
#fixed_domain_ttl {
#    ddns.example.org: 10
#    test.example.org: 3600
#}

upstream {
    # 值可以是scheme://host:port,其中scheme可以是tcp/udp/tcp+udp。
    # 如果host是域名并同时具有IPv4和IPv6记录,dae将根据组策略(例如最小延迟策略)自动选择使用IPv4或IPv6。
    # 请确保DNS流量将通过并由dae转发,这是域名路由所必需的。
    # 如果dial_mode是"ip",上游DNS答案不应被污染,因此不推荐国内公共DNS。
    alidns: 'udp://dns.alidns.com:53'
    googledns: 'tcp+udp://dns.google.com:53'
}
routing {
    # 根据dns查询请求,决定使用哪个DNS上游。
    # 从上到下匹配规则。
    request {
        # 使用alidns查询中国大陆域名,其他使用googledns。
        qname(geosite:cn) -> alidns
        # fallback也称为默认。
        fallback: googledns
    }
}

routing {

# 根据dns查询请求,决定使用哪个DNS上游。

# 从上到下匹配规则。

request {

# fallback也称为默认。

fallback: alidns

}

# 根据dns查询响应,决定接受还是使用其他DNS上游重新查询。

# 从上到下匹配规则。

response {

# 可信上游。始终接受其结果。

upstream(googledns) → accept

# 可能被污染,使用googledns重新查询。

ip(geoip:private) && !qname(geosite:cn) → googledns

# fallback也称为默认。

fallback: accept

}

}

}

节点组(出站)。

group {
my_group {
# 无过滤器。使用所有节点。

    # 每个连接随机选择组中的一个节点。
    #policy: random

    # 每个连接选择组中的第一个节点。
    #policy: fixed(0)

    # 每个连接选择组中延迟最小的节点。
    #policy: min

    # 每个连接选择组中移动平均延迟最小的节点。
    policy: min_moving_avg
}

group2 {
    # 从订阅和节点部分定义的全局节点池中过滤节点。
    #filter: subtag(my_sub) && !name(keyword: 'ExpireAt:')
    # 多个过滤器表示‘或’逻辑。
    #filter: subtag(regex: '^my_', another_sub) && !name(keyword: 'ExpireAt:')

    # 根据标签从全局节点池中过滤节点。
    #filter: name(node1, node2)

    # 过滤节点并给定固定的延迟偏移,以实现基于延迟的故障转移。
    # 在此示例中,即使US节点的原始延迟较高,也更有可能选择US节点。
    filter: name(HK_node)
    filter: name(US_node) [add_latency: -500ms]

    # 每个连接选择组中最近10次延迟平均值最小的节点。
    policy: min_avg10
}

}

查看 dae/docs/en/configuration/routing.md at main · daeuniverse/dae · GitHub 获取完整示例。

routing {
### 预设规则

# 本地主机中的网络管理器应直接连接,以避免绑定到WAN时的网络连接检查误报。
pname(NetworkManager) -> direct

# 将其放在前面,以防止广播、组播和其他应发送到LAN的数据包通过代理转发。
# "dip"表示目的地IP。
dip(224.0.0.0/3, 'ff00::/8') -> direct

# 这行允许您直接访问私有地址,而不是通过代理。如果您确实想访问代理主机网络中的私有地址,请修改以下行。
dip(geoip:private) -> direct

### 在下方编写您的规则

# 禁用h3,因为它通常消耗过多的cpu/内存资源。
l4proto(udp) && dport(443) -> block
dip(geoip:cn) -> direct
domain(geosite:cn) -> direct

fallback: my_group

}