2017년 1월 31일 화요일

CentOS yum repository 구축

인터넷이 없는 환경에서 yum repository를 구축해보자

. 우선 centos media를 다운로드 받자
CentOS-7-x86_64-Everything-1611.iso 같이 everything이 들어있는 미디어로 받았다.

. 로컬폴더에 cdrom을 복사했다.
# mkdir /data01/yum.repos.d/
# cp -R /media/cdrom/* /data01/yum.repos.d/

# vi /etc/yum.repos.d /local.repo

[local-repo]
name=Local Repository
baseurl=file:///data01/yum.repos.d/
enabled=1
gpgcheck=0

. etc에 로컬 repo설정 파일을 해당 경로로 지정한다.
# vi /etc/yum.repos.d /local.repo

[local-repo]
name=Local Repository
baseurl=file:///data01/yum.repos.d
enabled=1
gpgcheck=0


. yum-utils 설치
# yum --disablerepo=\* --enablerepo=local-repo install yum-utils


. createrepo 설치
# yum --disablerepo=\* --enablerepo=local-repo install createrepo

. selinux 모드 변경
# vi /etc/sysconfig/selinux
SELINUX=permissive

# getenforce
Enforcing
# setenforce 0
# getenforce
Permissive



. apache web server 설치
# yum --disablerepo=\* --enablerepo=local-repo install httpd

# systemctl start httpd.service
# systemctl status httpd.service
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since 화 2017-01-31 19:23:10 KST; 1s ago
     Docs: man:httpd(8)
           man:apachectl(8)
 Main PID: 17730 (httpd)
   Status: "Processing requests..."
   CGroup: /system.slice/httpd.service
           ├─17730 /usr/sbin/httpd -DFOREGROUND
           ├─17731 /usr/sbin/httpd -DFOREGROUND
           ├─17732 /usr/sbin/httpd -DFOREGROUND
           ├─17733 /usr/sbin/httpd -DFOREGROUND
           ├─17734 /usr/sbin/httpd -DFOREGROUND
           └─17735 /usr/sbin/httpd -DFOREGROUND




. 방화벽 중지
systemctl disable firewalld
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
Removed symlink /etc/systemd/system/basic.target.wants/firewalld.service.
systemctl stop firewalld
systemctl status firewalld
 firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)

 1 25 19:41:11 bidevkylinm1.bidevkylinclust systemd[1]: Starting firewalld - dynamic firewall daemon...
 1 25 19:41:12 bidevkylinm1.bidevkylinclust systemd[1]: Started firewalld - dynamic firewall daemon.
 1 31 17:00:43 bidevkylinm1.bidevkylinclust systemd[1]: Stopping firewalld - dynamic firewall daemon...
 1 31 17:00:44 bidevkylinm1.bidevkylinclust systemd[1]: Stopped firewalld - dynamic firewall daemon.


. createrepo 생성
mkdir -p /var/www/html/repos/
cd /var/www/html/repos/
# ln -s /data01/yum.repos.d/ ./centos74
# createrepo .
Spawning worker 0 with 2341 pkgs
Spawning worker 1 with 2341 pkgs
Spawning worker 2 with 2341 pkgs
Spawning worker 3 with 2340 pkgs
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs

Sqlite DBs complete


이제 yum을 사용할 서버에 들어가서 repo설정을 해보자

. etc에 내부 yum repository를 참조하도록 repo설정 파일을 해당 경로로 지정한다.
# vi /etc/yum.repos.d /birepos-c74.repo

[birepos-c74]
name=birepos Internal Repository
baseurl=http://10.203.9.208/repos/centos74/
enabled=1
gpgcheck=0



. yum repolist 목록에 뜨면 성공!
# yum repolist
...
birepos-c74                        birepos Internal Repository    9,363
...


# mkdir -p /etc/yum.repos.d/ ~/etc/yum.repos.d/
[root@bidevkylinm1 yum.repos.d]# mv C*  ~/etc/yum.repos.d/
[root@bidevkylinm1 yum.repos.d]# yum repolist
Loaded plugins: fastestmirror
Determining fastest mirrors
repo id                                                                                                                   repo name                                                                                                                                      status
birepos                                                                                                                   birepos Internal Repository                                                                                                                    9,363
repolist: 9,363

. repolist를 한개만 남겨두고 지워버리자
# mkdir -p /etc/yum.repos.d/ ~/etc/yum.repos.d/
# mv C* ~/etc/yum.repos.d/
# yum repolist
Loaded plugins: fastestmirror
Determining fastest mirrors
repo id            repo name          status
birepos            birepos              Internal Repository       9,363
repolist: 9,363

참조: https://www.lesstif.com/pages/viewpage.action?pageId=7634963

centos설치 후 공통 기본 세팅

1. ls 조회스타일 변경
# vi /etc/bashrc

내용추가
alias ls='ls --color=auto --time-style=long-iso'

2. bash 기본 문자셋 변경
# vi ~/.bashrc

내용추가
LANG=en_US.UTF8

3. data01 디스크 fdisk & 포맷 & 마운트 & fstab등록
# fdisk /dev/sdb

Command (m for help): p

Disk /dev/sdb: 1099.5 GB, 1099511627776 bytes, 268435456 sectors
Units = sectors of 1 * 4096 = 4096 bytes
Sector size (logical/physical): 4096 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk label type: dos
Disk identifier: 0xa91c86a9

   Device Boot      Start         End      Blocks   Id  System

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1):
First sector (256-268435455, default 256):
Using default value 256
Last sector, +sectors or +size{K,M,G} (256-268435455, default 268435455):
Using default value 268435455
Partition 1 of type Linux and of size 1024 GiB is set

Command (m for help): p

Disk /dev/sdb: 1099.5 GB, 1099511627776 bytes, 268435456 sectors
Units = sectors of 1 * 4096 = 4096 bytes
Sector size (logical/physical): 4096 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk label type: dos
Disk identifier: 0xa91c86a9

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1             256   268435455  1073740800   83  Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

# mkfs.xfs -f /dev/sdb
meta-data=/dev/sdb               isize=512    agcount=4, agsize=67108864 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=268435456, imaxpct=5
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=131072, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

# mkdir /data01
# mount /dev/sdb /data01
# vi /etc/fstab/
/dev/sdb                /data01                 xfs     defaults        0 0


4. ipv6 disable
# vi /etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

# shutdown -rf now
재시작

# nmcli device show
재시작 후 네트워크 확인하여 ipv6없으면 적용됨


5. 내부 yum repository가 구축되어 있을 때 지정하기

. etc에 내부 yum repository를 참조하도록 repo설정 파일을 해당 경로로 지정한다.
vi /etc/yum.repos.d /birepos.repo

[birepos]
name=birepos Internal Repository
baseurl=http://10.203.9.208/repos/centos/iso/
enabled=1
gpgcheck=0



. yum repolist 목록에 뜨면 성공!
# yum repolist
...
birepos                        birepos Internal Repository    9,363
...


# mkdir -p /etc/yum.repos.d/ ~/etc/yum.repos.d/
[root@bidevkylinm1 yum.repos.d]# mv C*  ~/etc/yum.repos.d/
[root@bidevkylinm1 yum.repos.d]# yum repolist
Loaded plugins: fastestmirror
Determining fastest mirrors
repo id                                                                                                                   repo name                                                                                                                                      status
birepos                                                                                                                   birepos Internal Repository                                                                                                                    9,363
repolist: 9,363

. repolist를 한개만 남겨두고 지워버리자
mkdir -p /etc/yum.repos.d/ ~/etc/yum.repos.d/
mv C* ~/etc/yum.repos.d/
yum repolist
Loaded plugins: fastestmirror
Determining fastest mirrors
repo id            repo name          status
birepos            birepos              Internal Repository       9,363
repolist: 9,363

Hyper-V에서 Linux설치 시 Disk IO이슈 Disk Aligment 해결

Hyper-V에서 Windows설치 시에는 성능이 분명히 좋았는데 이상하게 Linux를 설치하면 디스크 성능이 RAID임에도 불구하고 1개  Disk성능 밖에 나오지 않았다.

살펴보니 Disk생성 시 SectorSize를 줘서 Powershell로 생성하게 되면 Linux에서도 동일한 성능을 보장한다.

명령어 : New-VHD

New-VHD [-Path] <String[]> [-SizeBytes] <UInt64> [-AsJob] [-BlockSizeBytes <UInt32> ] [-CimSession <Microsoft.Management.Infrastructure.CimSession[]> ] [-ComputerName <String[]> ] [-Credential <System.Management.Automation.PSCredential[]> ] [-Dynamic] [-LogicalSectorSizeBytes <UInt32> {512 | 4096} ] [-PhysicalSectorSizeBytes <UInt32> {512 | 4096} ] [-Confirm] [-WhatIf] [ <CommonParameters>]


Sector Size를 4KB로 고정하고  os를 설치해 보았다.
New-VHD -Path "E:\Hyper-V\os.vhdx" -SizeBytes 512GB –LogicalSectorSize 4KB

이렇게 생성된 vhdx파일로 linux설치 후 io성능 측정을 위해서 hdparm을 돌려봤다.

# hdparm -tT /dev/sda

/dev/sda:
 Timing cached reads:   16392 MB in  2.00 seconds = 8207.08 MB/sec
 Timing buffered disk reads: 6658 MB in  3.00 seconds = 2219.23 MB/sec

# hdparm -tT --direct /dev/sda

/dev/sda:
 Timing O_DIRECT cached reads:   2752 MB in  2.00 seconds = 1375.90 MB/sec
 Timing O_DIRECT disk reads: 11888 MB in  3.00 seconds = 3962.17 MB/sec


디스크 1개 성능이 나올때 겨우 200~300MB/sec이 나왔었는데 잘나온다 ^^b
끝~~

CentOS cdrom에서 yum구동

서버의 경우 인터넷이 없는 경우가 많아서 yum이 되지 않는다.
이 경우 되도록 media를 다운로드 받을 때
CentOS-7-x86_64-Everything-1611.iso 으로 받은 후에 다음과 같이 media에서 yum가능하도록 설정해보려고 한다.

1. media하위에 cdrom폴더를 생성 후 mount한다.
mkdir /media/cdrom
mount /dev/sr0 /media/cdrom


2. yum 실행 시 항상 다음의 옵션을 붙여서 media에서만 실행되도록...
yum --disablerepo=\* --enablerepo=c7-media …

설명을 덧붙이자면 /etc/yum.repos.d/ 폴더에는 가능한 yum 레포지토리 목록이 나열되어 있는데 모두 disable하고 dvd미디어에서만 설치가능하도록 하는 옵션이다.
c7-media 레포지토리는  CentOS-Media.repo 파일에 정의되어 있고 /media/cdrom폴더를 참조하도록 되어 있다.

[c7-media]
name=CentOS-$releasever - Media
baseurl=file:///media/CentOS/
        file:///media/cdrom/
        file:///media/cdrecorder/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

참조: https://wiki.centos.org/TipsAndTricks/CreatingUpdateMedia

2017년 1월 25일 수요일

Hyper-V에서 2세대로 Linux설치 시 부팅 실패

Hyper-V에서 1세대말고 2세대로 Linux를 설치하려고 할때 꼭 에러가 난다.



Secure Boot Verification 이 문제

설정에서 펌웨어->보안부팅사용 이라는 부분을 꺼주면된다.


2017년 1월 10일 화요일

사용자 연주 컬럼 생성하기 (연주(년주) 개념 이해)

연주라는 한해의 주차를 세는 기준이 시스템별로 모두 다르다는 것을 최근에 알게되었다. 그래서 보다보니 사연이 많다.

가장 큰 문제가 연도가 넘어갈 때 인데 12.31(화), 1.1(수) 라면 연주를 주 중간이라도 자르고 새로 1주차부터 시작하느냐? 아니면 한주는 하나의 주차를 유지해야하느냐 이다.
이는 정답이 없고 필요성에 따라서 선택하면 되는 문제이다.

대략 내가 고려하는 연주의 종류는 연도와 함께 쓰일때 아래 3가지 중에 하나이다.

1. 연도가 바뀌면 무조건 1.1은 신년 1주차부터 시작해야 한다. (주의 시작요일은 일정)
2. 연도와 관계없이 한주는 7일을 보장해야 한다.
3. 1.1부터 7일 단위로 주차를 산정한다. (매년 주의 시작요일이 다르다)

위의 3가지 말은 큰 차이를 보인다.
1. MS SQL Server 의 YYYY, WW 기준
2. Oracle 의 IYYY, IW 기준
3. Oracle 의 YYYY, WW 기준

쿼리와 결과로 2번과 3번을 비교해보면 아래와 같다.

SELECT DT
, TO_CHAR(TO_DATE(DT,'YYYYMMDD'),'YYYY') AS YYYY
, TO_CHAR(TO_DATE(DT,'YYYYMMDD'),'WW')   AS WW
, TO_CHAR(TO_DATE(DT,'YYYYMMDD'),'IYYY') AS IYYY
, TO_CHAR(TO_DATE(DT,'YYYYMMDD'),'IW')   AS IW
FROM CALN WHERE DT BETWEEN '20161230' AND '20170102';


IYYY와 IW는 연도가 바뀌어도 7일을 보장하기 위해서 주차를 유지한다.
이 방식은 가끔은 연도가 바뀌기도 전에 미리 연도가 바뀌어버린다.
아래는 2017~2018년도 넘어갈때 상황이다.




아직 2019년이 안됐는데도 12.31에 연도가 넘어갔다. ㅎㅎ
원칙을 살펴보니 이렇다.
12.31이 월~수이면 연도가 미리 넘어가고 
12.31이 목~일이면 연도가 1.1이 되어도 전년도가 유지된다.


가끔 현업들은 월~일 기준이 아닌 일~토, 목~수와 같은 이상한 자기만의 연주를 OLAP차원으로 요구하기도 하는데 대체로 주별보고일자 전날까지를 한주가 끝나는 날짜로 요구한다. ㅎㅎㅎ 

1번방식 (연도가 넘어가면 무조건 연도변경 후 1주차부터 세는 방식)은 심플하고 크게 문제될 것이 없으나 연도가 변경될때 최근 7주일이 2개의 연도로 쪼개져서 문제가 발생한다.

그래서 2번 방식 (7일이 보장되는 연주)으로 기준요일별로 연주를 리턴하는 스칼라 함수를 만들어보았다. 아래처럼 주시작요일을 정하면 IYYY, IW 산정로직에 준해서 연주를 생성해준다. 

SELECT DT
     , DATEPART(WEEKDAY,DT)           AS DW
     , dbo.UFN_YYYYWW(DT,1,'IYYYIW')  AS IYYYIW

     , dbo.UFN_WEEKDAY(DT,2)           AS     DW_월기준
     , dbo.UFN_YYYYWW(DT ,2,'IYYYIW')  AS IYYYIW_월기준

     , dbo.UFN_WEEKDAY(DT,5)           AS     DW_목기준
     , dbo.UFN_YYYYWW(DT ,5,'IYYYIW')  AS YYYYWW_목기준
FROM   DW_DT
WHERE  DATEPART(dayofyear,DT) > 358 OR DATEPART(dayofyear,DT) < 7
ORDER BY DT



아래 함수 2개를 만들어서 해결한건데... 생각보다 골머리가 아팠다.
아직까진 버그가 없는듯...


ALTER FUNCTION dbo.UFN_WEEKDAY (@DT DATE, @CRITN_WEEKDAY TINYINT = 1)
RETURNS TINYINT
AS
BEGIN
      RETURN CASE WHEN @CRITN_WEEKDAY NOT BETWEEN 1 AND 7
                  THEN 0
                  ELSE (DATEPART(WEEKDAY,@DT)+(7-@CRITN_WEEKDAY))%7+1 END
END;


ALTER FUNCTION dbo.UFN_YYYYWW (@DT DATE, @CRITN_WEEKDAY TINYINT = 1, @FORMAT VARCHAR(6) = 'IYYYIW')
RETURNS INT
AS
BEGIN
    DECLARE @WEEKDAY_LY_0101 TINYINT = dbo.UFN_WEEKDAY(CONVERT(DATE,CONVERT(VARCHAR(4),DATEADD(YEAR,-1,@DT),112)+'0101'),@CRITN_WEEKDAY)
          , @WEEKDAY_CY_0101 TINYINT = dbo.UFN_WEEKDAY(CONVERT(DATE,CONVERT(VARCHAR(4),@DT                 ,112)+'0101'),@CRITN_WEEKDAY)
          , @WEEKDAY_NY_0101 TINYINT = dbo.UFN_WEEKDAY(CONVERT(DATE,CONVERT(VARCHAR(4),DATEADD(YEAR,1 ,@DT),112)+'0101'),@CRITN_WEEKDAY)

          , @DT_LY_0101 DATE = CONVERT(DATE,CONVERT(VARCHAR(4),DATEADD(YEAR,-1,@DT),112)+'0101')
          , @DT_CY_0101 DATE = CONVERT(DATE,CONVERT(VARCHAR(4),@DT                 ,112)+'0101')
          , @DT_NY_0101 DATE = CONVERT(DATE,CONVERT(VARCHAR(4),DATEADD(YEAR,1, @DT),112)+'0101')

    DECLARE @BIT_LY    SMALLINT = CASE WHEN @WEEKDAY_LY_0101 BETWEEN 5 AND 7 THEN 1 ELSE 0 END
          , @BIT_CY    SMALLINT = CASE WHEN @WEEKDAY_CY_0101 BETWEEN 5 AND 7 THEN 1 ELSE 0 END
          , @BIT_NY    SMALLINT = CASE WHEN @WEEKDAY_NY_0101 BETWEEN 5 AND 7 THEN 1 ELSE 0 END

    DECLARE @DY_LY SMALLINT = DATEDIFF(DAY,@DT_LY_0101,@DT)+1
          , @DY_CY SMALLINT = DATEPART(dayofyear,@DT)

    DECLARE @YYYY         SMALLINT = DATEPART(YEAR,@DT)
          , @YYYY_LY      SMALLINT = DATEPART(YEAR,@DT)-1
          , @YYYY_NY      SMALLINT = DATEPART(YEAR,@DT)+1
          , @WW           SMALLINT = ((@DY_CY + dbo.UFN_WEEKDAY(@DT_CY_0101,@CRITN_WEEKDAY) + 5)/7)
          , @WW_LY        SMALLINT = ((@DY_LY + dbo.UFN_WEEKDAY(@DT_LY_0101,@CRITN_WEEKDAY) + 5)/7) - @BIT_LY
          , @WW_CY        SMALLINT = ((@DY_CY + dbo.UFN_WEEKDAY(@DT_CY_0101,@CRITN_WEEKDAY) + 5)/7) - @BIT_CY

    DECLARE @TYPE TINYINT = CASE WHEN DATEDIFF(DAY,@DT,@DT_NY_0101) < @WEEKDAY_NY_0101 AND @WEEKDAY_NY_0101 > 1     
                                 THEN CASE WHEN @BIT_NY = 1 THEN 1                          -- 연말+전년귀속
                                                            ELSE 2 END                      -- 연말+금년귀속
                                 WHEN DATEDIFF(DAY,@DT_CY_0101,@DT) <= (7-@WEEKDAY_CY_0101) AND @WEEKDAY_CY_0101 > 1
                                 THEN CASE WHEN @BIT_CY = 1 THEN 3                          -- 연초+전년귀속
                                                            ELSE 4 END                      -- 연초+금년귀속
                                                            ELSE 5 END                      -- 일반

    RETURN CASE WHEN @FORMAT = 'IYYYIW' THEN CASE @TYPE WHEN 1 THEN @YYYY   *100+@WW_CY
                                                        WHEN 2 THEN @YYYY_NY*100+1
                                                        WHEN 3 THEN @YYYY_LY*100+@WW_LY
                                                        WHEN 4 THEN @YYYY   *100+@WW
                                                        WHEN 5 THEN @YYYY   *100+@WW_CY
                                             END 
                WHEN @FORMAT = 'IYYY'   THEN CASE @TYPE WHEN 1 THEN @YYYY  
                                                        WHEN 2 THEN @YYYY_NY
                                                        WHEN 3 THEN @YYYY_LY
                                                        WHEN 4 THEN @YYYY  
                                                        WHEN 5 THEN @YYYY  
                                             END 
                WHEN @FORMAT = 'IW'     THEN CASE @TYPE WHEN 1 THEN @WW_CY
                                                        WHEN 2 THEN 1
                                                        WHEN 3 THEN @WW_LY
                                                        WHEN 4 THEN @WW
                                                        WHEN 5 THEN @WW_CY
                                             END
                ELSE 0 END
END;