简介:chrome-linux64.zip 是面向 Linux 64 位系统的 Chrome 浏览器离线安装包,适合需要在无网络或内网环境中部署浏览器的开发者与运维人员。压缩包共 132 个文件,约 143.36MB,以 58 个 pak 本地化资源、55 个 info 说明文件、3 个 so 共享库为主,另含 chrome 主程序、chrome-wrapper 启动脚本、chrome_sandbox 沙箱组件、chrome_crashpad_handler 崩溃处理程序及 icudtl.dat 等核心数据文件,覆盖运行所需的可执行文件、依赖库与配置资源。该版本为 124.0.6318.0 稳定分支构建,已包含此前版本的更新与修复,解压后按 Linux 常规方式配置即可使用,无需联网下载。目前已有 633 人学习下载,适合希望快速获取完整离线安装包、了解 Chrome 目录结构与组件构成的读者参考。
1. chrome-linux64.zip 到底是什么:从解压到跑起来的完整链路
chrome-linux64.zip这个文件名,在 Linux 服务器、CI 流水线、容器镜像构建里出现的频率远比想象中高。它通常指代一份免安装的 Chrome 浏览器 Linux 64 位压缩包,解压后直接得到可执行文件,不需要apt install或yum install,也不需要 root 权限。对做自动化测试、网页截图、PDF 导出、爬虫渲染的人来说,这个包解决的核心问题是:在一台没有桌面环境、没有包管理权限的机器上,把浏览器跑起来。
热搜里chrome 109、chrome 144、chrome 各版本安卓版这些词说明一件事——版本选择本身就是个高频痛点。Linux 64 位包不像 Windows 有稳定的在线安装器,很多时候你得手动挑一个版本、下载 zip、解压、补依赖、再验证。整条链路里任何一环出问题,表现都是「命令敲下去没反应」或者「报一堆 .so 找不到」,新手很容易卡在第一步。
这篇内容面向三类人:需要在 Linux 上跑无头 Chrome 的后端/测试工程师、要把它塞进 Docker 镜像的运维、以及想用脚本批量做网页渲染的开发者。下面按「包怎么来 → 怎么解压 → 依赖怎么补 → 怎么验证 → 坑在哪」的顺序讲透,每一步都给可复制的命令和参数说明。
2. 拿到 chrome-linux64.zip 后的解压与目录结构确认
2.1 解压前先确认包完整性
拿到 zip 之后别急着unzip,先看一眼文件大小和校验值。Linux 64 位 Chrome 的完整包通常在 150MB 到 250MB 之间,具体取决于版本。如果只有几 MB,大概率是下载中断或者拿到的是个占位文件。热搜里导入资源包失败 caused by: invalid zip archive: could not find eocd这个报错,本质就是 zip 尾部中央目录记录缺失,文件没下完。
# 查看文件大小和类型,确认不是空壳或 HTML 错误页 ls -lh chrome-linux64.zip file chrome-linux64.zip # 计算 sha256,和来源页提供的值比对(如果有) sha256sum chrome-linux64.zip # 测试 zip 结构是否完整,不实际解压 unzip -t chrome-linux64.zipunzip -t会逐个校验压缩条目,最后输出No errors detected才算完整。如果这一步就报End-of-central-directory signature not found,直接重新下载,别浪费时间尝试修复。
2.2 解压命令与目录布局
# 解压到指定目录,-d 指定目标,-q 安静模式减少输出 unzip -q chrome-linux64.zip -d /opt/chrome-linux64 # 进入目录看结构 cd /opt/chrome-linux64 ls -la解压后典型结构是这样的:
| 路径 | 作用 |
|---|---|
chrome | 主可执行文件,无头模式入口 |
chrome_crashpad_handler | 崩溃收集进程,容器里常需要禁用 |
chrome_sandbox | 沙箱辅助程序,需要 setuid 权限 |
libEGL.so/libGLESv2.so | 图形库,无头模式也依赖 |
resources.pak/chrome_100_percent.pak | 界面资源包 |
locales/ | 多语言资源,可只保留en-US.pak减小体积 |
swiftshader/ | 软件渲染后端,无 GPU 时的兜底 |
chrome这个文件必须是可执行权限。有些解压工具会丢掉权限位,导致Permission denied。
# 补上可执行权限 chmod +x /opt/chrome-linux64/chrome chmod +x /opt/chrome-linux64/chrome_crashpad_handler chmod +x /opt/chrome-linux64/chrome_sandbox提示:
chrome_sandbox需要 root 执行chown root:root并chmod 4755才能启用沙箱。容器里通常直接用--no-sandbox绕过,但生产环境要权衡安全。
2.3 版本号怎么确认
解压完先跑一下版本,确认这个包能执行、版本符合预期。热搜里chrome 109和chrome 144跨度很大,不同版本对无头模式参数的支持有差异,比如--headless=new是较新版本才稳定的写法。
# 直接查版本,不需要图形环境 /opt/chrome-linux64/chrome --version # 预期输出类似:Google Chrome 120.0.6099.109如果这一步报error while loading shared libraries,说明系统缺依赖,进入下一章处理。如果报cannot execute binary file,检查系统架构是不是 x86_64,uname -m确认一下。
3. 补齐 Linux 依赖:让 chrome 二进制真正跑起来
3.1 用 ldd 定位缺失的动态库
chrome是个动态链接的二进制,依赖一堆系统库。最直接的排查方式是用ldd列出所有依赖,看哪些是not found。
# 列出 chrome 的动态库依赖,过滤出缺失项 ldd /opt/chrome-linux64/chrome | grep "not found"常见缺失项集中在几类:字体渲染(libfontconfig、libfreetype)、图形(libGL、libEGL)、音频(libasound)、以及 NSS 加密库(libnss3、libnspr4)。Debian/Ubuntu 系和 RHEL/CentOS 系的包名不一样,下面分别给。
# Debian / Ubuntu 系,一次性补齐常见依赖 apt-get update && apt-get install -y \ libnss3 libnspr4 libatk1.0-0 libatk-bridge2.0-0 \ libcups2 libdrm2 libxkbcommon0 libxcomposite1 \ libxdamage1 libxfixes3 libxrandr2 libgbm1 \ libpango-1.0-0 libcairo2 libasound2 \ fonts-liberation libappindicator3-1 xdg-utils# RHEL / CentOS / Rocky 系 yum install -y \ nss nspr atk at-spi2-atk cups-libs libdrm \ libxkbcommon libXcomposite libXdamage libXfixes \ libXrandr mesa-libgbm pango cairo alsa-lib \ liberation-fonts装完再跑一次ldd | grep "not found",应该没有输出了。如果还有个别库找不到,用apt-file search 库名或yum provides */库名反查包名。
3.2 无头模式的最小依赖集
如果你只在无头模式跑,不需要音频和打印,可以砍掉一部分依赖减小镜像体积。但libnss3、libgbm1、libxkbcommon0、libatk系列这几个是硬依赖,砍不掉。热搜里chrome 播放视频 硬解和chrome 视频卡顿说明有人关心渲染性能,无头模式下视频解码依赖libgbm和 GPU 或 SwiftShader,缺了会直接崩。
# 无头模式最小验证:跑一个空白页截图 /opt/chrome-linux64/chrome \ --headless=new \ --disable-gpu \ --no-sandbox \ --screenshot=/tmp/test.png \ --window-size=1280,720 \ about:blank # 检查截图是否生成 ls -lh /tmp/test.png参数逐个说明:--headless=new是新版无头模式,比老的--headless更接近真实浏览器行为;--disable-gpu在没有 GPU 的服务器上避免初始化失败;--no-sandbox在容器里绕过沙箱权限问题;--screenshot指定输出路径;--window-size控制视口尺寸。如果这条命令能生成一张 PNG,说明基础链路通了。
3.3 字体缺失导致中文乱码
热搜里chrome favicon、chrome 标签页分组这些偏界面,但真正影响截图质量的是字体。服务器默认没装中文字体,截图里的中文会变成方块。
# 安装中文字体(Debian/Ubuntu) apt-get install -y fonts-noto-cjk fonts-wqy-zenhei # 刷新字体缓存 fc-cache -fv # 验证字体是否被识别 fc-list :lang=zh | head装完再截图,中文就能正常显示。如果不想装整套字体,也可以只放一个.ttf到/usr/share/fonts/下再fc-cache。
4. 无头模式参数调优与自动化脚本落地
4.1 常用启动参数与适用场景
无头 Chrome 的参数很多,但日常真正需要调的就这么一组。下面这张表是我在自动化截图和 PDF 导出里反复验证过的组合。
| 参数 | 作用 | 什么时候用 |
|---|---|---|
--headless=new | 新版无头模式 | 默认首选,行为接近有头 |
--no-sandbox | 关闭沙箱 | 容器/CI 环境必加 |
--disable-dev-shm-usage | 用 /tmp 代替 /dev/shm | 容器 shm 太小导致崩溃时 |
--disable-gpu | 禁用 GPU | 无显卡服务器 |
--hide-scrollbars | 隐藏滚动条 | 截图更干净 |
--force-device-scale-factor=2 | 2 倍缩放 | 高清截图 |
--virtual-time-budget=5000 | 虚拟时间预算 | 等页面 JS 执行完再截图 |
--user-data-dir=/tmp/chrome-profile | 指定用户目录 | 多实例隔离 |
--disable-dev-shm-usage这个参数值得单独说。Docker 默认/dev/shm只有 64MB,Chrome 渲染复杂页面时会写共享内存,写满就崩,报错往往是Target closed或者直接段错误。加上这个参数后改用/tmp,问题基本消失。
4.2 用 Python 封装一个可复用的截图脚本
直接敲命令行适合验证,真正落地还是得脚本化。下面这个脚本用subprocess调 Chrome,不依赖 Selenium,适合轻量场景。
import subprocess import os import tempfile CHROME = "/opt/chrome-linux64/chrome" def screenshot(url, output_path, width=1280, height=720, wait_ms=3000): """调用无头 Chrome 对指定 URL 截图""" # 每个实例用独立 profile,避免并发冲突 profile_dir = tempfile.mkdtemp(prefix="chrome-profile-") cmd = [ CHROME, "--headless=new", "--no-sandbox", "--disable-gpu", "--disable-dev-shm-usage", "--hide-scrollbars", f"--user-data-dir={profile_dir}", f"--window-size={width},{height}", f"--virtual-time-budget={wait_ms}", f"--screenshot={output_path}", url, ] # capture_output 捕获 stderr,Chrome 的日志都走 stderr result = subprocess.run(cmd, capture_output=True, timeout=60) if result.returncode != 0: raise RuntimeError(f"截图失败: {result.stderr.decode()[:500]}") return output_path if __name__ == "__main__": screenshot("https://example.com", "/tmp/example.png") print("done")逻辑说明:tempfile.mkdtemp给每个任务分配独立 profile 目录,避免多个 Chrome 实例抢同一个SingletonLock导致启动失败。--virtual-time-budget让 Chrome 在虚拟时间推进到指定毫秒后再截图,比sleep更可靠,因为它会等网络请求和 JS 执行。timeout=60是硬超时,防止某个页面卡死拖垮整个任务。capture_output=True把 stderr 收进来,出错时能看到具体原因。
参数调整建议:wait_ms对静态页 1000 够用,对 SPA 建议 5000 以上;width/height按目标设备设,移动端截图用 375x812;如果页面有懒加载图片,--virtual-time-budget可能不够,需要配合滚动脚本。
4.3 并发场景下的资源隔离
批量截图时最容易翻车的是并发。Chrome 默认会复用用户目录,多个进程同时启动会互相踢。除了上面脚本里的独立 profile,还要注意内存。每个无头 Chrome 实例大概吃 200MB 到 500MB 内存,8GB 的机器建议并发不超过 4 个。
# 用 xargs 控制并发数,-P 指定并行度 cat urls.txt | xargs -P 4 -I {} sh -c \ '/opt/chrome-linux64/chrome --headless=new --no-sandbox \ --disable-dev-shm-usage --user-data-dir=/tmp/chrome-$$ \ --screenshot=/tmp/shots/{}.png --window-size=1280,720 "{}"'-P 4控制同时跑 4 个,$$是 shell 进程号,保证每个实例 profile 不同。跑完记得清理/tmp/chrome-*,否则磁盘会被撑满。
5. 避坑与排查:chrome-linux64 落地时最容易翻车的 5 个点
5.1 现象:启动即报error while loading shared libraries: libnss3.so
原因:系统缺 NSS 库,或者装的是 32 位版本而 Chrome 需要 64 位。常见于精简版基础镜像,比如alpine默认没有 glibc 兼容层。
解决:先ldd /opt/chrome-linux64/chrome | grep nss确认路径,然后装对应架构的包。Alpine 上跑 glibc 版 Chrome 很折腾,建议直接换debian:slim或ubuntu:20.04作为基础镜像,省掉一堆兼容问题。
5.2 现象:截图是白屏,或者只有上半部分
原因:页面 JS 还没执行完就截图了,或者--virtual-time-budget设得太短。SPA 应用首屏渲染依赖接口返回,接口慢的时候 1 秒根本不够。
解决:把--virtual-time-budget提到 5000 到 10000,或者改用 DevTools 协议监听Page.loadEventFired事件再截图。后者更精确但需要引入puppeteer或playwright。另外确认--window-size高度够,有些页面内容超过视口高度,截图只截可视区域。
5.3 现象:容器里跑几分钟后进程被 kill,日志显示 OOM
原因:/dev/shm太小,Chrome 渲染时写共享内存失败,触发内存暴涨。Docker 默认 64MB,复杂页面轻松写满。
解决:加--disable-dev-shm-usage,或者启动容器时--shm-size=1g。两个一起上更稳。同时限制并发数,别让多个实例同时吃内存。
5.4 现象:中文全部显示成方块
原因:系统没有中文字体,Chrome 回退到默认字体但找不到对应字形。
解决:装fonts-noto-cjk或fonts-wqy-zenhei,然后fc-cache -fv。验证方式是fc-list :lang=zh能列出字体。如果还不行,检查--user-data-dir下的字体缓存,删掉重新生成。
5.5 现象:--headless=new报未知参数,或者行为异常
原因:Chrome 版本太老,不支持新版无头模式。--headless=new是 112 版本之后才稳定的,109 及以前只认--headless。
解决:chrome --version确认版本。老版本把--headless=new换成--headless,但注意老无头模式对某些 CSS 和 JS 支持不完整,截图效果可能和真实浏览器有差异。如果业务对渲染一致性要求高,建议升级到较新版本。
6. 进阶:把 chrome-linux64 塞进 Docker 镜像并控制体积
6.1 多阶段构建压缩镜像
直接把解压后的 Chrome 目录 COPY 进镜像,体积会很大。用多阶段构建,只保留运行时需要的文件。
FROM debian:bookworm-slim AS chrome-base # 装运行时依赖,不装编译工具 RUN apt-get update && apt-get install -y --no-install-recommends \ libnss3 libnspr4 libatk1.0-0 libatk-bridge2.0-0 \ libcups2 libdrm2 libxkbcommon0 libxcomposite1 \ libxdamage1 libxfixes3 libxrandr2 libgbm1 \ libpango-1.0-0 libcairo2 libasound2 \ fonts-noto-cjk \ && rm -rf /var/lib/apt/lists/* # 复制解压好的 chrome 目录 COPY chrome-linux64 /opt/chrome-linux64 RUN chmod +x /opt/chrome-linux64/chrome # 删掉不需要的语言包,只留英文 RUN find /opt/chrome-linux64/locales -type f ! -name 'en-US.pak' -delete ENV CHROME_PATH=/opt/chrome-linux64/chrome ENTRYPOINT ["/opt/chrome-linux64/chrome"]关键点:--no-install-recommends避免拉进一堆非必要包;rm -rf /var/lib/apt/lists/*清掉 apt 缓存;删掉非英文 locale 能省十几 MB。这样构建出来的镜像大概 400MB 到 500MB,比直接塞完整系统小很多。
6.2 验证镜像里的 Chrome 能正常截图
# 构建镜像 docker build -t chrome-headless:latest . # 跑一个截图验证 docker run --rm -v /tmp/shots:/shots chrome-headless:latest \ --headless=new --no-sandbox --disable-dev-shm-usage \ --screenshot=/shots/test.png --window-size=1280,720 \ about:blank # 检查宿主机上是否生成了文件 ls -lh /tmp/shots/test.png如果容器里报Failed to move to new namespace,说明--no-sandbox没生效或者 seccomp 限制太严,加--security-opt seccomp=unconfined试试。生产环境不建议长期这么跑,最好配置合适的 seccomp profile。
6.3 一个我踩过的坑
早期我把 Chrome 和 Python 脚本塞在同一个镜像里,结果每次改脚本都要重新 COPY 整个 Chrome 目录,构建缓存全失效,一次构建好几分钟。后来拆成两个镜像,Chrome 镜像只负责提供二进制,业务镜像通过COPY --from拿过来,构建时间降到十几秒。这个习惯帮我省了大量等待时间,也建议你一开始就这么分。
另外,chrome-linux64.zip的版本别追最新,选一个稳定版锁死,在 CI 里固定校验值。浏览器版本升级带来的渲染差异,有时候比代码 bug 还难查。希望帮到你。
本文还有配套的精品资源,点击获取