Arch Linux 滚动更新永不落伍 你还在为系统升级而烦恼吗

在 Linux 世界中,Arch Linux 以其极简主义、KISS(Keep It Simple, Stupid)原则和强大的用户控制权而闻名。然而,最让 Arch Linux 用户津津乐道,同时也让新手望而却步的,莫过于其“滚动更新”(Rolling Release)的模式。你是否还在为传统发行版(如 Ubuntu、Fedora)的大版本升级而感到焦虑?担心升级过程会破坏系统稳定性,或者不得不重装系统才能获得最新的软件?本文将深入探讨 Arch Linux 的滚动更新机制,揭示它如何让你的系统“永不落伍”,并提供详细的指导,帮助你优雅地管理 Arch Linux 的升级,彻底告别系统升级的烦恼。
什么是滚动更新?为什么它让 Arch Linux 与众不同?
在深入了解 Arch Linux 之前,我们先来明确一下“滚动更新”的概念。
传统的 Linux 发行版通常采用“定点发布”(Point Release)模式。例如,Ubuntu 每六个月发布一个新版本(如 22.04 LTS, 24.04 LTS)。在这种模式下,系统核心和软件包版本在发布时就被固定了。用户在安装后,通常只能获得安全更新和错误修复,而无法轻易升级到更新的软件版本。想要体验新内核、新桌面环境或新特性?你往往需要等待下一个大版本发布,然后执行一次完整的系统升级,甚至重装系统。这个过程不仅耗时,而且充满了不确定性,容易导致依赖冲突或数据丢失。
相比之下,
滚动更新
模式则完全不同。它没有固定的“版本号”概念。一旦软件开发者发布了新版本,经过 Arch Linux 维护者的打包和测试,就会立即推送到软件仓库中。用户只需定期运行更新命令,就能让系统时刻保持在最新状态。
Arch Linux 的滚动更新核心优势在于:
持续更新,永不落伍
:你永远不需要等待“下一个版本”。你的系统从安装那一刻起,就在不断地演进。今天安装的 Arch,明天就拥有了最新的软件。
软件版本最新
:Arch Linux 的软件仓库以“新鲜”著称。当 Gnome 46 发布时,Arch 用户往往是第一批体验到的。这对于开发者、测试人员和追求新技术的极客来说极具吸引力。
安装一次,持续使用
:你只需要安装一次系统,就可以通过持续的更新来维护它,无需每隔几年就重装一次。这大大节省了时间和精力。
Arch Linux 滚动更新的基石:KISS 原则与 AUR 生态
Arch Linux 之所以能成功地维持滚动更新,离不开其独特的设计哲学和强大的生态系统。
1. 简单的设计(Simple Design)
Arch 遵循 KISS 原则,这意味着它的系统架构相对简单,没有过多的补丁和定制。这使得将上游(Upstream)软件包集成到 Arch 仓库中变得更加容易和快速。相比之下,像 Ubuntu 这样的发行版会对软件进行大量定制和修改,这在一定程度上延缓了新版本的集成速度。
2. Arch User Repository (AUR) —— 软件包的海洋
AUR 是 Arch Linux 社区贡献的瑰宝。它包含了数万个由用户维护的软件包构建脚本(PKGBUILD)。这意味着,即使官方仓库没有收录某个软件,你也很有可能在 AUR 中找到它。AUR 的存在极大地丰富了 Arch 的软件生态,并且很多 AUR 包会紧跟上游最新版本,进一步保证了系统的“新鲜度”。
3. 滚动更新的挑战与应对
滚动更新并非没有挑战。最大的风险在于,如果更新不当,可能会导致系统不稳定。例如,内核更新后,显卡驱动可能需要同步更新;库文件更新后,依赖它的应用程序可能需要重新编译。然而,Arch Linux 通过以下方式来缓解这些问题:
测试仓库(Testing Repository)
:重大的更新(如 GCC、Systemd、Kernel)通常会先进入
testing
仓库,经过社区测试稳定后,再进入核心仓库。
清晰的公告(Arch News)
:Arch Linux 官网会发布重要的更新公告,告知用户需要手动干预的步骤。
强大的包管理器 Pacman
:
pacman
是 Arch 的核心工具,它能高效地处理依赖关系和软件包升级。
实战指南:如何优雅地管理 Arch Linux 升级
了解了理论,接下来我们进入实战。以下是一套完整的 Arch Linux 升级流程和最佳实践,帮助你告别升级烦恼。
1. 升级前的准备工作:阅读公告与检查配置
在执行任何升级命令之前,养成良好的习惯至关重要。
步骤一:访问 Arch Linux 官网新闻
在终端中输入以下命令,或者直接访问
https://archlinux.org/news/
。
# 使用 curl 和 grep 快速查看最近的新闻标题
curl -s https://archlinux.org/feeds/news/ | grep -E ‘|<pubDate>‘ | head -n 10<br /> 仔细阅读近期的新闻,特别是那些带有<br /> [Warning]<br /> 或<br /> [Important]<br /> 标志的。如果新闻提到需要手动干预(例如,需要删除某个旧包,或者需要合并某个目录),请务必按照指示操作。<br /> 步骤二:检查 Pacman 配置<br /> pacman<br /> 的配置文件位于<br /> /etc/pacman.conf<br /> 。确保你的配置是合理的。<br /> # 编辑 pacman.conf<br /> sudo nano /etc/pacman.conf<br /> 一个推荐的配置是启用<br /> [community]<br /> 和<br /> [multilib]<br /> (如果你需要 32 位库支持)。<br /> # 在 [options] 部分,建议取消注释 Color 和 TotalDownload<br /> Color<br /> # 可以考虑启用 VerbosePkgLists 以便在出错时更容易排查<br /> VerbosePkgLists</p> <p># 确保以下仓库是启用的(取消前面的 # 号)<br /> [core]<br /> Include = /etc/pacman.d/mirrorlist</p> <p>[extra]<br /> Include = /etc/pacman.d/mirrorlist</p> <p>[community]<br /> Include = /etc/pacman.d/mirrorlist</p> <p># 如果你需要 32 位软件支持(如 Steam, Wine),启用 multilib<br /> [multilib]<br /> Include = /etc/pacman.d/mirrorlist<br /> 步骤三:更新镜像源<br /> 使用<br /> reflector<br /> 工具自动选择最快的镜像源,这能显著提升下载速度。<br /> # 安装 reflector<br /> sudo pacman -S reflector</p> <p># 备份旧的 mirrorlist<br /> sudo cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.bak</p> <p># 使用 reflector 获取最新的、速度最快的 20 个加拿大镜像,并写入文件<br /> # 你可以根据地理位置替换 ‘Canada’ 为 ‘China’ 或其他地区<br /> sudo reflector –country Canada –age 12 –protocol https –sort rate –save /etc/pacman.d/mirrorlist<br /> 2. 执行系统更新:Pacman 的艺术<br /> 一切准备就绪后,就可以开始更新了。<br /> 基础更新命令<br /> sudo pacman -Syu<br /> -S<br /> : Sync,同步软件包。<br /> -y<br /> : Refresh,从服务器刷新软件包数据库。<br /> -u<br /> : Upgrade,升级所有过期的软件包。<br /> 这是一个“原子级”的操作,<br /> pacman<br /> 会计算出所有需要更新的包,并一次性下载和安装。如果中途网络中断或出错,它会回滚,不会留下一个半成品的系统。<br /> 处理 AUR 包的更新<br /> 如果你使用了 AUR 助手(如<br /> yay<br /> 或<br /> paru<br /> ),更新 AUR 包同样简单。<br /> # 使用 yay 更新系统和 AUR 包<br /> yay -Syu</p> <p># 或者使用 paru<br /> paru -Syu<br /> 这些工具会先调用<br /> pacman<br /> 更新官方包,然后自动检查并构建 AUR 中需要更新的包。<br /> 处理复杂的更新:当 Pacman 提示冲突时<br /> 有时,更新会遇到文件冲突。例如,某个库文件被移动到了另一个包中。<br /> pacman<br /> 会提示错误并中止更新。这时,你需要仔细阅读错误信息。<br /> 示例场景:<br /> 假设<br /> libfoo<br /> 被拆分成了<br /> libfoo<br /> 和<br /> libfoo-dev<br /> ,而你正在更新。<br /> pacman<br /> 可能会报错:<br /> error: failed to commit transaction (conflicting files)<br /> libfoo: /usr/lib/libfoo.so exists in filesystem<br /> 解决方案:<br /> 你需要判断这个文件是否属于你手动安装的其他软件。如果不确定,可以查询文件属于哪个包:<br /> # 查询文件属于哪个已安装的包<br /> pacman -Qo /usr/lib/libfoo.so<br /> 如果它确实属于旧的<br /> libfoo<br /> 包,而新版本中该文件已被移除或移动,你可以强制更新(<br /> 谨慎使用<br /> ):<br /> # 强制覆盖文件<br /> sudo pacman -Syu –overwrite /usr/lib/libfoo.so<br /> 强烈建议<br /> :在使用<br /> –overwrite<br /> 之前,务必阅读 Arch News 确认这是官方推荐的操作。<br /> 3. 升级后的清理与维护<br /> 更新完成后,进行一些简单的清理工作,可以让系统保持整洁。<br /> 清理软件包缓存<br /> pacman<br /> 会将下载的软件包(<br /> .pkg.tar.zst<br /> )保留在<br /> /var/cache/pacman/pkg/<br /> 目录中。随着时间推移,这会占用大量空间。<br /> # 清理所有未安装的软件包缓存<br /> sudo pacman -Sc</p> <p># 清理所有缓存(包括已安装的,慎用,因为这会删除回滚能力)<br /> sudo pacman -Scc<br /> 通常,保留最近几个版本的缓存是明智的,以便在需要时可以降级。你可以使用<br /> paccache<br /> 工具(来自<br /> pacman-contrib<br /> 包)来精细管理:<br /> # 安装 pacman-contrib<br /> sudo pacman -S pacman-contrib</p> <p># 保留最近 2 个版本的包,清理其他<br /> sudo paccache -r</p> <p># 也可以设置定时任务来自动清理<br /> 检查孤儿包(Orphaned Packages)<br /> 这些是作为依赖安装,但现在不再被任何包需要的软件。定期清理它们可以减少系统冗余。<br /> # 列出所有孤儿包<br /> pacman -Qdt</p> <p># 自动删除所有孤儿包<br /> sudo pacman -Rns $(pacman -Qdtq)<br /> 如果<br /> pacman -Qdtq<br /> 命令没有输出,说明没有孤儿包。<br /> 应对升级中的“意外”:常见问题与解决方案<br /> 即使你遵循了所有最佳实践,偶尔还是会遇到问题。以下是一些常见场景及其解决方案。<br /> 场景一:内核更新后,ZFS 或 NVIDIA 驱动无法加载<br /> 这是最常见的问题之一。因为 DKMS(Dynamic Kernel Module Support)需要在内核更新后重新编译模块。<br /> 解决方案:<br /> 安装 DKMS 版本的驱动<br /> :<br /> 对于 NVIDIA:安装<br /> nvidia-dkms<br /> 而不是<br /> nvidia<br /> 。<br /> 对于 ZFS:安装<br /> zfs-dkms<br /> 。<br /> 确保安装了内核头文件<br /> :DKMS 编译需要头文件。<br /> # 假设你使用 linux 内核<br /> sudo pacman -S linux-headers linux-lts-headers # 如果你同时使用 LTS 内核<br /> 手动触发 DKMS 编译<br /> (通常 Pacman 会自动处理,但有时需要手动):<br /> # 查看 DKMS 状态<br /> sudo dkms status</p> <p># 强制重新编译某个模块(例如 nvidia)<br /> sudo dkms install nvidia/550.67 -k $(uname -r) # 替换为你的版本号<br /> 场景二:系统无法启动(Grub 错误或 Initramfs 错误)<br /> 这通常发生在内核或引导加载器更新后。<br /> 解决方案:<br /> 使用 Arch Linux 安装 USB 驱动器进行救援。<br /> 从 USB 启动,进入 Live 环境。<br /> 挂载你的根分区和引导分区:<br /> # 假设根分区在 /dev/sda2,引导在 /dev/sda1<br /> mount /dev/sda2 /mnt<br /> mount /dev/sda1 /mnt/boot<br /> # 如果使用 EFI,可能需要挂载 /mnt/boot/efi<br /> chroot<br /> 进入你的系统:<br /> arch-chroot /mnt<br /> 在 chroot 环境中,你可以重新安装内核、重建 initramfs 或修复 Grub:<br /> # 重新安装内核<br /> pacman -S linux</p> <p># 重建 initramfs<br /> mkinitcpio -P</p> <p># 修复 Grub (假设已安装 grub)<br /> grub-install /dev/sda<br /> grub-mkconfig -o /boot/grub/grub.cfg<br /> 退出 chroot 并重启。<br /> 场景三:数据库锁定<br /> 如果你在更新过程中强行终止了<br /> pacman<br /> ,可能会留下一个锁文件,导致后续无法运行<br /> pacman<br /> 。<br /> # 错误提示:error: unable to lock database<br /> 解决方案:<br /> # 删除锁文件<br /> sudo rm /var/lib/pacman/db.lck<br /> 注意<br /> :在删除锁文件之前,请确保没有其他<br /> pacman<br /> 进程在后台运行(使用<br /> ps aux | grep pacman<br /> 检查)。<br /> 高级技巧:让 Arch Linux 升级更智能<br /> 对于高级用户,可以进一步定制升级体验。<br /> 1. 使用 Pacman Hooks 自动化任务<br /> 你可以创建 Pacman Hooks 在特定软件包更新前后自动执行脚本。<br /> 例如,每次更新<br /> linux<br /> 内核后,自动重新生成<br /> initramfs<br /> (虽然 Pacman 通常会自动处理,但这是一个很好的例子)。<br /> 创建文件<br /> /etc/pacman.d/hooks/95-initramfs.hook<br /> :<br /> [Trigger]<br /> Operation = Upgrade<br /> Type = Package<br /> Target = linux</p> <p>[Action]<br /> Description = Re-generating initramfs…<br /> When = PostTransaction<br /> Exec = /usr/bin/mkinitcpio -P<br /> 2. 使用 Snapper 或 Timeshift 进行系统快照<br /> 这是最强大的“后悔药”。在执行更新前,创建一个系统快照。如果更新失败或导致系统不可用,可以立即恢复到更新前的状态。<br /> 使用 Btrfs 和 Snapper<br /> :<br /> 如果你的根文件系统是 Btrfs,可以使用<br /> snapper<br /> 。<br /> # 安装 snapper<br /> sudo pacman -S snapper<br /> sudo umount /.snapshots<br /> sudo snapper -c root create-config /<br /> sudo mount /.snapshots</p> <p># 在更新前创建快照<br /> sudo snapper create –description “pre-upgrade”</p> <p># 如果更新出问题,恢复快照<br /> sudo snapper rollback <snapshot_number><br /> 使用 Timeshift<br /> :<br /> Timeshift 是一个图形化工具,支持 Btrfs 和 Rsync。<br /> # 安装 Timeshift<br /> sudo pacman -S timeshift<br /> 在更新前,打开 Timeshift 创建一个快照。出问题时,从 Live USB 启动,安装 Timeshift 并恢复。<br /> 结论:拥抱滚动更新,享受持续进化的乐趣<br /> Arch Linux 的滚动更新模式,本质上是一种对用户的信任和赋权。它将系统的控制权完全交给了用户,同时也要求用户承担起维护的责任。这并非意味着 Arch 不稳定,相反,一个遵循良好实践、定期维护的 Arch 系统,其稳定性可以与任何企业级发行版相媲美。<br /> 通过理解滚动更新的原理,养成阅读公告的习惯,掌握<br /> pacman<br /> 的强大功能,并利用快照工具作为后盾,你将不再畏惧系统升级。相反,你会享受那种指尖轻敲几下,系统就焕然一新、紧跟技术前沿的快感。<br /> 所以,如果你还在为系统升级而烦恼,不妨尝试一下 Arch Linux。它可能需要你投入一些学习时间,但回报你的,将是一个永不落伍、完全属于你自己的 Linux 系统。</p> </div> <div class="wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained" style="margin-top:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--50)"> <div class="wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained"> <div style="height:var(--wp--preset--spacing--40)" aria-hidden="true" class="wp-block-spacer"> </div> <hr class="wp-block-separator has-text-color has-contrast-3-color has-alpha-channel-opacity has-contrast-3-background-color has-background is-style-wide" style="margin-bottom:var(--wp--preset--spacing--40)"/> <nav class="wp-block-group is-content-justification-space-between is-nowrap is-layout-flex wp-container-core-group-is-layout-2b923ac6 wp-block-group-is-layout-flex" style="padding-top:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--40)" aria-label="Posts"> <div class="post-navigation-link-previous wp-block-post-navigation-link"><span class="wp-block-post-navigation-link__arrow-previous is-arrow-arrow" aria-hidden="true">←</span><a href="https://ziliao.tiaomu.com/102435111/" rel="prev"><span class="post-navigation-link__label">Previous: </span> <span class="post-navigation-link__title">揭秘17年家享版:参数解析与实际应用对比</span></a></div> <div class="post-navigation-link-next wp-block-post-navigation-link"><a href="https://ziliao.tiaomu.com/102435113/" rel="next"><span class="post-navigation-link__label">Next: </span> <span class="post-navigation-link__title">Linux系统下如何轻松访问和管理盘符?解锁高效文件操作技巧</span></a><span class="wp-block-post-navigation-link__arrow-next is-arrow-arrow" aria-hidden="true">→</span></div> </nav> </div> </div> </main> <footer class="wp-block-template-part"> <div class="wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained" style="padding-top:var(--wp--preset--spacing--50);padding-bottom:var(--wp--preset--spacing--50)"> <div class="wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-3a88641f wp-block-columns-is-layout-flex"> <div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:30%"> <div class="wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-831b2db5 wp-block-group-is-layout-flex"> <p class="wp-block-site-title has-medium-font-size"><a href="https://ziliao.tiaomu.com" target="_self" rel="home">资料库 – 中文知识库</a></p> </div> </div> <div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:20%"> </div> <div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:50%"> <div class="wp-block-group is-content-justification-space-between is-layout-flex wp-container-core-group-is-layout-cf54d0a6 wp-block-group-is-layout-flex"> <div class="wp-block-group is-vertical is-content-justification-stretch is-layout-flex wp-container-core-group-is-layout-d8dce8eb wp-block-group-is-layout-flex"> <h2 class="wp-block-heading has-medium-font-size has-body-font-family" style="font-style:normal;font-weight:600">About</h2> <div class="wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-bce0c455 wp-block-group-is-layout-flex"> <nav style="font-style:normal;font-weight:400" class="has-small-font-size is-vertical wp-block-navigation is-layout-flex wp-container-core-navigation-is-layout-bce0c455 wp-block-navigation-is-layout-flex" aria-label="About"><ul style="font-style:normal;font-weight:400" class="wp-block-navigation__container has-small-font-size is-vertical wp-block-navigation" aria-label="About"><li class="wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="#"><span class="wp-block-navigation-item__label">Team</span></a></li><li class="wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="#"><span class="wp-block-navigation-item__label">History</span></a></li><li class="wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="#"><span class="wp-block-navigation-item__label">Careers</span></a></li></ul></nav> </div> </div> <div class="wp-block-group is-vertical is-content-justification-stretch is-layout-flex wp-container-core-group-is-layout-d8dce8eb wp-block-group-is-layout-flex"> <h2 class="wp-block-heading has-medium-font-size has-body-font-family" style="font-style:normal;font-weight:600">Privacy</h2> <div class="wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-bce0c455 wp-block-group-is-layout-flex"> <nav style="font-style:normal;font-weight:400" class="has-small-font-size is-vertical wp-block-navigation is-layout-flex wp-container-core-navigation-is-layout-bce0c455 wp-block-navigation-is-layout-flex" aria-label="Privacy"><ul style="font-style:normal;font-weight:400" class="wp-block-navigation__container has-small-font-size is-vertical wp-block-navigation" aria-label="Privacy"><li class="wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="#"><span class="wp-block-navigation-item__label">Privacy Policy</span></a></li><li class="wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="#"><span class="wp-block-navigation-item__label">Terms and Conditions</span></a></li><li class="wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="#"><span class="wp-block-navigation-item__label">Contact Us</span></a></li></ul></nav> </div> </div> <div class="wp-block-group is-vertical is-content-justification-stretch is-layout-flex wp-container-core-group-is-layout-d8dce8eb wp-block-group-is-layout-flex"> <h2 class="wp-block-heading has-medium-font-size has-body-font-family" style="font-style:normal;font-weight:600">Social</h2> <div class="wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-bce0c455 wp-block-group-is-layout-flex"> <nav style="font-style:normal;font-weight:400" class="has-small-font-size is-vertical wp-block-navigation is-layout-flex wp-container-core-navigation-is-layout-bce0c455 wp-block-navigation-is-layout-flex" aria-label="Social Media"><ul style="font-style:normal;font-weight:400" class="wp-block-navigation__container has-small-font-size is-vertical wp-block-navigation" aria-label="Social Media"><li class="wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="#"><span class="wp-block-navigation-item__label">Facebook</span></a></li><li class="wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="#"><span class="wp-block-navigation-item__label">Instagram</span></a></li><li class="wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="#"><span class="wp-block-navigation-item__label">Twitter/X</span></a></li></ul></nav> </div> </div> </div> </div> </div> <div class="wp-block-group alignwide is-layout-flow wp-block-group-is-layout-flow" style="padding-top:var(--wp--preset--spacing--50);padding-bottom:0"> <p class="has-contrast-2-color has-text-color has-link-color has-small-font-size wp-elements-1 wp-block-paragraph"> Designed with <a href="https://wordpress.org" rel="nofollow">WordPress</a> </p> </div> </div> </footer> </div> <script type="speculationrules"> {"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/twentytwentyfour/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]} </script> <script data-wp-router-options="{"loadOnClientNavigation":true}" fetchpriority="low" id="@wordpress/block-library/navigation/view-js-module" src="https://ziliao.tiaomu.com/wp-includes/js/dist/script-modules/block-library/navigation/view.min.js?ver=1bf28ded04f9f188bdcb" type="module"></script> <script id="wp-emoji-settings" type="application/json"> {"baseUrl":"https://s.w.org/images/core/emoji/17.0.2/72x72/","ext":".png","svgUrl":"https://s.w.org/images/core/emoji/17.0.2/svg/","svgExt":".svg","source":{"concatemoji":"https://ziliao.tiaomu.com/wp-includes/js/wp-emoji-release.min.js?ver=7.1.3"}} </script> <script type="module"> /*! This file is auto-generated */ var e="script#wp-emoji-settings",t=document.querySelector(e);if(!(t instanceof HTMLScriptElement))throw new Error("Element missing: "+e);const r=JSON.parse(t.text),s=(window._wpemojiSettings=r,"wpEmojiSettingsSupports"),o=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(s,JSON.stringify(t))}catch(e){}}function c(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0);const r=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===r[t])}function p(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var n=e.getImageData(16,16,1,1);for(let e=0;e<n.data.length;e++)if(0!==n.data[e])return!1;return!0}function u(e,t,n,r){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\udde8\ud83c\uddf6","\ud83c\udde8\u200b\ud83c\uddf6")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!r(e,"\ud83e\u1fac8")}return!1}function f(e,t,n,r){let a;const s=(a="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):document.createElement("canvas")).getContext("2d",{willReadFrequently:!0}),o=(s.textBaseline="top",s.font="600 32px Arial",{});return e.forEach(e=>{o[e]=t(s,e,n,r)}),o}function a(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}r.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(s));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(o),u.toString(),c.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"});const a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=e=>{i(n=e.data),a.terminate(),t(n)})}catch(e){}i(n=f(o,u,c,p))}t(n)}).then(e=>{for(const n in e)r.supports[n]=e[n],r.supports.everything=r.supports.everything&&r.supports[n],"flag"!==n&&(r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&r.supports[n]);var t;r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&!r.supports.flag,r.supports.everything||((t=r.source||{}).concatemoji?a(t.concatemoji):t.wpemoji&&t.twemoji&&(a(t.twemoji),a(t.wpemoji)))}); //# sourceURL=https://ziliao.tiaomu.com/wp-includes/js/wp-emoji-loader.min.js </script> <noscript><link rel="stylesheet" href="https://ziliao.tiaomu.com/wp-content/themes/abiz/assets/css/all.min.css?ver=6.5.1"></noscript> </body> </html>