FHS CentOS 6 빌드와 Apache 실행
0. 실행 준비
모든 명령은 같은 셸 세션에서 저장소 루트 디렉터리로 이동한 뒤 실행한다.
cd "$(git rev-parse --show-toplevel)"
RUN_ID="$(date +%Y%m%d%H%M%S)-$$"
FHS_CONTAINER="interactive-fhs-centos6-${RUN_ID}"
free_port() {
local port=$1
while (echo >/dev/tcp/127.0.0.1/"$port") 2>/dev/null; do
port=$((port + 1))
done
printf '%s\n' "$port"
}
APACHE_PORT="$(free_port 18068)"
1. CentOS 6 빌드 컨테이너
podman pull docker.io/library/centos:centos6
podman run -d \
--name "$FHS_CONTAINER" \
--publish "${APACHE_PORT}:80" \
--volume "$PWD:/workspace:Z" \
--workdir /workspace/fhs \
docker.io/library/centos:centos6 \
sleep infinity
2. CentOS 6 저장소와 빌드 의존성
CentOS 6 종료 후 저장소를 vault로 변경한다.
podman exec "$FHS_CONTAINER" cp -p \
/etc/yum.repos.d/CentOS-Base.repo \
/etc/yum.repos.d/CentOS-Base.repo.before-vault
centos_base='^#baseurl=.*\$releasever'
centos_vault='baseurl=http://vault.centos.org/6.10'
podman exec "$FHS_CONTAINER" sed -i \
-e 's|^mirrorlist=|#mirrorlist=|' \
-e "s|${centos_base}|${centos_vault}|" \
/etc/yum.repos.d/CentOS-Base.repo
podman exec "$FHS_CONTAINER" yum install -y \
gcc gcc-c++ make pkgconfig
podman exec "$FHS_CONTAINER" yum install -y \
boost-devel openssl-devel sqlite-devel openldap-devel
epel_base=http://archives.fedoraproject.org/pub/archive/epel/6
podman exec "$FHS_CONTAINER" yum install -y \
"${epel_base}/x86_64/epel-release-6-8.noarch.rpm"
epel_old='^#baseurl=.*\$basearch$'
epel_new='baseurl='"${epel_base}"'/$basearch'
podman exec "$FHS_CONTAINER" sed -i \
-e 's|^mirrorlist=|#mirrorlist=|' \
-e "s|${epel_old}|${epel_new}|" \
/etc/yum.repos.d/epel.repo
podman exec "$FHS_CONTAINER" yum install -y libxml++-devel
PostgreSQL 9.3 경로와 FHS Makefile에서 사용하는 추가 도구를 준비한다.
PG93_BASE=http://download.postgresql.org/pub/repos/yum/9.3/redhat/rhel-6-x86_64
podman exec "$FHS_CONTAINER" yum install -y \
${PG93_BASE}/postgresql93-9.3.25-1PGDG.rhel6.x86_64.rpm \
${PG93_BASE}/postgresql93-libs-9.3.25-1PGDG.rhel6.x86_64.rpm \
${PG93_BASE}/postgresql93-devel-9.3.25-1PGDG.rhel6.x86_64.rpm
podman exec "$FHS_CONTAINER" mkdir -p /user/db
podman exec "$FHS_CONTAINER" ln -s /usr/pgsql-9.3 /user/db/pgsql
podman exec "$FHS_CONTAINER" yum install -y libmcrypt-devel bc
CentOS 6 기본 Apache 2.2.15와 모듈 빌드 도구를 yum으로 설치한다.
```bash
podman exec "$FHS_CONTAINER" yum install -y \
httpd httpd-devel libtool
sh-opendav Makefile의 /user/service/httpd 경로를 yum 패키지 경로에
맞춘다. 소스는 수정하지 않는다.
podman exec "$FHS_CONTAINER" bash -lc '
mkdir -p /user/service/httpd/build /user/service/httpd/include
ln -sfn /usr/bin/libtool /user/service/httpd/build/libtool
for header in /usr/include/httpd/*.h /usr/include/apr-1/*.h; do
ln -sfn "$header" \
"/user/service/httpd/include/$(basename "$header")"
done
'
CentOS 6 저장소에는 libiconv 패키지가 없으므로, Makefile의 기본
-liconv를 명령행에서 제외하고 -lmcrypt만 사용한다.
LOCK/UNLOCK을 활성화하기 위해 sh-opendav/Makefile의
__NOT_USE_LOCKDB__ 정의는 제거한다.
3. FHS 빌드
podman exec -w로 FHS 작업 디렉터리를 지정해 구성요소를 빌드한다.
podman exec -w /workspace/fhs "$FHS_CONTAINER" bash -lc '
for component in arcmond2 cls csagentd fimngd ftsd; do
make clean -C "${component}" >/dev/null 2>&1
echo "===== BUILD ${component} ====="
make all -C "${component}"
echo "===== STATUS ${component} $? ====="
done
'
podman exec -w /workspace/fhs/sh-opendav "$FHS_CONTAINER" bash -lc '
make clean
make LIBS=-lmcrypt apache-mod-dav-dbms
'
빌드 결과:
ftsd 성공
arcmond2 실패: 제공된 정적 라이브러리의 __inet_addr, __error 심볼
cls 실패: CentOS 6에 setproctitle 없음
csagentd 실패: ShmDefine.h의 uint64_t 미정의 및 연쇄 컴파일 오류
fimngd 성공: 헤더에 `<stdint.h>`만 추가
sh-opendav 성공: apache-mod-dav-dbms target
4. 빌드 산출물 확인
file fhs/ftsd/src/ftsd
file fhs/ftsd/interface/sample/ftsd_test
file fhs/ftsd/lib/libInterCommon.a
file fhs/sh-opendav/.libs/libmod_dav_repos.so
5. CentOS 6 Apache 2.2.15에 sh-opendav 배포
빌드된 모듈을 CentOS 6 yum Apache 모듈 디렉터리에 배포하고
mod_dbd와 함께 로드한다.
podman exec "$FHS_CONTAINER" cp \
/workspace/fhs/sh-opendav/.libs/libmod_dav_repos.so \
/etc/httpd/modules/mod_dav_repos.so
podman exec "$FHS_CONTAINER" sed -i \
's|^#LoadModule dbd_module|LoadModule dbd_module|' \
/etc/httpd/conf/httpd.conf
podman exec "$FHS_CONTAINER" sh -lc \
'printf "%s\\n" "LoadModule dav_repos_module modules/mod_dav_repos.so" \
>> /etc/httpd/conf/httpd.conf'
podman exec "$FHS_CONTAINER" httpd -t
podman exec "$FHS_CONTAINER" httpd -M 2>&1 | \
grep -E 'dbd_module|dav_repos_module|dav_module|dav_fs_module'
검증 결과:
httpd: Syntax OK
dav_module (shared)
dav_fs_module (shared)
dbd_module (shared)
dav_repos_module (shared)
Apache를 실행하고 기본 HTTP 응답을 확인한다.
podman exec -d "$FHS_CONTAINER" /usr/sbin/httpd -DFOREGROUND
curl -sS -D - "http://127.0.0.1:${APACHE_PORT}/" \
-o /tmp/apache-centos6-body
CentOS 6 yum Apache 버전은 Apache/2.2.15다. sh-opendav의
DB 기반 DAV 요청을 실제로 처리하려면 Apache DBD provider와 FHS DB 설정이
추가로 필요하다. 위 단계는 모듈 빌드, 배포, Apache 로드까지 검증한다.
실제 CentOS 6 Apache + sh-opendav 검증 결과:
OPTIONS 200, PROPFIND 207, PROPPATCH 207
MKCOL 201, PUT 201, GET 200
COPY 201, MOVE 201, LOCK 200, UNLOCK 204
DELETE 204
GET 본문도 PUT한 내용과 일치했다. PROPPATCH의 displayname은
읽기 전용 속성이므로 응답 내부에 해당 속성의 409가 포함되는 것이 정상이다.
현재 실행 중인 컨테이너 확인:
podman ps --filter "name=${FHS_CONTAINER}"