简介:这份资源是面向Linux 64位系统的Chrome浏览器离线安装包,适合需要在无网络或内网环境中部署浏览器的开发者与运维人员。压缩包共132个文件,约143.36MB,以58个pak资源包、55个info说明文件为主,另含3个so共享库、chrome主程序、chrome-wrapper启动脚本、chrome_sandbox沙箱组件及icudtl.dat等核心数据文件,覆盖运行所需的可执行文件、库文件与配置资源。版本号为124.0.6318.0,属于稳定分支构建,已整合此前更新与修复,可提供高速、安全的网页浏览体验。目前已有633人学习下载。解压后可直接获取完整可运行目录,便于快速完成本地部署、版本固定与兼容性验证;若需自动化测试,可另行搭配对应版本的chromedriver使用。
1. chrome-linux64.zip 到底是什么:从文件名拆出三条落地路线
拿到chrome-linux64.zip这个文件名,第一反应不该是「这不就是个压缩包」,而是先判断它属于哪条路线。Chrome 在 Linux 上的分发形态不止一种:官方.deb/.rpm安装包、google-chrome-stable_current_amd64.deb,以及被大量自动化脚本使用的chrome-linux64.zip免安装压缩包。后者解压即用,不写系统包管理器,适合放进 CI 流水线、容器镜像、无 root 权限的测试机,或者做浏览器版本锁定。热搜里「chrome 109」「chrome 144」「chrome 各版本安卓版」这些词说明一件事:很多人真正要的不是「装个浏览器」,而是「拿到一个可复现、可指定版本、可脚本化调用的 Chrome 二进制」。这篇就按这个诉求走,把chrome-linux64.zip从解压、依赖补齐、无头启动、版本锁定到踩坑排查讲透,适合做爬虫、自动化测试、前端 CI、Electron 打包验证的工程师照着复现。
2. 解压之后先别急着跑:目录结构与依赖补齐
2.1 chrome-linux64.zip 解压后的真实目录长什么样
把 zip 解开,常见结构是顶层一个chrome-linux64/目录,里面包含chrome可执行文件、chrome_crashpad_handler、chrome_sandbox、libEGL.so、libGLESv2.so、resources.pak、icudtl.dat、locales/等。很多人解压完直接./chrome,然后报一堆.so找不到,就以为包坏了。其实这是免安装包的通病:它假设系统里已经有基础运行库。
先做一次结构确认:
unzip chrome-linux64.zip -d /opt/chrome cd /opt/chrome/chrome-linux64 ls -lh chrome chrome_sandbox libEGL.so libGLESv2.so icudtl.dat file chromefile chrome应该输出 ELF 64-bit LSB executable, x86-64。如果输出的是 32 位或者 ARM,说明你下错了架构包。chrome_sandbox是沙箱辅助程序,后面无头模式要用到。
2.2 用 ldd 把缺失依赖一次性揪出来
免安装包最怕的就是「能解压、不能启动」。用ldd直接看动态链接情况:
ldd ./chrome | grep "not found"典型缺失项集中在这些库:libnss3、libatk-1.0、libatk-bridge-2.0、libcups、libdrm、libxkbcommon、libxcomposite、libxdamage、libxrandr、libgbm、libasound2、libpango、libcairo。Debian/Ubuntu 系一条命令补齐:
apt-get update && apt-get install -y \ libnss3 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 \ libxkbcommon0 libxcomposite1 libxdamage1 libxrandr2 libgbm1 \ libasound2 libpango-1.0-0 libcairo2 libxshmfence1CentOS/RHEL 系把包名换成nss atk at-spi2-atk cups-libs libdrm libxkbcommon libXcomposite libXdamage libXrandr mesa-libgbm alsa-lib pango cairo libxshmfence。装完再跑一次ldd ./chrome | grep "not found",输出为空才算干净。
提示:容器里跑的话,基础镜像建议用
debian:bookworm-slim或ubuntu:22.04,别用 alpine。alpine 的 musl libc 和 Chrome 的 glibc 二进制不兼容,补依赖会补到怀疑人生。
2.3 权限与沙箱:两个必须处理的启动前置
解压出来的chrome_sandbox默认没有 setuid 位,直接跑会提示 sandbox 相关错误。两种处理方式,按场景选:
# 方式一:给 chrome_sandbox 加 setuid(需要 root) chown root:root chrome_sandbox chmod 4755 chrome_sandbox # 方式二:启动时禁用沙箱(容器/CI 常用,但安全性下降) ./chrome --no-sandbox --headless=new --disable-gpu方式一适合长期驻留的测试机,方式二适合一次性 CI 任务。注意--no-sandbox不是万能药,它只是绕过沙箱检查,如果还报Failed to move to new namespace,那是内核unprivileged_userns_clone被关了,得从宿主机层面处理,不是 zip 包的问题。
2.4 验证启动:一条命令确认二进制可用
依赖补齐、权限处理完,用无头模式做最小验证:
./chrome --headless=new --no-sandbox --disable-gpu \ --dump-dom https://example.com 2>/dev/null | head -20能输出 HTML 就说明二进制、依赖、沙箱三关都过了。如果卡住不动,加--virtual-time-budget=5000给它一个时间上限。这一步过了,后面接 Puppeteer、Selenium、Playwright 才有意义。
3. 把 chrome-linux64.zip 接进自动化:版本锁定与调用姿势
3.1 为什么不用系统包管理器,而用 zip 包做版本锁定
热搜里「chrome 更新不了 .exe」「chrome 109」「chrome 144」这些词背后是同一个痛点:浏览器自动更新会打破自动化脚本的稳定性。今天跑得好好的选择器,明天 Chrome 升了个大版本,行为就变了。用chrome-linux64.zip的核心价值就是版本可控——你下载的是哪个版本的 zip,解压出来就是哪个版本,不会半夜自动升级。
常见做法是在项目里维护一个chrome-version.txt,记录当前锁定的版本号,CI 脚本按这个版本号去取对应的 zip 包。这样本地、测试、生产三套环境的浏览器行为一致,排查问题时少一个变量。
3.2 用环境变量把 Chrome 路径喂给自动化框架
Puppeteer 和 Playwright 都支持指定executablePath。以 Puppeteer 为例:
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch({ executablePath: '/opt/chrome/chrome-linux64/chrome', headless: 'new', args: [ '--no-sandbox', '--disable-gpu', '--disable-dev-shm-usage', // 容器内 /dev/shm 太小必加 '--window-size=1920,1080' ] }); const page = await browser.newPage(); await page.goto('https://example.com', { waitUntil: 'networkidle2' }); console.log(await page.title()); await browser.close(); })();executablePath指向解压出来的chrome文件。--disable-dev-shm-usage是容器场景的血泪经验:Docker 默认/dev/shm只有 64MB,Chrome 渲染大页面时会崩,加这个参数让它改用/tmp。headless: 'new'对应 Chrome 112 之后的 new headless 模式,老版本用true。
3.3 用 shell 脚本做可复现的安装流程
把下载、解压、补依赖、验证串成一个脚本,新人 clone 下来跑一遍就能用:
#!/bin/bash set -euo pipefail CHROME_VERSION="${CHROME_VERSION:-144.0.7559.0}" INSTALL_DIR="/opt/chrome" ZIP_URL="https://storage.example.com/chrome-linux64-${CHROME_VERSION}.zip" mkdir -p "$INSTALL_DIR" curl -fsSL "$ZIP_URL" -o /tmp/chrome-linux64.zip unzip -oq /tmp/chrome-linux64.zip -d "$INSTALL_DIR" chmod +x "$INSTALL_DIR/chrome-linux64/chrome" # 补依赖 apt-get update && apt-get install -y --no-install-recommends \ libnss3 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 \ libxkbcommon0 libxcomposite1 libxdamage1 libxrandr2 libgbm1 \ libasound2 libpango-1.0-0 libcairo2 libxshmfence1 # 验证 "$INSTALL_DIR/chrome-linux64/chrome" --headless=new --no-sandbox \ --disable-gpu --dump-dom about:blank > /dev/null && echo "Chrome OK"CHROME_VERSION用环境变量传入,方便 CI 矩阵测试多个版本。set -euo pipefail保证任何一步失败就停,不会带着半成品继续跑。--no-install-recommends减少镜像体积。
3.4 版本与参数对照表
| 参数 | 适用场景 | 注意事项 |
|---|---|---|
--headless=new | Chrome 112+ | 老版本用--headless |
--no-sandbox | 容器/CI | 安全性下降,仅限可信环境 |
--disable-dev-shm-usage | Docker | /dev/shm小于 256MB 时必加 |
--disable-gpu | 无显卡服务器 | 有 GPU 且需渲染时可去掉 |
--remote-debugging-port=9222 | 调试/CDP 接入 | 注意端口不要暴露公网 |
--user-data-dir=/tmp/profile | 多实例隔离 | 不指定会复用默认 profile 导致冲突 |
这张表建议直接抄进项目 README,省得每次有人问「为什么我本地能跑 CI 跑不了」。
4. 避坑与排查:chrome-linux64.zip 落地时最容易翻车的五件事
4.1 现象:解压后执行 chrome 报error while loading shared libraries: libnss3.so
原因:免安装包不携带系统级依赖,libnss3等库需要宿主机提供。很多人以为 zip 里什么都有,其实它只带 Chrome 自己的.so。
解决:按 2.2 节的ldd流程补齐。补完再ldd确认无not found。如果补了还报,检查是不是装到了非标准路径,用ldconfig -p | grep libnss3确认动态链接器能找到。
4.2 现象:容器里启动几秒后进程被杀,日志显示Out of memory或直接 SIGKILL
原因:Docker 默认/dev/shm只有 64MB,Chrome 渲染时往共享内存写数据,写满就被 OOM killer 干掉。
解决:启动参数加--disable-dev-shm-usage,或者docker run --shm-size=1g。前者改 Chrome 行为,后者改容器配置,两个都做最稳。这个坑在热搜「chrome 视频卡顿」场景里也常见,本质是同一类资源限制问题。
4.3 现象:--no-sandbox加了还是报Failed to move to new namespace: Operation not permitted
原因:不是 Chrome 的问题,是宿主机内核参数kernel.unprivileged_userns_clone被设为 0,或者容器没有CAP_SYS_ADMIN。
解决:宿主机执行sysctl -w kernel.unprivileged_userns_clone=1,或者容器启动时加--cap-add=SYS_ADMIN。如果安全策略不允许,那就只能接受--no-sandbox并确保运行环境隔离。
4.4 现象:多个 Chrome 实例互相干扰,cookie 串了、标签页莫名关闭
原因:没有指定独立的--user-data-dir,多个实例共用默认 profile 目录,互相踩踏。
解决:每个实例分配独立目录,比如--user-data-dir=/tmp/chrome-profile-$(date +%s)。跑完记得清理,否则磁盘会被 profile 数据撑满。热搜里「chrome 标签页分组怎么隐藏」这类问题,很多也是 profile 状态混乱导致的表象。
4.5 现象:--dump-dom输出为空或卡住不返回
原因:页面有重定向、JS 渲染、或者网络请求一直不结束,Chrome 在等load事件。
解决:加--virtual-time-budget=5000给一个虚拟时间上限,或者改用 CDP 协议通过Page.navigate+Page.loadEventFired精确控制。--dump-dom只适合静态页面快速验证,复杂页面别用它做断言。
5. 进阶:把 chrome-linux64.zip 做成可复用的浏览器运行时
5.1 用 CDP 直连替代框架封装
Puppeteer/Playwright 方便,但版本升级会带来 API 变动。如果只想稳定跑,可以直接用 Chrome DevTools Protocol。启动时加--remote-debugging-port=9222,然后用 HTTP + WebSocket 调用:
./chrome --headless=new --no-sandbox --disable-gpu \ --remote-debugging-port=9222 \ --user-data-dir=/tmp/chrome-cdp about:blank & # 获取 WebSocket 调试地址 curl -s http://127.0.0.1:9222/json/version | python3 -m json.tool拿到webSocketDebuggerUrl后,用任意 WebSocket 客户端发Page.navigate、Runtime.evaluate等命令。这种方式的好处是:Chrome 版本换了,只要 CDP 协议没变,你的调用代码就不用动。适合对稳定性要求高、不想被框架绑架的场景。
5.2 版本升级的验证清单
锁定版本不代表永远不升。升级chrome-linux64.zip时,按这个清单过一遍:
| 检查项 | 命令/方法 | 通过标准 |
|---|---|---|
| 二进制可执行 | ./chrome --version | 输出版本号 |
| 依赖完整 | ldd ./chrome | grep "not found" | 无输出 |
| 无头渲染 | --dump-dom about:blank | 输出 HTML |
| 目标页面 | 跑一遍核心业务脚本 | 断言全过 |
| 内存占用 | ps -o rss= -p <pid> | 与旧版差异在 20% 内 |
| 启动耗时 | time ./chrome --headless=new ... | 与旧版差异在 30% 内 |
这张表是我自己升级时必走的,少一步都可能在生产上翻车。尤其是内存和启动耗时,新版本有时会悄悄变重,不测不知道。
5.3 一个我踩过的坑:别把 zip 包提交进 Git
早期图省事,把chrome-linux64.zip直接 commit 进仓库,结果仓库体积暴涨,clone 一次几分钟。后来改成 CI 阶段按版本号下载,仓库里只留一个chrome-version.txt和下载脚本。这个习惯帮我省了大量时间,也避免了「本地有包、CI 没包」的不一致。
如果你也在做浏览器自动化,建议从第一天就把 Chrome 当成外部依赖管理,而不是塞进代码仓库。版本号写清楚,下载脚本写清楚,验证步骤写清楚,后面换人维护时能少很多玄学问题。希望帮到你。
本文还有配套的精品资源,点击获取