오래된 서비스가 돌아가는 머신이 있다.

ubuntu 10.04 버전이니 14년이 넘어가는 머신 - 리얼서버 => 가상서버 로 몇번 옮겨지기도 했다.

새버전으로 바꾸기에는 레거시 코드가 있어서 그냥 돌리고 있다.

리얼 => 가상 서버로 옮겨지면서, 가상머신 내부는 최소의 용량으로 두고, 데이터는 외부로 두고 nfs 로 마운트해서 사용하고 있다.

재부팅할 때 - 아래 부분에서 딜레이가 발생한다.

원인을 찾아보다가, 보아하니 nfs 마운트한 위치를 bind 로 재마운트 한 부분에서 딜레이가 발생하는 것 같다.

# apache logs
/data8/apache2                /var/log/apache2   bind    bind,rw,defaults  0  2

/data8 이 nfs 로 마운트 된 위치 , 그것을 mount bind 로 했다.

재부팅 reboot / 종료 halt 시에 딜레이가 발생한다. ( 이 부분이 ubuntu 상위 버전에서는 일어나지 않는 듯 하다)
10.04 버전에서 이상현상.(다른 모든 버전을 체크하지는 못 함 - 비슷한 환경을 구성한 14.04 은 정상 )

종료프로세스인 /etc/rc6.d 부분이

umount 코드들이 실행되지만, mount bind 는 제대로 언마운트를 못하는 듯 하다.

그래서

S22umount-work-nfs -> ../init.d/umount-work-nfs*

위 파일을 만들어 줬다.

# cat /etc/init.d/umount-work-nfs 
#! /bin/sh
### BEGIN INIT INFO
# Provides:          unmount work nfs
# Required-Start:
# Required-Stop:
# Default-Start:
# Default-Stop:      6
# Short-Description: Umount nfs work dir before reboot.
# Description:
### END INIT INFO

PATH=/sbin:/usr/sbin:/bin:/usr/bin

. /lib/lsb/init-functions

do_stop () {
	# Message should end with a newline since kFreeBSD may
	# print more stuff (see #323749)
	log_action_msg "Will umount all nfs work dir - before restart"
	umount /var/log/apache2 
}

case "$1" in
  start)
	# No-op
	;;
  restart|reload|force-reload)
	echo "Error: argument '$1' not supported" >&2
	exit 3
	;;
  stop)
	do_stop
	;;
  *)
	echo "Usage: $0 start|stop" >&2
	exit 3
	;;
esac

do_stop 부분에 bind mount 한 위치를 umount 해준다.

10.04 버전을 아직도 쓰실 분이 얼마나 있겠냐마는 ㅜㅜ

난 여러버전을 쓰고 있구나. 10.04 / 14.04 / 18.04 .. 최근 22.04 도 ,  곧 나올 24.04 도 쓰겠군.

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

마운트된 장치(하드등) 를 umount 하려고 할때 다음과 같은 메시지가 나올때가 있다.

# umount work
umount: /data/work: target is busy
        (In some cases useful info about processes that
         use the device is found by lsof(8) or fuser(1).)

장치가 사용중이라는 의미겠다.

다음처럼 lsof 로 확인해보면, 보통 아래와 같은 메시지가 나온다.

# lsof /data/work

COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
bash    3639   root  cwd    DIR   8,49        0 4587521 /data/work/job (deleted)

또는

COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
bash    3639   root  cwd    DIR   8,49     4096    2 /data/work

콘솔로 해당 디렉토리에 접근해 있는 경우이다. 로컬에서 그럴수도 있고, 원격접속한 경우도 있을 수 있다.

해당 job 을 찾아서 로그아웃 하거나 다른곳으로 이동하거나 하면 된다.

찾지 못하거나 모를 경우 해당 점유하고 있는 프로세스를 강제 종료할 수도 있다.(위 예시의 PID 3639 )
여러사용자가 사용하는 장비라면 더욱 찾지 못할 수도 있다.

kill 3639

딱히 권장하지는 않는다.

다시 umount 해보면 정상적으로 될 것이다.

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

우분투 10.04 에서 samba mount 사용하기(fstab)


저의 개발환경 구성을 이렇게 하고 있다.(사정이 있어 기존 구성된 환경을 유지하려다 보니 복잡해 보인다)

                                                     [개발서버(소스)]  => 개발VM(nfs)    => web-dev
외부작업환경1)               윈도우 네트워크 드라이브 -> vm (smb)
외부작업환경2) (remote) -> sftp -> smb_mount -> vm (smb)

그에 맞게 작업환경을 꾸미다보니 sftp 로 직접 붙이려니 애매한 부분이 있었다.
그래서 중간에 smb mount 해서 사용하기로 했다.


1. samba 관련 설정. /etc/samba/smb.conf (설치 부분은 생략)

[httpd]
   comment = working dev httpd
   path = /work/httpd
   browseable = yes
   hosts allow = 127.0.0.1
   force user = www-data
   force group = www-data
   public = yes
   guest ok = yes
   writable = yes
   printable = no
   create mask = 0765
   directory mask = 0755

2. mount 에 필요한 패키지 설치

# apt-get install smbfs

  최신 우분투 버전은 cifs-utils 로 설치하는 듯 함.

3. /etc/fstab 에 다음처럼 항목 추가

//linux/httpd  /smb_mount/httpd  smbfs uid=user,gid=adm,password=,iocharset=utf8,noauto  0  2

예전버전에 codepage=cp949 등이 쓰였는데, 언제부터인가 옵션이 빠졌음. iocharset 만 추가

uid , gid 는 서버의 접근계정 아이디/그룹
password 옵션은 암호가 있으면 넣고, 없으면 그냥 빈란

4. 마운트

# mount /smb_mount/httpd

크게 어려운 부분은 없다.(자신에 맞게 환경설정은 변경)

해당위치로 /smb_mount/httpd 로 sftp 접근해서 파일을 직접 수정해서 작업한다.




반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,
기존 마운트된 파티션을 다시 마운트 하기 위해서 mount -o bind 를 쓴다.
내 경우는 FTP 의 symlink 처리시에 쓰고 있다(http://blog.1day1.org/149)

그런데, 기존 마운트의 데이터를 보호하기 위해 bind 시 readonly 옵션(ro) 를 주고 테스트를 해보니 제대로 되지 않았다.
mount -o bind,ro  /Data/userA  /DownA/UserData
아마도 기존 마운트 옵션을 변경하지 못하는 듯 하다.

내가 원하는 방향으로 하기 위해 어떻게 하면 좋을까?
로컬 데이터를 끌어(?)오기 위해 NFS, SAMBA 를 써 볼까?
퍼포먼스에는 문제가 없을까?

좀더 고민해봐야 겠다.

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,
FTP 를 운영할때 이런 경우가 있다.

Data / userA / dirA / fileA , fileB
                     dirB / fileC , fileD
         userB / dirC / ...
         userC /
위 처럼 구성되어 있다고 할때.

다운로드는 심볼링링크로 처리한다고 해보자.
(각 파일은 DownA -> userA 의 파일들이 링크된다-지정된 몇몇 파일들)
DownA / data / dirA / fileA -> symbolic link (/Data/userA/dirA/fileA)
                       dirB ..
DownB / data / dirC ..
이렇게 외부로 빼서 하는 경우 FTP 의 chroot 상태에서는 링크가 깨져 다운로드 할 수 없다.
(userA 의 경우 접속시 DownA 가 chroot 되어 /data/ ... 부분만 접속이 가능하기 때문이다)

그럼 어떻게 해결하는가?

1. chroot 를 풀어버린다.
  chroot 를 사용하지 않고, 그냥 절대경로로 사용한다.

 proftpd
DefaultRoot                    ~
의 옵션을 해제한다.
 vsftpd
chroot_local_user=YES
를 YES -> No 로 바꿔준다.

 그런데, 저렇게 바꿔버리면 사용자가 상위디렉토리로 접근할 수 있게 되어 보안 위험에 노출 된다. 물론 퍼미션을 잘 조정하면 괜찮지만, 아무래도 꺼림직하다.

2. mount bind 를 이용한다.

접근하려는 사용자 디렉토리를 mount -o bind 옵션으로 마운트해서 사용한다.
위와 같은 경우 (userA)
mount -o bind  /Data/userA  /DownA/UserData

이런식으로 마운트한후에 링크는
/UserData/dirA/fileA
으로 해주면 된다.  여기서
/DownA/UserData/dirA/fileA
가 아닌 이유는 chroot 시에 /DownA 가 / 로 바뀌기 때문이다.

이 경우 사용자가 늘어나면 매번 mount bind 명령을 해줘야 한다.
소수의 사용자야 그냥 하면 되지만, 늘어나는 경우 정말 귀찮아 진다.
cron 으로 자동처리하면 되기는 하는데, 좀 깔끔하게 처리하는 방법이 없을까?


위 방법이 한계가 있다면, FTP 이외에 다른 방법을 찾아야 할지도 모르겠다.
서버, 클라이언트의 부담이 가장 적은 방법에 무엇이 있을까?

# 관련자료
http://www.castaglia.org/proftpd/doc/contrib/ProFTPD-mini-HOWTO-Chroot.html

http://www.proftpd.org/docs/howto/Chroot.html
반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,