20190310のLinuxに関する記事は5件です。

Linuxの時刻合わせ

はじめに

例えばシステムに障害が起きた時など、ログを確認する時には日時が非常に重要です。
複数のサーバーでシステムを構成している場合、それぞれのサーバーの時刻がバラバラだと、障害時に状況の把握や原因究明の足枷となる可能性があります。

以下は、自宅で運用しているサーバーで使っている時刻合わせのスクリプトと、その設定方法です。
本番環境では負荷に耐えられるNTPサーバーを指定したり、時刻合わせの間隔を調整する必要があるので、スクリプトや設定を適宜修正する必要があると思いますが、何かの参考になれば幸いです。

使用した環境

  • OS:CentOS 6.10

事前準備

  • 時刻合わせに使うntpdateパッケージをインストールしておきます。
  • ntpと異なり、ntpdateコマンドは「NTPサーバーとの時刻差が大きくてもエラーとならない」のが特徴です。
[root@kumotori ~]# yum install ntpdate -y

時刻合わせ用スクリプト

  • 時刻合わせに使うNTPサーバーは、googleのPublic NTPサーバー(time.google.com)を指定しています。
  • /sbin/clock --systohcは「ハードウェアクロックをシステムクロックに合わせる」という設定です。
    • ハードウェアクロック:マザーボード上で管理される時刻で、OSをシャットダウンしても消えませんが、マザーボード上の電池(ボタン電池)が切れると消えてしまいます。
    • システムクロック:OSが管理する時刻で、OSがシャットダウンすると消えてしまいます。
ntpdate.sh
#!/bin/sh

/usr/sbin/ntpdate -s time.google.com
/sbin/clock --systohc

タイムゾーンの設定

スクリプトの配置

  • 任意のフォルダに上記のスクリプトを配置しています。
    • 私は/root/scriptsというフォルダを作って、そこに上記のスクリプトを配置しています。
  • 配置した後、スクリプトに実行権限(x)を付けておきます。
  • 最後にcrontab -eで、crontabに「毎時30分に上記のスクリプトを実行する」と設定して完了です。
[root@kumotori ~]# chmod 744 /root/scripts/ntpdate.sh 
[root@kumotori ~]# ls -l /root/scripts/
合計 4
-rwxr--r--. 1 root root 75  3月 10 15:48 2019 ntpdate.sh
crontab
### ntpdate.
30 * * * * /root/scripts/ntpdate.sh
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Creating Xilinx Linux SD boot image for Zybo Z7-20 on Windows10 (Ubuntu16.04 WSL)

Environment

  • Ubuntu 16.04 is installed on WSL.
  • Vivado 2018.3 WebPack is installed both on Windows and WSL Ubuntu 16.04 to default paths.

Maybe it can be done only with WSL Ubuntu 16.04 . (But my vcXsrv often freezes with GUI applications.)

Working path

  • Windows 10 d:\xlnx
  • WSL Ubuntu 16.04 /mnt/d/xlnx

Install Digilent board files into Vivado

$ sudo apt install git
$ git clone https://github.com/Digilent/vivado-boards

Then copy ./vivado-boards/new/board_files/* to C:\Xilinx\Vivado\2018.3\data\boards\board_files (See 'Digilent board file installation guide')

Create a CPU design for Zybo Z7-20 (Vivado)

Invoke Vivado on Windows 10.

  1. Select File->Project->New
  2. Click "Next" and "Next", setting:
    • Project Name : zybo_z7_20_linux
    • Project Path : d:/xlnx
    • Board : Zybo Z7-20
  3. Create Block Design
    • Design Name: cpu
  4. Click + in diaglam window
  5. Select ZYNQ7 Processing System
  6. Run Block Automation and click OK
  7. Connect FCLK_CLK0 to M_AXI_GP0_ACLK
  8. Create HDL wrapper (A pop-up menu appears with right click on cpu in Sources window.), click OK.
  9. Click Generate Bitstream
  10. Select File->Export->Hardware, check Include bitstream, click OK

Setting environmet variables

Create following env.sh

env.sh
#!/bin/sh

export CROSS_COMPILE=arm-linux-gnueabihf-
export ARCH=arm

export PATH=$PATH:/mnt/d/xlnx/u-boot-xlnx/tools
source /tools/Xilinx/Vivado/2018.3/settings64.sh

Apply it.

$ source env.sh

Build Xilinx u-boot

Because u-boot-xlnx v2018.3 does not have Zybo Z7-20 configuration, need to clone snapshot

$ git clone https://github.com/Xilinx/u-boot-xlnx

The hash of the commit was,

$ git rev-parse HEAD
195c620e348891ca2d90c759781413f2adb3f748

Append the following line to u-boot-xlnx/configs/zynq_zybo_z7_defconfig

CONFIG_OF_EMBED=y
CONFIG_CMD_NET=n

CONFIG_OF_EMBED=y embeds device tree for the board into binary. CONFIG_CMD_NET=n prevents BOOTP tries few times before bootm runs.
If the system does not have flex and bison,

$ sudo apt install flex bison

Build u-boot.

$ cd u-boot-xlnx
$ make zynq_zybo_z7_defconfig
$ make
$ cd ..

Build Xilinx Linux kernel

$ wget https://github.com/Xilinx/linux-xlnx/archive/xilinx-v2018.3.tar.gz
$ tar zxvf xilinx-v2018.3.tar.gz
$ rm xilinx-v2018.3.tar.gz
$ cd linux-xilinx-v2018.3
$ make ARCH=arm xilinx_zynq_defconfig
$ make ARCH=arm UIMAGE_LOADADDR=0x8000 uImage
$ cd ..

Build DTC

$ git clone https://git.kernel.org/pub/scm/utils/dtc/dtc.git
$ cd dtc
$ make
$ cp dtc ../u-boot-xlnx/tools
$ cd ..

Create RAM disk image (see Xilinx wiki)

Download arm_ramdisk.image.gz to /mnt/d/xlnx (d:/xlnx) from here. Then create RAM disk image.

mkimage -A arm -T ramdisk -C gzip -d arm_ramdisk.image.gz uramdisk.image.gz

Because WSL Ubuntu does not have loop device, we cannot mount the root file system as in Xilinx wiki. To modify the image, other Linux computer should be prepared on VMs or PCs.

My own modification on rootfs

  1. Eliminating two lines of fstab mounting SD card to /mnt : I do not know the exact reason why the two lines do not work properly. (/dev/mmcblk0p1 may not be prepared when the auto-mount is invoked.)
  2. Inserting 'mount /dev/mmcblk0p1 /mnt' into /etc/init.d/rcS just before executing /mnt/init.sh.: init.sh placed at root of the SD card is automatically executed at the end of rcS. So init.sh is a convenient mean for us to insert start-up operation without modifying rootfs.

Create FSBL and Device Tree Blob (XSDK on WSL Ubuntu 16.04)

First, download device tree files.

$ wget https://github.com/Xilinx/device-tree-xlnx/archive/xilinx-v2018.3.tar.gz
$ tar zxvf xilinx-v2018.3.tar.gz
$ rm xilinx-v2018.3.tar.gz

Invoke XSDK.

$ xsdk &

Create hardware platform specification

  1. Set workspace directory as /mnt/d/xlnx
  2. Select File->New->Project, select Xilinx->'Hardware Platform Specification', click Next
  3. Set project name to zybo_z7_20_linux_hw, set Target Hardware Specification to /mnt/d/xlnx/zybo_z7_20_linux/zybo_z7_20_linux.sdk/cpu_wrapper.hdf, click Finish

Create FSBL

  1. Select File->New->Application Project, set project name to zybo_z7_20_linux_fsbl
  2. Confirm zybo_z7_20_linux_hw is selected as Hardware Platform
  3. Click Next, Select Zynq FSBL, click Finish

Create devicetree

  1. Select Xilinx->Repositories, select /mnt/d/xlnx/device-tree-xlnx-xilinx-v2018.3 in Global Repositories, click Rescan Repositories, Apply, then OK
  2. Set Project name to zybo_z7_20_linux_dt_0, select 'device_tree' in 'Board Support Package OS', click 'Finish', then 'OK'

Modify and build device tree

At /mnt/d/xlnx/zybo_z7_20_linux_dt_0 (WSL Ubuntu 16.04), revise following lines in system-top.dts

system-top.dts
09 #include "zynq-7000.dtsi"
10 #include "pcw.dtsi"
21         memory {
system-top.dts(revised)
09 /include/ "zynq-7000.dtsi"
10 /include/ "pcw.dtsi"
21         memory@0 {

Insert the description of Ethernet PHY into &gem0 node in system.dts

system.dts
&gem0 {
    local-mac-address = [00 0a 35 00 00 00];
    phy-handle = <&ethernet_phy>;
    ethernet_phy: ethernet-phy@0 {
              reg = <0>;
    };
};

Compile device tree as,

dtc -I dts -O dtb -o devicetree.dtb system-top.dts

Create boot image

At /mnt/d/xlnx (WSL Ubuntu 16.04),

$ mkdir zybo_z7_20_linux_boot
$ cd zybo_z7_20_linux_boot
$ cp ../zybo_z7_20_linux_hw/cpu_wrapper.bit fpga.bit
$ cp ../zybo_z7_20_linux_fsbl/Debug/zybo_z7_20_linux_fsbl.elf fsbl.elf
$ cp ../u-boot-xlnx/u-boot u-boot.elf
$ cp ../linux-xlnx-xilinx-v2018.3/arch/arm/boot/uImage uImage
$ cp ../uramdisk.image.gz uramdisk.image.gz
$ cp ../zybo_z7_20_linux_dt_0/devicetree.dtb devicetree.dtb

Create boot.bif as

boot.bif
image : {
      [bootloader]fsbl.elf
      fpga.bit
      u-boot.elf
}

Run bootgen

bootgen -image boot.bif -o i boot.bin

Boot

Move follwing files to a SD card.
- boot.bin
- devicetree.dtb
- uramdisk.image.gz
- uImage

  1. Insert SD card to the slot.
  2. Confirm 'JP5' is in SD boot configuration.
  3. Connect USB cable to PROG/UART port
  4. Slide power switch and open the serial terminal with 115200 bps. IMAG0406.jpg zybo-boot.PNG
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Polybarの番号によるフォント指定に関する注意点

「設定したフォント番号」と「番号によるフォント指定」のズレ

フォント番号設定は0-based indexなのにフォント指定は1-based indexだから注意してね、という話です。

ドキュメントには "*-font = 1 will use font-0" って書かれてます。

具体例を出すと、

~/.config/polybar/config
font-0 = "Fira Code:pixelsize=10;3"
font-1 = "Osaka:pixelsize=14;3"

のフォント番号設定がある時、

~/.config/polybar/config
bar-fill-font = 1
bar-empty-font = 2

のフォント指定では、

  • bar-fill-font -> Fira Code
  • bar-empty-font -> Osaka

になります。

これを間違えて「アイコン表示できない!」って戸惑う人が現れないことを祈ります。現れたらこの記事が参考になってほしい。

まとめ

0-based indexと1-based indexは0オリジンと1オリジンとも呼ばれるらしい

参考

Fonts - jaagr/polybar

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

linuxでメモリ解放の話〜分かり易いイメージで〜

はじめに

linux環境で、なんか動作がもっさりしてきたな〜って時にめもりが原因だった場合の対処法。

その前に

まずメモリの話から。と言っても当方そっちの専門家じゃないので、詳しい人に聞いた感じ。

そもそもメモリって

PCにおいて主な計算はCPUによって行われています。しかし、CPUはHDDやSSDなどの記録媒体から直接データを読み込んだり計算したりはできないのです。そこでメモリは、一時的に記憶媒体などからデータを読取り、CPUが計算できる様にする役割があります。
もっとわかりやすく、イメージしてもらうために、ここで一つ個人的にわかりやすかった例え話を。

皆さん、小学校で使われている机をイメージしてみいてください。天盤の下に教科書とかが入れられるタイプのアレです。そして、そこで作業をしようとする自分を思い浮かべてください。
そうすると、

机の中・・・HDDなどの記憶媒体
机の上・・・メモリ
自分・・・CPU

という感じで対応ができます。
まずあなたが作業しようとした時、机の中にある道具やら何やらをそのまま机の中で作業するのは難しいかと思います。なので、机の上に色々出して作業するかと思います。これと同じ様なことがPCでも起こっております。この時、作業するために机の上に出したあれこれを、作業が終わった後に机の中に戻すはずなのですが、「また後でつかうかも?」と思うと、一旦そのままにしてしまうことがあるかと思います。そしてそれを多用すると、机の上にあれこれが沢山残っている状態ができてしまうのです。この状態が所謂「キャッシュが溜まっている」ってやつです。

よくこのキャッシュが有ると「重くなる」と思っている人が多いかと思いますが、それは思い違いであることが多いです。考えてみてください、机の上にあるモノを参照するのと、机の中にあるモノを参照するの、どちらが早いか。明らかに机の上にあるモノを参照した方が速いことがわかると思います。
ではなぜキャッシュが多くなると「重くなる」とおもわれるのでしょうか?それは机の上のモノがたくさんある状態で、机の中のモノを出さないといけない場合を考えてみてください。その場合、机の上にある当分使いそうに無い、又は使っていなかったモノを一旦捨てるか机の中に戻す作業を挟まなければなりません。この動作が頻繁に起こると「重くなる」という現象が起こります。

ここからが本題

溜まったキャッシュは基本的に自動的で管理されるのですが、それを強制的に消去する方法をいくつか紹介します。が、強制的にキャッシュを消去すると、キャッシュを参照して動作しているアプリが誤作動する可能性があり、最悪データが破損しかねません。なので、危険性の少ない方から順に紹介していきます。というかぶっちゃけ再起動するのがいいんだけど、それができない環境での措置ってことで。

当方の環境はこんな感じ。

OS: Cent OS 7

方法其ノ壱

$   sync

スタンダードな、よくある方法。

方法其ノ弐

$   echo 1 > /proc/sys/vm/drop_caches

キャッシュの中でも、消しても大丈夫そうなのを消去。

方法其ノ参(非推奨)

$   echo 3 > /proc/sys/vm/drop_caches

取り敢えず全部のキャッシュを消去。

方法其ノ肆(めっちゃ非推奨)

$   du -s /;\
    sync && sync && sync;\
    echo 3 > /proc/sys/vm/drop_caches

duコマンドでキャッシュを整理。
syncコマンドで少し解放。三回やってるのは念の為。
drop_cachesで全てのキャッシュを解放。

最後に

実行は自己責任にてお願いします。
取り敢えず、書いてみた感がすごいけど、メモリの解放はあまりオススメはできませんので悪しからず。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CentOS 7でBINDの設定をするメモ

セキュリティ意識した設定とかではないです.
ゆるーく適当に動かすためのメモです.

  • BINDのインストール

途中でインストールして良いか聞かれたら y を入力してEnter.

# yum install bind bind-utils
  • ファイアウォールの設定

デフォルトではブロックされているのでDNSを許可するようにする

# firewall-cmd --add-service dns --permanent // 再起動しても設定を有効化する
# firewall-cmd --reload // リロード
# firewall-cmd --list-services // 通信が許可されているか確認
  • named.confの設定

BINDの設定ファイルである named.conf, また正引き, 逆引きの設定ファイルである <ドメイン名>, <ドメイン名>.rev という名前のファイルを作成しておく.
それぞれのファイルはどこかから雛形を引っ張ってくるなり, 自分で書くなりする.

# touch named.conf
# touch <ドメイン名>
# touch <ドメイン名>.rev

named.conf のシンボリックリンクを貼る

# ln -sf /var/named/named.conf /etc

named.conf をゴリゴリ書く.
いろいろ端折ってる.

options {
    listen-port 53 { 127.0.0.1; };
    ...
    directory    "/var/named"
    ...
    allow-transfer {};
    allow-query {};
    allow-recursion {};
    allow-query-cache {};
};

...

zone "hoge.piyo" {
    type master;
    allow-query { any };
    file "hoge.piyo";
};

zone "X.0.168.192.in-addr.arpa" {
    type master;
    allow-query { any };
    file "hoge.piyo.rev";
};

listen-port にはDNSのサービスを動作させるポート番号と, IPアドレスを指定する.

directory には, named.conf が存在するディレクトリを指定する.

allow-transfer にはセカンダリDNSサーバのIPアドレスを指定する.
セカンダリDNSサーバを用意しない場合は // でコメントアウトする.

allow-query にはクエリ(問い合わせ)全般を受け付けるかどうかを書く.
any ならどこからでも, ネットワークアドレス(プレフィックス表記)を指定したら指定したネットワークの範囲のみ.

allow-recursion には再帰問い合わせを受け付けるかどうかを書く.
つまりフルサービスリゾルバとして動作させるかということ.
any ならどこからでも, ネットワークアドレス(プレフィックス表記)を指定したら指定したネットワークの範囲のみ.

allow-query-cache にはキャッシュを返すのを許可するかどうかを書く.
any ならどこからでも, ネットワークアドレス(プレフィックス表記)を指定したら指定したネットワークの範囲のみ.

zone にはゾーン情報を書く.
正引きは "<ドメイン名>", 逆引きは "<IPアドレスの逆順>.in-addr.arpa" を指定する.
また, file にはそれぞれのドメインのゾーン情報を記述するファイルのパスを書く.

  • 正引き・逆引きの設定

イイ感じにやる(めんどいので省略).

  • BINDの起動
# systemctl start named.service // すでに起動している場合はrestart
# systemctl enable named.service // 再起動しても設定を有効化する
  • 動作確認
$ ping <IPアドレス> // IP到達性があるか
$ nmap -sU -p 53 <IPアドレス> // UDPポート53番が開いているか
$ dig <ドメイン名> // DNSのサービスとしてちゃんと動いているか

ぼくは listen-port の設定ミスで動かなかったので注意してネ.

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む