首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
CentOS 6.3 离线源码编译工具链配置与故障排查
📅 2026/10/28 15:26:29
✍️ 爱科研究院
👁 阅读 3,247
简介这份资源以 CentOS 6.3 为主题归档压缩包内实际呈现的是一套名为 mobilyblocks 的静态网页素材面向需要快速了解前端页面组织方式、寻找轻量页面模板的开发者与学习者。包内共19个文件以14个PNG图片资源为主辅以3个JavaScript脚本、1个CSS样式表和1个HTML入口页面分别承担界面配图、交互逻辑、视觉样式与页面结构展示压缩包约244KB体积小巧下载后可直接查阅目录分层与代码引用关系。已有526人学习或下载说明该素材在基础页面搭建与代码结构参考方面具有一定关注度。读者可通过入口页面观察HTML骨架、CSS布局与JS初始化之间的配合并借鉴图片资源的组织方式用于个人练习、页面原型对照或前端课程示例参考若关注 CentOS 6.3 系统本身则需注意包内并未包含系统镜像或安装文件。1. 从一台要编译源码工具的离线机器说起CentOS 6.3 为什么还值得认真安装上个月接手一台内网机器任务很单一把几个只提供.tar.gz的源码工具编译出来让它们能跑。机器上已经装好了 CentOS 6.3我原以为半小时就能收工结果yum install gcc直接返回一堆 404./configure报了三次错make跑到一半被系统杀掉。问题都不大但每个都可能拦住后面的步骤而且报错信息完全无法指出下一步该做什么。CentOS 6.3 这套环境很特殊内核 2.6.32、glibc 2.12、gcc 4.4.7、Python 2.6.6官方源早已停更归档网上大部分安装教程还停留在“默认源直接能用的那几年”。打算靠源码工具在这套环境里编译通过的人基本都会在同一个地方失败系统装完了但基础工具链和依赖库没有装好。这篇笔记记录我最后跑通的那一套顺序先确定镜像和分区参数再把 yum 指向归档源然后一次性安装编译工具链接着用prefix ldconfig pkg-config管理安装到/usr/local的库最后用一份自检脚本验收。新手照抄能走通熟手可以只看版本差异和参数取舍。2. 装之前先确定参数CentOS 6.3 的镜像选择、分区方案与虚拟机配置安装系统这一步最容易出现的错误是随手一路点“下一步”把该装的开发包漏掉。等到后面./configure报no acceptable C compiler found in $PATH又得回头补装还会留下一个半成品环境。下面这套参数是我在虚拟化和老旧物理机上都会优先采用的方案先确定下来后面所有步骤就不用临时改动。2.1 镜像选择与完整性校验CentOS 6.3 的安装介质分bin-DVD、minimal、netinstall几种。我一般选bin-DVD的 x86_64 版本原因是离线机器没法从网络补包DVD 里自带完整的 Base 包组后续就算 yum 源暂时没配好也能先用本地介质安装一轮基础依赖。minimal看着轻但它连man、vim都不带编译工具链更是全部要另外补对这套场景并不划算。镜像下载完先算一次校验值这一步很少出错但一旦出错后面所有报错都会指向错误的方向# 下载后立刻比对官方公布的校验值不一致就别拿去装 sha256sum CentOS-6.3-x86_64-bin-DVD1.iso校验值对不上只有两种可能下载没传完或者介质被中间环节改过。两种都不值得继续重新下载一次比排查后面的问题省事得多。2.2 虚拟机参数与分区方案CentOS 6.3 装在一个 1 核 1G 内存的虚拟机里也能启动但编译源码时会经常遇到内存不足的问题make会被系统的 OOM 直接杀掉日志里只留下一行Killed没有任何线索。我的下限配置是 2 核、2G 内存、40G 磁盘编译大型源码包时再加swap。项目建议值说明CPU2 核及以上make -j2才有意义单核编译慢到无法接受内存2G 起低于 1.5G 编译中大型包极易被 OOM 杀掉磁盘40G 起源码包解开 编译中间产物很占空间swap2G内存不够时的保底方案别指望它快但能保证不被杀网络NAT 或桥接需要能访问归档源纯离线环境要提前准备好本地源磁盘分区/20G/usr/local单独 15Gswap2G源码工具默认装在/usr/local单独分区方便回滚分区这里有个细节把/usr/local单独分出来是因为后面所有源码工具都往这个目录装一旦编译出错或库版本冲突可以直接重新格式化这个分区不必重装系统。/usr/local独立分区是我踩过坑之后加上的之前有一次make install把一个系统自带的库覆盖了回滚时非常麻烦。安装类型选“Basic Server”就行勾选上“Compatibility libraries”这个选项会带上若干老版本兼容库CentOS 6.3 上的很多源码包还在依赖它们。SELinux 保持默认的 Enforcing不要在这一步就关掉后面真出问题再按需调整一上来就关掉等于把安全机制和排查线索一起丢了。2.3 首次登录必须先做的三件事系统装完、重启进系统先别急着装东西。这台机器的网络、时间、快照三件事没处理完后面每一步都会出问题。第一件是网卡开机自启。CentOS 6.3 的网卡默认是ONBOOTno装完系统后网卡处于未启用状态yum会提示无法解析主机。# 编辑第一块网卡配置把 ONBOOT 改成 yes vi /etc/sysconfig/network-scripts/ifcfg-eth0 # ONBOOTno - ONBOOTyes # BOOTPROTOdhcp 或 static静态 IP 要补 IPADDR/NETMASK/GATEWAY/DNS1 service network restart ifconfig eth0 | grep inet addr改完必须重启网络服务才生效ifconfig里能看到inet addr才算通。如果配的是静态地址/etc/resolv.conf里要补一条nameserver否则能 ping 通 IP 却解析不了域名yum一样用不了。第二件是校时。CentOS 6.3 的默认时间如果偏差太大后续从 https 源取包会报证书校验失败这个报错和源本身没有关系很容易把排查方向带偏。# 手动校时一次ntpdate 在 6.3 上默认就有 ntpdate -u pool.ntp.org hwclock -w # 把系统时间写回硬件时钟 date # 确认输出和真实时间一致第三件是打快照。虚拟机的话在宿主机上直接做一次快照物理机做不到快照就至少把/etc/yum.repos.d和/etc/sysconfig/network-scripts目录先备份一份后面改配置改坏了能快速还原。这三件事做完再往下走能省掉后面一半的反复尝试。3. 让 yum 重新可用CentOS 6.3 停更后把 baseurl 指向 vault 归档源到了这一步yum install基本都会失败。这不是网络问题也不是 DNS 问题是 CentOS 6.3 的源地址指向的目录在官方镜像上已经不存在了。mirrorlist里的地址返回 404yum就报Cannot find a valid baseurl for repo: base。解决办法是把baseurl指向官方保留的历史归档目录 vault那里按小版本号保留了完整的包。3.1 备份原 repo 并改写成 vault 地址改配置之前先备份这个习惯我保持了很多年。/etc/yum.repos.d下的文件改坏了系统不会给你任何提示只会在下一次安装时报一堆看不懂的错有备份就能一条命令回到原点。# 1) 备份整个 repo 目录出问题直接拷回来 mkdir -p /root/repo-backup cp -a /etc/yum.repos.d/*.repo /root/repo-backup/ ls /root/repo-backup/接着把CentOS-Base.repo整体改写。注意这里用的是EOF单引号包住分隔符是为了让$basearch原样写入文件而不是在写入时就被 shell 展开成空值这个细节写错的话文件里会变成一条路径里缺目录的错误地址。cat /etc/yum.repos.d/CentOS-Base.repo EOF [base] nameCentOS-6.3 - Base - vault baseurlhttp://vault.centos.org/6.3/os/$basearch/ gpgcheck1 gpgkeyhttp://vault.centos.org/6.3/os/$basearch/RPM-GPG-KEY-CentOS-6 enabled1 [updates] nameCentOS-6.3 - Updates - vault baseurlhttp://vault.centos.org/6.3/updates/$basearch/ gpgcheck1 gpgkeyhttp://vault.centos.org/6.3/os/$basearch/RPM-GPG-KEY-CentOS-6 enabled1 [extras] nameCentOS-6.3 - Extras - vault baseurlhttp://vault.centos.org/6.3/extras/$basearch/ gpgcheck1 gpgkeyhttp://vault.centos.org/6.3/os/$basearch/RPM-GPG-KEY-CentOS-6 enabled1 EOF参数逐个说明baseurl里的6.3是硬编码的小版本号不能用$releasever代替因为$releasever解析出来是6而归档目录是按6.3、6.4这样分的路径一对不上还是 404。$basearch会展开成x86_64或i386保持变量写法可以让同一份配置在两种架构上通用。gpgcheck1不要为了图省事关掉源码工具编译出来的二进制要在生产里跑包来源必须校验。如果内网完全不通外网就把baseurl换成本地挂载的 DVD 或内网镜像地址格式一样比如baseurlfile:///media/CentOS_6.3_Final/前提是先把 ISO 挂到那个目录。3.2 关掉 fastestmirror 插件并导入 GPG 公钥fastestmirror插件的作用是测速后挑最快的镜像但这套逻辑在单一baseurl的场景下没有意义反而会多花几秒到十几秒测速网络受限时还会直接超时把一次正常的yum拖成失败。# 关掉测速插件单源场景下它只会拖慢速度 vi /etc/yum/pluginconf.d/fastestmirror.conf # enabled1 - enabled0 # 导入 RPM 公钥否则 gpgcheck1 会拦下所有包 rpm --import http://vault.centos.org/6.3/os/x86_64/RPM-GPG-KEY-CentOS-6 rpm -qa gpg-pubkey*rpm --import执行成功不会有明显输出用rpm -qa gpg-pubkey*能查到一条记录就说明导进去了。如果这台机器完全离线公钥文件其实就在 DVD 的根目录下rpm --import /media/CentOS_6.3_Final/RPM-GPG-KEY-CentOS-6一样管用。3.3 清缓存并验证源是否真的可用配置改完不要直接上yum install先清缓存再重建元数据。CentOS 6.3 的yum是 3.2.29缓存目录里可能还留着上一次失败的半截元数据不清掉的话新配置不会立刻生效。yum clean all yum makecache # 重建元数据这一步能过基本就通了 # 用一个体积小的包验证别拿大包试 yum -y install tree tree --versionyum makecache成功会打印出几个 repo 的元数据下载进度最后一行是Metadata Cache Created。如果卡在Determining fastest mirrors说明 3.2 节的插件没关干净如果报[Errno 14] HTTP Error 404检查baseurl里的小版本号和架构路径是否写错把地址直接贴到浏览器或curl -I里看一眼返回码最快。这一步过了才算真正拥有一台能装包的系统。后面所有的编译工具和依赖库都靠这个源来铺。4. 配置源码工具链从 gcc 4.4.7 起步的最小可用集CentOS 6.3 自带 gcc 4.4.7这个版本能编绝大部分 C 项目但对 C11 的支持是残缺的编译现代 C 代码会报一堆语法错误。先把 yum 能提供的工具链装齐再谈要不要自己编高版本 gcc顺序反了会浪费很多时间。4.1 一次装齐 Development tools 与常用开发库先确认包组名。CentOS 6.3 的包组叫Development tools小写 t跟 7 系的Development Tools大小写不一致名字写错会直接报No group named ...。# 先查包组的确切名字别凭记忆写 yum grouplist | grep -i development # 装基础编译工具链 yum -y groupinstall Development tools # 补常用开发库头文件缺哪个后面 configure 就会卡在哪个 yum -y install gcc gcc-c make automake autoconf libtool \ zlib-devel openssl-devel pcre-devel readline-devel \ ncurses-devel bzip2-devel kernel-devel kernel-headers这段装的东西分三类。第一类是编译器本体gcc、gcc-c分别对应 C 和 C第二类是构建系统make、automake、autoconf、libtool绝大多数.tar.gz源码包的configure脚本都是 autotools 生成的缺了这些源码包里自带的bootstrap流程就跑不起来第三类是-devel结尾的头文件包zlib-devel提供zlib.hopenssl-devel提供openssl/*.hpcre-devel提供正则库头文件。这里有个判断标准编译时报xxx.h: No such file or directory缺的一定是-devel包不是运行库包很多人会去装zlib而不是zlib-devel结果装完照样报错。kernel-devel和kernel-headers只有在要编内核模块时才必需但顺手装上不亏版本必须和uname -r的输出严格对应不一致的话编模块会失败。装完核对一下版本gcc --version | head -1 # 期望 gcc (GCC) 4.4.7 ... make --version | head -1 # 期望 GNU Make 3.81 ld --version | head -1 # 链接器版本排查库问题时要用 uname -r # 内核版本和 kernel-devel 对照4.2 源码包的三步走与 prefix 约定标准 autotools 源码包的流程就是三步./configure、make、make install。真正需要决策的只有--prefix装到哪。我的原则很明确系统包管理器管的东西一律不动源码编译的一律装/usr/local下的独立目录。这样rpm -qa能查到的永远是 yum 装的/usr/local下的永远是手工编的出问题能立刻分清是谁的责任。# 源码统一解到 /usr/local/src别在 /root 下编译 tar -xzf demo-tool-1.0.tar.gz -C /usr/local/src/ cd /usr/local/src/demo-tool-1.0 # 先看它支持哪些开关不要照抄别人的参数 ./configure --help | less # 再按需要配置prefix 指到独立目录 ./configure \ --prefix/usr/local/demo-tool \ --with-openssl/usr \ --enable-shared参数含义--prefix决定make install把bin、lib、include放到哪里指到/usr/local/demo-tool之后卸载就是rm -rf一个目录的事--with-openssl/usr告诉它去系统目录找 OpenSSL 的头文件和库CentOS 6.3 的 OpenSSL 装在/usr下不显式指定时有些包的探测逻辑会去/usr/local/ssl找找不到就静默关闭相关功能--enable-shared生成动态库需要静态链接的话再补--enable-static。configure失败时别只看最后几行真正的失败原因在config.log里。我的习惯是grep -n error config.log | head -20通常第一条 error 就是根因后面的都是连锁反应。4.3 让新装的库被找到ldconfig 与 pkg-configmake install成功不等于能用。装到/usr/local/demo-tool/lib下的动态库系统默认不会去那个路径找运行时报error while loading shared libraries: libdemo.so.1: cannot open shared object file。这个报错非常普遍因为编译时链接器按-L找到了库运行时加载器走的是另一套搜索路径。# 把新库路径注册给动态链接器 echo /usr/local/demo-tool/lib /etc/ld.so.conf.d/demo-tool.conf ldconfig # 确认加载器已经认识这个库 ldconfig -p | grep demo-tool/etc/ld.so.conf.d/下的文件名随便起后缀必须是.confldconfig会把这个目录下所有文件里列的路径读进缓存。改完必须执行ldconfig才生效只写文件不执行等于没做。pkg-config解决的是另一个问题编译依赖这个库的程序时-I和-L参数从哪来。源码包make install时如果带了.pc文件需要让pkg-config找到它。# 让 pkg-config 认识新装的 .pc 文件 export PKG_CONFIG_PATH/usr/local/demo-tool/lib/pkgconfig:$PKG_CONFIG_PATH pkg-config --modversion demo-tool # 输出版本号说明找到了 pkg-config --cflags --libs demo-tool # 输出编译和链接参数PKG_CONFIG_PATH是环境变量写在当前 shell 里只对当前会话有效。要长期生效就写进/etc/profile.d/下新建的.sh文件再source一次。注意路径要用:分隔并且保留$PKG_CONFIG_PATH直接覆盖掉的话系统原有的.pc路径会全部丢失。4.4 完整走一遍编译、安装、调用把前面的步骤串起来一个源码工具从解包到能用的完整流程是这样的cd /usr/local/src/demo-tool-1.0 ./configure --prefix/usr/local/demo-tool --enable-shared || { echo configure 失败去看 config.log; exit 1; } make -j2 # 2 核机器用 -j2内存小于 2G 就用 -j1 make install # 注册库路径 注册 pkg-config echo /usr/local/demo-tool/lib /etc/ld.so.conf.d/demo-tool.conf ldconfig echo export PKG_CONFIG_PATH/usr/local/demo-tool/lib/pkgconfig:$PKG_CONFIG_PATH \ /etc/profile.d/demo-tool.sh source /etc/profile.d/demo-tool.sh # 验证 /usr/local/demo-tool/bin/demo-tool --version ldd /usr/local/demo-tool/bin/demo-tool | grep demo-j2的数字不超过 CPU 核数也不要在小内存机器上盲目加大。我曾经在 1G 内存的机器上用-j4make跑到一半直接被内核杀掉dmesg | tail里能看到Out of memory: Kill process但make自己的输出只有一行Killed第一眼完全看不出是内存问题。ldd那一行用来确认程序链接的确实是/usr/local/demo-tool/lib下的库而不是某个同名的系统库同名库在系统里已经存在时这个检查能省掉后面很多困惑。5. 排查清单CentOS 6.3 编译源码时最常见的五个失败点下面五条是我在这套环境里反复遇到的每条按“现象 → 原因 → 解决”记录遇到时直接对着查比从头推快得多。5.1 现象yum 装任何包都报 404或提示 Cannot find a valid baseurl原因几乎只有两种baseurl还指向已经下线的默认镜像或者小版本号写错。CentOS 6.3 的包在官方主镜像上早就不在了mirrorlist里的地址全部失效只有 vault 归档目录还保留着。解决按 3.1 节的方式把baseurl改成 vault 路径确认6.3这个段位和$basearch都是对的。另外顺手检查一下机器能不能解析域名ping -c1 vault.centos.org不通就先修网络不要把网络问题误判成源问题。5.2 现象./configure报no acceptable C compiler found in $PATH原因系统装的时候选了最小化gcc根本没装。这个报错出现在config.log里屏幕上只会显示一句很笼统的失败提示不看日志很难定位。解决yum -y install gcc gcc-c make然后which gcc确认在/usr/bin/gcc。装完不用重跑configure以外的任何东西但要把源码目录里的config.cache删掉再重来不然它会缓存上一次“找不到编译器”的结论。5.3 现象编译 C 代码时报大量语法错误指向auto、nullptr之类的关键字原因CentOS 6.3 自带 gcc 4.4.7对 C11 标准的支持很不完整现代 C 代码在这个编译器上基本编不过。这不是代码写错了。解决先确认源码是不是真的必须 C11。可以的话用项目提供的兼容开关关掉新特性再编成本最低。确实必须的话就得装高版本工具链CentOS 6 官方提供过 devtoolset 系列可以装上后用scl enable切到新版本编译环境没有网络的话只能源码编 gcc但那条路要先备齐 GMP、MPFR、MPC 三个数学库耗时很长非必要不走。5.4 现象程序能编译安装运行时报cannot open shared object file原因动态库装在了/usr/local/xxx/lib但加载器只认/lib、/usr/lib和/etc/ld.so.conf里登记的路径。解决按 4.3 节写/etc/ld.so.conf.d/*.conf然后ldconfig。临时应急可以用export LD_LIBRARY_PATH/usr/local/xxx/lib:$LD_LIBRARY_PATH但这是权宜之计长期依赖它会让同一台机器上不同用户、不同启动方式的程序行为不一致最后还是得落到ld.so.conf.d上。排查具体链接了哪个库用ldd 二进制路径输出里带not found的那一行就是缺的。5.5 现象make跑到中途突然中止只输出一行Killed原因内存耗尽被内核 OOM killer 杀掉不是编译错误。这种情况日志里没有任何 error看着像是随机中断。解决先dmesg | tail -20确认有没有 OOM 记录然后做两件事——把-j降到-j1并且临时加一块 swap。# 临时加 2G swap重启后失效够编译用 dd if/dev/zero of/tmp/swapfile bs1M count2048 chmod 600 /tmp/swapfile mkswap /tmp/swapfile swapon /tmp/swapfile free -m # 确认 swap 那行有值编完用swapoff /tmp/swapfile关掉再删文件。另外顺带提一个容易被忽略的/tmp如果是独立分区且只有几百兆有些编译过程会往/tmp写大文件写满了一样会让make失败报错是No space left on device跟内存问题长得完全不一样别混。6. 装完怎么验收一份五分钟跑完的源码工具链自检脚本装完之后我做验收从不靠“看起来没问题”而是跑一遍固定脚本。原因很简单工具链的问题是延迟暴露的gcc --version有输出、yum不报错不代表真能编东西等到三天后编译某个源码包失败环境已经改过好几轮很难再回头定位原因了。6.1 自检脚本#!/bin/bash # CentOS 6.3 源码工具链自检全过才算环境可用 ok0; fail0 check() { # $1检查项名称 $2要执行的命令 if eval $2 /dev/null 21; then echo [ OK ] $1; ok$((ok1)) else echo [FAIL] $1; fail$((fail1)) fi } check gcc 可执行 gcc --version check g 可执行 g --version check make 可执行 make --version check autoconf 可执行 autoconf --version check yum 元数据可用 yum -q makecache check libstdc 头文件 test -f /usr/include/c/4.4.7/iostream check zlib 头文件 test -f /usr/include/zlib.h check openssl 头文件 test -f /usr/include/openssl/ssl.h check ldconfig 缓存 ldconfig -p echo ---- 结果: 通过 $ok 项, 失败 $fail 项 ---- exit $fail脚本用了一个check函数把“判断成功与否”和“打印结果”分开eval执行的命令输出全部丢掉只看退出码。最后一个exit $fail让脚本的返回值等于失败项数可以直接塞进自动化流程里判断。这里没有用set -e因为检查项本来就是允许失败的中途退出就收集不全信息了。6.2 真正的验收编一个最小程序并跑起来脚本全过只能证明工具在不能证明能产出可执行文件。我最后一定会跑一次真实的编译链路从 C 源文件到可执行文件再到运行输出全链路走通cat /tmp/hello.c EOF #include stdio.h #include zlib.h int main(void) { /* 顺手验证 zlib 链接是否正常 */ printf(toolchain ok, zlib%s\n, zlibVersion()); return 0; } EOF gcc -O2 -o /tmp/hello /tmp/hello.c -lz /tmp/hello能输出toolchain ok, zlib1.2.x就说明编译、链接、运行三步全通-lz那一段还顺带确认了zlib-devel装对了。验收项和期望结果对照如下验收项期望结果不通过时的排查方向自检脚本失败 0 项按 FAIL 项回到对应章节hello 编译无输出即成功看报错缺头文件还是缺库hello 运行打印 toolchain ok检查ldd /tmp/hello有无 not foundldconfig -p能看到自己装的库检查ld.so.conf.d是否漏写pkg-config --modversion输出正确版本号检查PKG_CONFIG_PATH从那以后我每次装完这类老系统环境都强制走一遍这份自检不看--version输出了就收工。一次五分鐘的验收省下的是后面几天“明明装好了为什么编不过”的来回猜测。希望帮到你。本文还有配套的精品资源点击获取
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/10/28 15:26:29
t3code 全栈实践:用 T3 Stack 打造类型安全的前后端一体化应用
2026/10/28 15:21:27
PCB封装命名规范:焊盘、Shape与封装层字段规则解析
2026/10/28 15:21:27
PCB设计制作中的设计与工艺边界:阻抗、叠层与量产良率
2026/10/28 16:37:28
麦当劳供应链优化:运筹学与数据驱动的实践
2026/10/28 16:37:28
Linux网卡未托管问题诊断与解决方案
2026/10/28 16:37:28
医疗AI中的差分隐私保护技术与实践
2026/10/28 16:37:28
AI安全团队权责边界与组织治理机制分析
2026/10/28 16:37:28
Python+OpenCV实战:用电脑摄像头实现答题卡识别与自动批改
2026/10/28 16:32:27
Agent-Reach:基于目标可达性的AI代理设计框架
2026/10/28 0:00:12
Stable Diffusion文生图全解析:从CLIP到UNet的扩散模型原理与实战
2026/10/28 0:00:12
从 Notebook 到 Python 项目:如何重构量化行情获取代码?
2026/10/28 0:00:12
2026版人形机器人标准:具身智能与模块化设计解析
2026/10/28 12:27:10
全国计算机二级C语言真题PDF高效刷题指南
2026/10/28 15:37:16
requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南
2026/10/28 12:37:46
递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现
2026/10/28 15:37:16
我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
2026/10/28 15:37:15
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026/10/28 15:37:15
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)