Introduction
2012년 가을쯤 mac mini server 2012 late 버전을 구입 했다.
i7-3세대, 2.3GHz, 쿼드코어
RAM 8GB (기본 4GB 에서 추가)
SSD 2TB (1TB X 2)
mac mini 에서 ssd 가 1개 (1TB) 더 추가 돼 있고, OS X Server 가 기본 제공 된다.
생각 보다 별거 없는 구성이라 살짝 허탈 하기도 했다.
처음에는 언제 어디서나 원격으로 xcode 로 개발을 할수 있으니 좋다 라며 만족고 썼지만 어느순간 본래의 목적 보다는 단순히 홈 미디어 서버로 전락 해 버렸다.
어느순간 ux 도 필요 없게 됐고, 서버에 올린 서비스만 필요하게 되면서 자연스럽게 os 교체를 생각하게 됐다.
주위에서는 비싸게 맥미니를 사서 뭐하는 거냐 라고 하지만 그 어떤 서버보다 조용 했고, 전기를 적게 먹었으며 안정적 이었다.
2020년 10월 기준 8년간 사용 했으며 uptime 최고 기록은 1년 6개월 정도 였던것 같다.
CentOS 7.x 설치용 USB 준비
설치할 centos 의 이미지 (iso) 를 준비 한다.
평소 가벼운걸 선호 하기 때문에 minimal.iso 파일을 다운 받았다.
centos 7.5.1804 minimal 설치 가능centos 7.8.2003 minimal 설치 가능2019년 7월 기준 버그로 인해 설치용 USB 를 만들경우 에러가 발생함
https://angrysysadmins.tech/index.php/2018/12/grassyloki/centos-7-failed-set-moklistrt
2020년 9월 30일 기준 centos 8 버전 중에서 가장 최신 버전
설치 usb는 만들어 졌지만, 설치 과정에서 disk 파티션 설정 중 에러가 발생 함
/boot/efi 파티션을 만들 수 없는 에러..
rescue mode 로 들어가서 fdisk 로 파티션을 모두 날리고 설치 해봤지만 정상적으로 설치되지 않았음boot disk 를 지정하지 않으면 설치가 가능하짐나 부팅시 정상적으로 centos 를 부팅 하지 못함
boot disk 를 지정하면 /boot/efi 파디션을 만들다가 에러가 발생 함
설치용 centos usb 제작
이 작업을 위해서는 mac os 장비가 필요하다.
usb 를 알맞은 형식으로 포멧
- 런처패드 > 디스크 유틸리티 실행
- usb 에서 마우스 오른쪽 “지우기” 선택
- Mac OS 확장 (저널링) 선택 후 지우기 실행
터미널 실행
# hdiutil convert -format UDRW -o <생성될 dmg 파일 이름> <원본 iso 파일 경로와 이름>
hdiutil convert -format UDRW -o centos7.x.xxxx.dmg ./CentOS-7.x.xxx.iso
# external 로 꼽혀 있는 usb 번호를 확인 ex) /dev/disk2 (external, physical)
diskutil list
# mount 상태에서는 설치 usb 를 만들수 없음 (unmount 상태로 복사 할 예정)
# diskutil unmountDisk <마운트된 디스크 이름>
diskutil unmountDisk /dev/disk2
# 아래의 명령을 치면 5~10분 정도 반응이 없음, 느긋하게 기다릴것 (커피 한잔..)
# 완료 되면 "삽입한 디스크를 컴퓨터에서 읽을수 없어요" 라는 에러 팝업이 뜸 (정상이니 당황 노노)
sudo dd if=centos7.x.xxx.dmg of=/dev/disk2 bs=1m
mac mini 에 centos 설치
준비된 USB 를 서버에 꼽고 재부팅
재부팅시 alt 키를 누르고 있으면 mac 의 부팅 관리자 메뉴가 뜨고, USB 를 선택
centos 설치
언어 선택
- 영어 /영어
소프트웨어 선택
- minimal install
- development tools
네트워크 & 호스트 옵션
- on 으로 설정하고 host name 을 원하는 이름으로 설정
날짜 시간 옵션
- Asia/Seoul 체크 후 network time on
- 네트워크를 먼저 설정하지 않으면 network time on 으로 변경 할 수 없음
파티션 옵션
path | size | file system | format |
---|---|---|---|
/home | 50 GB | LVM | ext4 |
/boot | 1 GB | standard partition | ext4 |
/boot/efi | 1 GB | standard partition | EFISystem Partition |
swap | 16 GB (메모리의 2배) | standard partition | swap |
/ | 나머지 | LVM | ext4 |
계정 패스워드 설정
- 설치중 root password, user creation 적용
centos 설정
selinux 보안설정 off
보안상 키는게 좋을것 같지만 제약이 많아져서 끄는 편
su -c "setenforce 0"
vi /etc/sysconfig/selinux
------------------------------
SELINUX=disabled
------------------------------
dns 설정
dnsever.com : 적은 비용으로 dns 를 사용할수 있다.
일정 주기로 dnsever 로 서버의 도메인 주소를 날리면 dnsever 에서 알아서 dns 를 갱신 해준다.
crontab -e
------------------------------
*/5 * * * * wget -O - --http-user=<dnsever 유저ID> --http-passwd=<dnsever 유저PW> 'http://dyna.dnsever.com/update.php?host[<내서버 도메인>]' > /dev/null 2>&1
------------------------------
epel repository 추가
yum install -y epel-release
root 로 ssh 로그인 제한
vi /etc/ssh/sshd_config
------------------------------
permitRootLogin no
------------------------------
systemctl restart sshd.service
생성한 계정에 패스워드 입력 없이 root 전환 설정
vi /etc/sudoers
------------------------------
<계정이름> ALL=(ALL) NOPASSWD:ALL
------------------------------
기본 유틸리티 설치
yum install -y net-tools telnet wget git
yum groupinstall -y 'Development Tools'
mac mini fan 동작 이슈
mac os 에서는 서버의 온도에 따라서 동적으로 fan 의 속도를 조절 해주는 프로그램도 있었는데 centos 에서는 cpu 온도가 올라가도 fan 의 rpm 이 그대로 유지된다. 어쩔수 없이 fan 을 돌려주는 스크립트를 작성 했다.
시스템 온도 모니터링을 위한 sensors 패키지 설치
yum install -y lm_sensors
# 모두 yes 입력
sensors-detect
# 출력되는 센서 정보 확인
sensors
팬 속도 컨트롤러 세팅
yum install -y python-pip
# 아래의 python script 작성
vi mac_fan_control.py
#!/usr/bin/env python
import sys, os, time
from daemon import Daemon
class MyDaemon(Daemon):
FAN_PATH = "/sys/devices/platform/applesmc.768/fan1"
TEMP_SENSOR_CORE_1 = "/sys/devices/platform/applesmc.768/temp5"
TEMP_SENSOR_CORE_2 = "/sys/devices/platform/applesmc.768/temp15"
def get_value(self, file_name):
value_file = open(file_name, "r")
value = int(value_file.readline())
value_file.close()
return value
def set_value(self, file_name, value):
os.system("echo " + str(value) + " | tee -a " + file_name)
def get_rotation(self, temp):
min_rotation = self.get_value(self.FAN_PATH + "_min")
max_rotation = self.get_value(self.FAN_PATH + "_max")
if min_rotation > max_rotation:
min_rotation = max_rotation
rotation = min_rotation
if temp > 80000:
rotation = max_rotation
elif temp > 70000:
rotation = 4000
elif temp > 65000:
rotation = 3500
elif temp > 60000:
rotation = 3000
elif temp > 55000:
rotation = 2500
else:
rotation = 1800
if rotation > max_rotation:
rotation = max_rotation
return rotation
def run(self):
#default fan speed setting
min_rotation = self.get_value(self.FAN_PATH + "_min")
self.set_value(self.FAN_PATH + "_min", min_rotation)
while True:
# Temperature of the cores
temp_core_1 = self.get_value(self.TEMP_SENSOR_CORE_1 + "_input")
temp_core_2 = self.get_value(self.TEMP_SENSOR_CORE_2 + "_input")
# <temp> as the hottest core
if temp_core_1 > temp_core_2:
temp = temp_core_1
else:
temp = temp_core_2
# Compare temperatures und set the fan speed
rotation = self.get_rotation(temp)
self.set_value(self.FAN_PATH + "_min", rotation)
# Wait x seconds
time.sleep(5)
if __name__ == "__main__":
daemon = MyDaemon('/var/run/mac_fan_control.pid')
if len(sys.argv) == 2:
if 'start' == sys.argv[1]:
daemon.start()
elif 'stop' == sys.argv[1]:
daemon.stop()
elif 'restart' == sys.argv[1]:
daemon.restart()
else:
print "Unknown command"
sys.exit(2)
sys.exit(0)
else:
print "usage: %s start|stop|restart" % sys.argv[0]
sys.exit(2)
작성한 스크립트를 service 로 추가 및 실행
vi /lib/systemd/system/mac_fan_control.service
------------------------------
[Unit]
Description=Mac fan controller
[Service]
Type=forking
PIDFile=/var/run/mac_fan_control.pid
ExecStart=/usr/bin/python <python script 경로>/mac_fan_control.py start
ExecStop=/usr/bin/python <python script 경로>/mac_fan_control.py stop
[Install]
WantedBy=multi-user.target
------------------------------
systemctl enable mac_fan_control.service
systemctl start mac_fan_control.service