2014년 10월 1일 수요일

ctime, mtime 차이점

리눅스를 사용하면서 변경시각과 수정시각이란 말을 들을 수 있다.

ctime : 변경 시각(change time)

mtime : 수정시각(modification time)

 

말뜻이 애매해서 비슷하게 생각되지만, 차이점이 있다.

변경(ctime)은 파일의 아이노드(inode)를 바꾸는 것이고,
수정(mtime)은 파일의 내용 자체를 바꾸는 것이다.

 

예를 들어서 aaa.txt 라는 파일이 있을 때
#chmod 755 aaa
이런 명령을 사용하면 파일내용에는 변경이 없지만, inode 값은 바뀌게 된다.

수정은
#echo aa >> aaa.txt
라고 하면 파일내용이 수정되는 것이고, timestamp 값이 변경 되게 된다.

 

그리고 또 하나는 접근 시각(access time)도 알아보자.
접근시각이란 해당 파일을 마지막으로 읽거나 쓴 시각을 말한다.
따라서 파일을 읽기만 한다면 변경시각이나 수정시각은 변하지 않고, 접근시각만 달라진다.

find 관련 문서를 찾다보면 ctime(change time):변경시각을 '생성시각(creation time)'이라고 설명하고 있는
문서가 있는데 이런 해석은 옳지 않다.

 

참고 :유닉스 파워툴

2014년 9월 18일 목요일

apache multiviews 기능

서버 이전을 했는데, 이미지를 못 불러오는 부분이 있었다.

해당 이미지를 불러오는 데, 이미지 이름으로만 불러오는 것이었다. 확장자 없이...

예를 들어 /image.jpg 를 불러 온다고 했을 때, 보통은

http://www.site.co.kr/image.jpg

이런식으로 불러온다.



그런데 저기서 확장자가 없이

http://www.site.co.kr/image

이런식으로 호출해도 이미지가 뜨는 것이다.



원인은 아파치 설정의 MultiViews 설정이었다.

아파치 문서를 찾아 보니 다음과 같다고 한다.
MultiViews를 사용하면 다음과 같은 일이 일어난다.
서버가 /some/dir/foo에 대한 요청을 받고 /some/dir/foo에 MultiViews가 동작하며 /some/dir/foo가 존재하지 않을 경우,
서버는 디렉토리에서 이름이 foo.*인 파일들을 모든 포함하는 가상의 type map을 만든다.
클라이언트가 요청한 media type과 content-encoding을 가지고 이중에 가장 적합한 것을 선택한다.

테스트 결과 대부분의 이미지는 확장자 없이도 제대로 보여 주었고, html 같은 경우도 형식만 제대로 되어 있으면 인식 되었다.

CentOs7 방화벽 내리기

CentOs 7 이전에는 방화벽이란 건, iptable 이였다.

아무리 iptable을 내려도 적용이 안된다.

확인 해 보니, CentOs 7 버젼부터  Firewalld 란 게 추가되어, 두개가 같이 들어있다. 최소버젼으로 설치 했는 데도 그렇다.
[root@localhost ~]# systemctl list-unit-files | grep fire
firewalld.service disabled
[root@localhost ~]# systemctl list-unit-files | grep iptables
iptables.service disabled
[root@localhost ~]#

Firewalld 은 iptables 기반으로 조작이 쉽도록 만들어진 것으로 보인다.

Firewalld는 iptables에 의존성을 가진다.

 
systemctl stop firewalld

#리부팅 뒤에도 실행 안되게끔
systemctl disable firewalld

2014년 9월 12일 금요일

모든 쿼리 로그 기록.

마리아  db, mysql 의 모든 쿼리를 쌓아놓고 분석에 이용.

 

my.cnf 에 추가
#log
general_log=1
#log_output을 FILE 로 할경우의 경로.
#general_log_file = /var/log/mysql/general_query.log
log_output=TABLE

아래의 스크립트를 하루에 한번 실행하다록 크론에 등록.

general log가 계속 쌓이는 것을 방지. 7일마다 삭제.
#!/bin/sh

id="root"
pass="PASS"

mysql -u ${id} -p${pass} -e "SET GLOBAL general_log = 'OFF'";
mysql -u ${id} -p${pass} -e "RENAME TABLE mysql.general_log TO mysql.general_log2;";
mysql -u ${id} -p${pass} -e "DELETE FROM mysql.general_log2 WHERE event_time <= NOW()-INTERVAL 7 DAY";
mysql -u ${id} -p${pass} -e "OPTIMIZE TABLE general_log2";
mysql -u ${id} -p${pass} -e "RENAME TABLE mysql.general_log2 TO mysql.general_log";
mysql -u ${id} -p${pass} -e "SET GLOBAL general_log = 'ON'";


http://stackoverflow.com/questions/9343001/is-my-mysql-general-log-table-getting-too-big

 
general_log 의 엔진이 CSV라서 해당 파일 자체를 cat, vim 등으로 그냥 볼 수 있음.

마리아DB 소켓 변경시 systemd-private-xxxx 디렉토리 안에 생성되는 문제.

마리아DB 의 socket 위치를 /tmp/mysql.sock 로 변경 하였습니다.
그랬더니, /tmp/systemd-private-xxxx/tmp/mysql.sock 으로 생성이 된다.
뭐 이렇게 해도 상관이 없으나, 클라이언트 접속시 접속이 되지 않는다.

[client]
socket=/tmp/mysql.sock

위와 같이 처리 하면 될 것 같았으나, 위처럼 하면 그냥 /tmp/mysql.sock 으로 인식된다.

centos 7버젼으로 설치 했더니, 조금 바뀐게 많다.
tmp 디렉토리의 보안이 추가 된것으로 보인다.

 
vim /lib/systemd/system/mariadb.service 
PrivateTmp=true 에서 PrivateTmp=false 로 변경.
systemctl daemon-reload
service mariadb restart

2014년 9월 5일 금요일

Mysql 4.0 -> 마리아 5.5.37 마이그레이션


  1. mysql 4.0  dump

  2. mysql 4.1.22 업그레이드

  3. mysql 5.5 업그레이드

  4. 마리아 db 설치.


mysql 4.1 버젼에서 마리아db 로 변경하는 부분은 그냥 덮어 쓰면 됨.

문제는 mysql 4.0 에서 mysql 4.1 로 업그레이드 부분.

binary로 그냥 덮어써도 되지만,  field size 가 반으로 줄어 버리기 때문에 문제가 발생 할 수 있다고 함.

그래서 dump 파일을 생성 해서 써야 함.
mysqldump -u root -ppass --opt --quick --quote-names --all-databases > allBackup.sql

-opt 옵션은 문제가 없다면 쓰는 게 좋음. 백업, 복구 시간을 엄청 단축시킴.
-quote-name 옵션은 테이블 필드명 중, sql 쿼리명이 들어가 있어서 문제를 발생시켜 넣어줌.

restore 완료후에는 mysql_install_db 를 실행 시켜줌.

아래는 마이그레이션시 사용한 스크립트.
#!/usr/bin/bash

#mysql 4.1.22 설치
#killall mysqld
echo "kill mysql"
service mysqld stop
rm -rf /usr/local/mysql/

cd /usr/local/src/mysql-4.1.22/
make install #컴파일 되어 있음. 설치만 하면 됨.
/usr/local/mysql/bin/mysql_install_db
chown -R mysql.mysql /usr/local/mysql
cp -f /usr/local/mysql/share/mysql/mysql.server /etc/init.d/mysqld
service mysqld start

#패스워드 설정
/usr/local/mysql/bin/mysqladmin password 'test01'

/usr/local/mysql/bin/mysql -uroot -ptest01 -e 'select now();' #그냥 확인용 or 복구 시간 확인.
#echo $?
#1 이면 제대로 안된거.

#덤프 복구시 필요. 안하면 에러남.
/usr/local/mysql/bin/mysql -uroot -ptest01 -e "set global max_allowed_packet=1000000000;"
/usr/local/mysql/bin/mysql -uroot -ptest01 -e "set global net_buffer_length=1000000;"
#--------------------------------------------------------------------------------------

echo "Start Restoring..."
#43번 dump 복구.
# --debug : 에러 확인용.
# -f 에러 무시 : 43번 덤프파일 duplication 에러남.
/usr/local/mysql/bin/mysql --debug -f -uroot -ptest01 < /usr/local/src/43_DB_ALL_20140820.sql

#설치시 나오는 duplication 정상.
#그외에 오류는 안 나야 됨.
#복구 끝나면 root 패스는 pass 이 됨.
#비교를 위해 test01로 설정.
/usr/local/mysql/bin/mysql -uroot -ptest01 -e 'select now();' #복구 시간 확인.
#--------------------------------------------------------------------------------------

#mysql 5.5.39 설치
#killall mysqld
service mysqld stop
cd /usr/local/src/mysql-5.5.39/
make install
cp -f /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chown -R mysql.mysql /usr/local/mysql
service mysqld start
#/usr/local/mysql/bin/mysql_fix_privilege_tables --password=pass
/usr/local/mysql/bin/mysql_upgrade --password=pass
/usr/local/mysql/bin/mysql -uroot -ppass -e 'select now();' #그냥 확인용.
chkconfig mariadb on

#마리아DB 설치 yum
service mysqld stop
service mariadb stop
ln -fs /usr/local/mysql/data/ /var/lib/mysql
yum -y remove mariadb mariadb-devel mariadb-libs mariadb-server
yum -y install mariadb mariadb-devel mariadb-libs mariadb-server
service mariadb start
mysql_upgrade --password=pass

완벽하지 않음.

마리아db 설치 완료 my.cnf 에 euckr 추가.
[mysqld]
...
#charset config
character-set-server=euckr
init_connect=SET collation_connection=euckr_korean_ci
init_connect=SET NAMES euckr
character-set-server=euckr
collation-server=euckr_korean_ci
...

2014년 8월 29일 금요일

setuid, setgid 제거.

#test 디렉토리 생성.
[root@localhost src]# mkdir test\

#확인
[root@localhost src]# ll
합계 4
drwxr-xr-x 2 root root 4096 2014-08-28 16:30 test

#setuid 퍼미션 설정
[root@localhost src]# chmod 4000 test/

#확인.
[root@localhost src]# ll
합계 4
d--S------ 2 root root 4096 2014-08-28 16:30 test

#0000 8bit로 setuid 퍼미션 제거 시도.
[root@localhost src]# chmod 0000 test/

#확인. 제거가 안됨.
[root@localhost src]# ll
합계 4
d--S------ 2 root root 4096 2014-08-28 16:30 test

#심볼링 형식으로 제거 시도.
[root@localhost src]# chmod -s test/

#확인. 제거가 이루어 짐.
[root@localhost src]# ll
합계 4
d--------- 2 root root 4096 2014-08-28 16:30 test

참고 : http://linuxg.net/how-to-set-the-setuid-and-setgid-bit-for-files-in-linux-and-unix/

ps. 참고사이트에서도  0755 같은 형태로 앞부분에 0(zeroi)를 주면 삭제된다고 나옴...; 뭐지..