20200906のLinuxに関する記事は9件です。

Node.js nを使い複数バージョンを共存させる

仕事でnode.jpを使用する機会があったのですが、
複数のシステムで様々なnodeのバージョンを使う機会があり、仮想環境(CentOs)でnodeのバージョン切り替えれるようにしました

Node.js と npm インストール

とりあえず、nodeとnpmをインストールします (CentOs)

yum install gcc gcc-c++
yum install nodejs npm –enablerepo=epel

※ついでにMacの場合は以下のコマンドで

brew install node

n のインストール

npm install -g n

nのパスを通す

~/.bash_profileを使用しパスを指定する
※ない場合は、作成してください。~/.profile, ~/.bashrcでも自分の好みのもので構いません

cd
vi .bash_profile

.bash_profileに以下の文言を買い込みます

export N_PREFIX=$HOME/.n
export PATH=$N_PREFIX/bin:$PATH

調整を適用

source .bash_profile

これで準備できました!

特定バージョンのインストール

最新バージョン

$ n –stable
$ n –latest
$ n latest

特定バージョン

$ n 5.7.1

バージョン切り替え

nコマンドを使用すると矢印キーとEnterキーで切り替えることができます

# n

ο   node/10.17.0
    node/12.18.3

Use up/down arrow keys to select a version, return key to install, d to delete, q to quit

これでnodeのバージョンを気楽に切り替えれるようになりました、本当に助かる

参考文献

https://qiita.com/jaxx2104/items/2277cec77850f2d83c7a
https://blog1.mammb.com/entry/2019/11/26/090000
https://qiita.com/bigplants/items/2d75bf552e0da4a7e822

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

自作OS事始め 1. 環境構築編

そうだ、OS作ろう!

というわけで、OSを作ってみたいと思います。
今回はGCCのクロスコンパイラを入手するところまでやっちゃいましょう。

用意するもの

  • Ubuntu 20.04

1. 依存関係のインストール

まずは、依存関係をインストールしていきます。

必要なものは以下の通りです。

  • curl
  • build-essential, m4
  • libgmp3-dev, libmpc-dev, libmpfr-dev
  • qemu, qemu-kvm

curlはお好みで、wgetなどでも構いません。

$ sudo apt update
$ sudo apt -y install curl build-essential m4 libgmp3-dev libmpc-dev libmpfr-dev qemu qemu-kvm

2. gmp、mpfr、mpc、binutilsのビルド

まずは、gmpをmakeします。--prefix=/usr/local/ccにしていますが、ここもお好みで構いません。ただし、この--prefixで指定した値はgmp、mpfr、mpc、binutilsで共通とした方が良いと思います。

まずはgmpから。

gmp
$ curl --output gmp-6.2.0.tar.bz2 https://ftp.gnu.org/gnu/gmp/gmp-6.2.0.tar.bz2
$ tar -xvf gmp-6.2.0.tar.bz2
$ cd gmp-6.2.0
$ ./configure --prefix=/usr/local/cc
$ make check && sudo make install
$ cd ..

つづいてmpfr、mpc、binutilsの順番でmakeしていきます。

mpfr
$ curl --output mpfr-4.1.0.tar.bz2 https://ftp.gnu.org/gnu/mpfr/mpfr-4.1.0.tar.bz2
$ tar -xvf mpfr-4.1.0.tar.bz2
$ cd mpfr-4.1.0
$ ./configure --prefix=/usr/local/cc
$ make check && sudo make install
$ cd ..
mpc
$ curl --output mpc-1.2.0.tar.gz https://ftp.gnu.org/gnu/mpc/mpc-1.2.0.tar.gz
$ tar -xvf mpc-1.2.0.tar.gz
$ cd mpc-1.2.0
$ ./configure --prefix=/usr/local/cc
$ make check && sudo make install
$ cd ..
binutils
$ curl --output binutils-2.35.tar.xz https://ftp.gnu.org/gnu/binutils/binutils-2.35.tar.xz
$ tar -xvf binutils-2.35.tar.xz
$ cd binutils-2.35
$ ./configure --target=x86_64-elf --prefix=/usr/local/cc --disable-nls
$ make
$ make install
$ cd ..

3. gccのビルド

さて、ついにGCCのmakeです。
ここで、注意点がいくつかあります。
1つ目は、gccのソースコードのディレクトリに入って、./configureとしてはいけないということです。そのようにしてしまうと、make all-target-libgccでこけます。
2つ目は、configureの引数の--with-xxxです。これは、それぞれ前の段階でgmp、mpfr、mpcの--prefixで指定したディレクトリを指定してください。
3つ目は、--with-as引数です。これは、ほかのものと違い、実行バイナリのパスを直接指定する必要があります。

gccのmake
$ curl --output gcc-10.2.0.tar.xz https://ftp.gnu.org/gnu/gcc/gcc-10.2.0/gcc-10.2.0.tar.xz
$ tar -xvf gcc-10.2.0.tar.xz
$ mkdir gcc-make-tmp
$ cd gcc-make-tmp
$ ../gcc-10.2.0/configure\
    --target=x86_64-elf\
    --prefix=/usr/local/cc\
    --disable-nls\
    --enable-languages=c\
    --without-headers\
    --with-gmp=/usr/local/cc\
    --with-mpfr=/usr/local/cc\
    --with-mpc=/usr/local/cc\
    --with-as=/usr/local/cc/bin/x86_64-elf-as # asコマンドのバイナリのパスを指定する
    # これがないとこけることがある(stdio.h: no such file or directory.)
    # こける場合は追加する
    # --with-headers=/usr/include\
    # --with-headers=/usr/include/x86_64-linux-gnu
$ # 結構な時間がかかるので、このコマンドを実行している間にお茶休憩をしましょう。
$ make all-gcc && make install-gcc
$ make all-target-libgcc && make install-target-libgcc

4. テスト

$ export PATH=/usr/local/cc/bin:$PATH
$ x86_64-elf-gcc -v
Using built-in specs.
COLLECT_GCC=x86_64-elf-gcc
COLLECT_LTO_WRAPPER=/mnt/d/usr/local/cc/libexec/gcc/x86_64-elf/10.2.0/lto-wrapper
Target: x86_64-elf
Configured with: (省略)
Thread model: single
Supported LTO compression algorithms: zlib
gcc version 10.2.0 (GCC)

このような出力がなされれば成功です。お疲れさまでした。

5. 感想

情報が少なくて苦労しました。特に、最後のgccのmakeがしんどかった。

binutilsはソースからビルドしましょう。

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

LicheePi NanoのSDブート用イメージをビルドしてみた

LicheePi Nano

Sipeedの小型の格安SBC。日本国内では秋月電子スイッチサイエンスで購入できる。
SocはAllwinner F1C100s, 32MB DDRと16MB SPI Flashが載っている
公式のドキュメントはこちら。中国語なのでChrome拡張のGoogle Translateとか使うと読みやすい

ビルド環境

Windows10をメイン機としているのでWSL2でUbuntu 18.04LTSを動かしてビルドした。インストール方法などはググれば出てくるので割愛(Ubuntu 20.04LTSだとbuildrootのビルドでエラーが出たので18.04LTSを使用)

SDカードを作成するのにはSurface Pro 3にインストールしたUbuntu 20.04.1LTSを使用した。

Toolchain

Linaro Toolchainからarm-linux-gnueabiの最新のバイナリをダウンロードする

$ wget http://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabi/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabi.tar.xz

適当な場所に配置する(例として/optに配置)

$ tar -vxJf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabi.tar.xz
$ sudo cp -r ./gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabi /opt/

.bashrcにパスを通す

/etc/bash.bashrc
# ファイル末尾に追加
PATH="$PATH:/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabi/bin"

U-boot

Lichee-PiのgithubリポジトリからLicheePi Nano用っぽいブランチをクローンする

$ git clone --depth=1 -b nano-v2018.01 https://github.com/Lichee-Pi/u-boot.git

LicheePi Nano用の.configを生成してビルド

$ cd u-boot/
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- licheepi_nano_defconfig
$ make ARCH=arm menuconfig //設定の確認
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- //ビルド

必要に応じてapt installで不足しているパッケージをインストールする

# 必要になったのは下記のものあたり
$ sudo apt install build-essential
$ sudo apt install gcc python swig python-dev bc
$ sudo apt-get install libncurses5-dev

Linux Kernel

Lichee-PiのgithubリポジトリからLicheePi Nano用っぽいブランチをクローンする

$ git clone --depth=1 -b nano-5.2-tf https://github.com/Lichee-Pi/linux.git

.confを公式からダウンロードする

$ cd linux
$ wget http://dl.sipeed.com/LICHEE/Nano/SDK/config
$ mv config .config
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j4

必要に応じてapt installで不足しているパッケージをインストールする

# 必要になったのは下記のものあたり
$ sudo apt install flex
$ sudo apt install bison
$ sudo apt install libssl-dev

buildroot

$ wget https://buildroot.org/downloads/buildroot-2017.08.tar.gz
$ tar xvf buildroot-2017.08.tar.gz
$ cd buildroot-2017.08/
# .configのダウンロード
$ wget https://fdvad021asfd8q.oss-cn-hangzhou.aliyuncs.com/migrate/buildroot.config
$ mv buildroot.config .config
$ make ARCH=arm menuconfig
$ make

必要に応じてapt installで不足しているパッケージをインストールする

# 必要になったのは下記のものあたり
$ sudo apt install unzip
$ sudo apt install libc6-i386 lib32stdc++6 lib32z1

ブート設定ファイル

boot.cmd
setenv bootargs console=tty0 console=ttyS0,115200 panic=5 rootwait root=/dev/mmcblk0p2 rw
load mmc 0:1 0x80C00000 suniv-f1c100s-licheepi-nano.dtb
load mmc 0:1 0x80008000 zImage
bootz 0x80008000 - 0x80C00000

boot.cmdからboot.scrを生成する

$ ./u-boot/tools/mkimage -C none -A arm -T script -d boot.cmd boot.scr

ブート用SDカード作成

WSL2だとUSBメモリにアクセスできないので別途Linux環境が必要(Surface Pro 3にインストールしたUbuntu 20.04.1LTSを使用した)
下記の必要なファイルをLinux環境にコピーする

  • u-boot/u-boot-sunxi-with-spl.bin
  • linux/arch/arm/boot/boot/zImage
  • linux/arch/arm/boot/boot/dts/suniv-f1c100s-licheepi-nano.dtb
  • buildroot-2017.08/output/images/rootfs.tar

以下ではSDカードは/dev/sdbとして認識されているとする

SDカードの編集

# すでにマウントされている場合はアンマウントする
$ sudo umount /dev/sdbx

# パーティション編集
$ sudo fdisk /dev/sdb
d //既存のパーティションを削除する
n //第1パーティション作成
p
1
+32M
n  //第2パーティション作成
p
2
p
w

## パーティションタイプ変更
$ sudo mkfs.vfat /dev/sdb1
$ sudo mkfs.ext4 /dev/sdb2

U-boot書き込み

$ sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8

bootファイルのコピー

$ sudo mount /dev/sdb1 /mnt/boot
$ sudo cp zImage /mnt/boot/
$ sudo cp boot.scr /mnt/boot/
$ sudo cp suniv-f1c100s-licheepi-nano.dtb /mnt/boot
$ sync
$ sudo umount /dev/sdb1

File Systemのコピー

$ sudo mount /dev/sdb2 /mnt/rootfs
$ sudo tar xvf rootfs.tar -C /mnt/rootfs/

Linux起動確認

U-Boot SPL 2018.01-g013ca45 (Sep 06 2020 - 06:07:34)
DRAM: 32 MiB
Trying to boot from MMC1


U-Boot 2018.01-g013ca45 (Sep 06 2020 - 06:07:34 +0900) Allwinner Technology

CPU:   Allwinner F Series (SUNIV)
Model: Lichee Pi Nano
DRAM:  32 MiB
MMC:   SUNXI SD/MMC: 0
*** Warning - bad CRC, using default environment

In:    serial@1c25000
Out:   serial@1c25000
Err:   serial@1c25000
Net:   No ethernet found.
starting USB...
No controllers found
Hit any key to stop autoboot:  0
switch to partitions #0, OK
mmc0 is current device
Scanning mmc 0:1...
Found U-Boot script /boot.scr
reading /boot.scr
279 bytes read in 14 ms (18.6 KiB/s)
## Executing script at 80c50000
reading suniv-f1c100s-licheepi-nano.dtb
5908 bytes read in 31 ms (185.5 KiB/s)
reading zImage
4173736 bytes read in 215 ms (18.5 MiB/s)
## Flattened Device Tree blob at 80c00000
   Booting using the fdt blob at 0x80c00000
   Loading Device Tree to 816fb000, end 816ff713 ... OK

Starting kernel ...

[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 5.2.0-licheepi-nano+ (pi@Windows10) (gcc version 7.5.0 (Linaro GCC 7.5-2019.12)) #2 Sun Sep 6 08:58:05 JST 2020
[    0.000000] CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=0005317f
[    0.000000] CPU: VIVT data cache, VIVT instruction cache
[    0.000000] OF: fdt: Machine model: Lichee Pi Nano
[    0.000000] Memory policy: Data cache writeback
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 8128
[    0.000000] Kernel command line: console=tty0 console=ttyS0,115200 panic=5 rootwait root=/dev/mmcblk0p2 rw
[    0.000000] Dentry cache hash table entries: 4096 (order: 2, 16384 bytes)
[    0.000000] Inode-cache hash table entries: 2048 (order: 1, 8192 bytes)
[    0.000000] Memory: 22688K/32768K available (6144K kernel code, 240K rwdata, 1556K rodata, 1024K init, 241K bss, 10080K reserved, 0K cma-reserved, 0K highmem)
[    0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[    0.000000] NR_IRQS: 16, nr_irqs: 16, preallocated irqs: 16
[    0.000000] random: get_random_bytes called from start_kernel+0x254/0x42c with crng_init=0
[    0.000048] sched_clock: 32 bits at 24MHz, resolution 41ns, wraps every 89478484971ns
[    0.000123] clocksource: timer: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 79635851949 ns
[    0.000639] Console: colour dummy device 80x30
[    0.001241] printk: console [tty0] enabled
[    0.001339] Calibrating delay loop... 203.16 BogoMIPS (lpj=1015808)
[    0.070270] pid_max: default: 32768 minimum: 301
[    0.070712] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)
[    0.070782] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)
[    0.072428] CPU: Testing write buffer coherency: ok
[    0.074451] Setting up static identity map for 0x80100000 - 0x80100058
[    0.076748] devtmpfs: initialized
[    0.082497] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[    0.082670] futex hash table entries: 256 (order: -1, 3072 bytes)
[    0.083015] pinctrl core: initialized pinctrl subsystem
[    0.085402] NET: Registered protocol family 16
[    0.086931] DMA: preallocated 256 KiB pool for atomic coherent allocations
[    0.089016] cpuidle: using governor menu
[    0.139913] SCSI subsystem initialized
[    0.140524] usbcore: registered new interface driver usbfs
[    0.140768] usbcore: registered new interface driver hub
[    0.141005] usbcore: registered new device driver usb
[    0.141499] pps_core: LinuxPPS API ver. 1 registered
[    0.141578] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
[    0.141710] PTP clock support registered
[    0.142288] Advanced Linux Sound Architecture Driver Initialized.
[    0.143998] clocksource: Switched to clocksource timer
[    0.173383] NET: Registered protocol family 2
[    0.175173] tcp_listen_portaddr_hash hash table entries: 512 (order: 0, 4096 bytes)
[    0.175363] TCP established hash table entries: 1024 (order: 0, 4096 bytes)
[    0.175476] TCP bind hash table entries: 1024 (order: 0, 4096 bytes)
[    0.175561] TCP: Hash tables configured (established 1024 bind 1024)
[    0.175881] UDP hash table entries: 256 (order: 0, 4096 bytes)
[    0.176002] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
[    0.176586] NET: Registered protocol family 1
[    0.178144] RPC: Registered named UNIX socket transport module.
[    0.178256] RPC: Registered udp transport module.
[    0.178310] RPC: Registered tcp transport module.
[    0.178357] RPC: Registered tcp NFSv4.1 backchannel transport module.
[    0.180773] NetWinder Floating Point Emulator V0.97 (double precision)
[    0.182840] Initialise system trusted keyrings
[    0.183498] workingset: timestamp_bits=30 max_order=13 bucket_order=0
[    0.206814] NFS: Registering the id_resolver key type
[    0.206969] Key type id_resolver registered
[    0.207029] Key type id_legacy registered
[    0.213155] Key type asymmetric registered
[    0.213265] Asymmetric key parser 'x509' registered
[    0.213480] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 251)
[    0.213569] io scheduler mq-deadline registered
[    0.213619] io scheduler kyber registered
[    0.225263] suniv-f1c100s-pinctrl 1c20800.pinctrl: initialized sunXi PIO driver
[    0.407365] Serial: 8250/16550 driver, 8 ports, IRQ sharing disabled
[    0.413124] suniv-f1c100s-pinctrl 1c20800.pinctrl: 1c20800.pinctrl supply vcc-pe not found, using dummy regulator
[    0.415127] printk: console [ttyS0] disabled
[    0.435455] 1c25000.serial: ttyS0 at MMIO 0x1c25000 (irq = 22, base_baud = 6250000) is a 16550A
[    0.852596] printk: console [ttyS0] enabled
[    0.860564] suniv-f1c100s-pinctrl 1c20800.pinctrl: 1c20800.pinctrl supply vcc-pd not found, using dummy regulator
[    0.878394] SCSI Media Changer driver v0.25
[    0.884217] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[    0.890823] ehci-platform: EHCI generic platform driver
[    0.896438] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[    0.902723] ohci-platform: OHCI generic platform driver
[    0.908481] usbcore: registered new interface driver usb-storage
[    0.915303] udc-core: couldn't find an available UDC - added [g_cdc] to list of pending drivers
[    0.924480] i2c /dev entries driver
[    0.929697] suniv-f1c100s-pinctrl 1c20800.pinctrl: 1c20800.pinctrl supply vcc-pf not found, using dummy regulator
[    0.967825] sunxi-mmc 1c0f000.mmc: initialized, max. request size: 16384 KB
[    0.977224] usbcore: registered new interface driver usbhid
[    0.982872] usbhid: USB HID core driver
[    1.002940] NET: Registered protocol family 17
[    1.007844] Key type dns_resolver registered
[    1.014854] Loading compiled-in X.509 certificates
[    1.029255] suniv-f1c100s-pinctrl 1c20800.pinctrl: 1c20800.pinctrl supply vcc-pd not found, using dummy regulator
[    1.040780] sun4i-backend 1e60000.display-backend: Couldn't find matching frontend, frontend features disabled
[    1.051747] sun4i-drm display-engine: bound 1e60000.display-backend (ops 0xc073b2d4)
[    1.060887] sun4i-drm display-engine: bound 1c0c000.lcd-controller (ops 0xc0739f2c)
[    1.068775] [drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
[    1.075496] [drm] No driver support for vblank timestamp query.
[    1.082817] [drm] Initialized sun4i-drm 1.0.0 20150629 for display-engine on minor 0
[    1.305099] mmc0: host does not support reading read-only switch, assuming write-enable
[    1.308612] mmc0: new high speed SDHC card at address aaaa
[    1.312951] mmcblk0: mmc0:aaaa SL08G 7.40 GiB
[    1.335178] Console: switching to colour frame buffer device 100x30
[    1.338312]  mmcblk0: p1 p2
[    1.464230] sun4i-drm display-engine: fb0: sun4i-drmdrmfb frame buffer device
[    1.486568] cfg80211: Loading compiled-in X.509 certificates for regulatory database
[    1.519601] cfg80211: Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'
[    1.540946] ALSA device list:
[    1.558265]   #0: Loopback 1
[    1.576107] platform regulatory.0: Direct firmware load for regulatory.db failed with error -2
[    1.599249] cfg80211: failed to load regulatory.db
[    1.653586] random: fast init done
[    1.977284] EXT4-fs (mmcblk0p2): recovery complete
[    2.145650] EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null)
[    2.168407] VFS: Mounted root (ext4 filesystem) on device 179:2.
[    2.194191] devtmpfs: mounted
[    2.217951] Freeing unused kernel memory: 1024K
[    2.237009] Run /sbin/init as init process
[    2.411834] EXT4-fs (mmcblk0p2): re-mounted. Opts: (null)
Starting logging: OK
Initializing random number generator... [    2.774459] random: dd: uninitialized urandom read (512 bytes read)
done.

Welcome to Lichee Pi
Lichee login: root
Password:
# 

WLS2でUSBメモリが使えればWindows10と別にLinux PCを準備する必要がなくなるのでWLS2がUSBデバイスサポートできるようにならないかなーと期待してる

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

LarkboxにAlpine Linuxを入れて自宅サーバにした

はじめに

INDIGOGOのクラウドファンディングでCHUWI LarkBoxを入手。筐体サイズ:61x61x43(H)mm、重量:127gの極小サイズPC。Windows10 Homeがプリインストールされている。スペックは以下。

Device Spec
CPU Intel Celeron J4115
RAM 6GB LPDDR4
ストレージ 128GB eMMC
Wi-Fi 802.11a/ac/b/g/n
Bluetooth 5.1

ほかに、2242サイズのSATA SSDスロットがあり、2TBまで増設可。
2万円程度の価格で通販サイトで売っている。クラウドファンディングの投資額は1万6000円程度だったので少しお得。

LarkBoxと似たコンセプトの極小PCは、Amazonで「NUC」で検索すると山のように出てくる。クラウドファンディングでお安く入手したいなら、2020/9の時点では、INDIGOGOでGMK NucBoxを公募しているので応募してみてはいかがか。

LarkBoxは、Windows PCとして使用するにはしょぼいスペックなので、Alpine Linuxを入れて自宅サーバとして使う。
TDP 10Wなので、発熱も消費電力も極小でサーバ向きだと思う。ただ、有線LANポートが無いので、サーバとしては致命的ではあるが。。。
巷では、ラズパイ4を自宅サーバにしている方もおられるようで、ラズパイ4は有線LANポートはあるものの、CPUが非力で、ファイルサーバ程度ならいいのでしょうが、さすがにWebアプリをガンガン動かすのは無理と思えます。LarkBoxだとどの程度までできるのかは確認したいところです。

本記事は、LarkBoxにAlpine Linuxを入れた手順の備忘録です。

あまり物欲をそそるショットではないけれど写真上げときます。単3乾電池4本と同程度のフットプリント。

larkbox.jpg

Larkboxのセットアップ

自宅サーバでは、Macのバックアップ用のTimeCapsuleも稼働させたいので、ストレージ128GBでは不足。
そこで、1TB M2.SSDを増設する。裏蓋を開けて、スロットに挿したらおしまいだが。
筐体は放熱性能が低そうな樹脂製で、樹脂製の裏蓋を開けるとさらに樹脂製の中蓋があり、その中に基盤がある構造。SSDは中蓋と裏蓋の間の全く空気が流れない狭い空間に閉じ込められることになり、放熱がかなり不安だ。

BIOSへの入り方は、電源ボタンを押下後、エスケープキーを連打する。

Alpine Linuxのインストール

Alpine LinuxのサイトからEXTENDEDパッケージをダウンロードし、インストールする。はじめは、STANDARDパッケージをインストールしようとしたのだけど、STANDARDパッケージは最小限すぎてpingすら入っていない状態であまりにも使いにくい。Alpine Linuxに対して、128GBのストレージはあまりにも広大なので、ここはEXTENDEDパッケージのほうがいいと思う。

ダウンロードしたISOファイルalpine-extended-3.12.0-x86_64.isoをUSBメモリに焼いて、そこからブートする。
rootでログインする。(rootのパスワードは無し)

# setup-alpine

によりインストールを開始する。Alpine Linuxのインストーラは、メジャーなデストリビューションのインストーラのようにいけてない。1つ1つ対話的に設問に応答していく必要がある。

eMMCにはWindows Homeがプリインストールされていたが、迷わず削除。ここにルートとswapを置き、SSD1TBに/var(250GB)と /home(750GB)を置くことにする。直接インストールするのはdockerだけで、必要なアプリはdocker-composeでインストールするように考えている。そのため、dockerが使う/varは大き目に確保する。
ルートは遅いeMMCではなく、SSDに入れるべきという考えもあると思う。当方もそう思いやってはみたもののあまり変わらなかったので、eMMCがルートで大丈夫だと思う。

インストール時の応答は以下。

Select keyboard layout: jp
Available variants: jp
Enter system hostname: larkbox
Which one do you want to initialize?: wlan0
Type the wireless network name to connect to: *******
Type the "*******" network Pre-Shared Key: *******
Ip address for wlan0: 192.168.1.xx
Netmask?: 255.255.255.0
Gateway: 192.168.1.1
DNS domain name?
DNS nameserver(s)?: 192.168.1.1
New password: *******
Retype Password: *******
Which timezone are you in?: Asia/Tokyo
TP/FTP proxy URL?: none
Enter mirror number (1-43) or URL to add: f
Which SSH server? (‘openssh’, ‘dropbear’ or ‘none’): openssh
Which NTP client to run? (‘busybox’, ‘openntpd’, ‘chrony’, or ‘none’):chrony
Which disk(s) would you like to use?: mmcblk0
How would you like to use it?: sys 

インストールには、以下の記事を参考にした。
https://qiita.com/mo_chiee/items/f539df1bd172f41bc85a
Alpine Linux 3.10.3インストール手順

https://qiita.com/tohka383/items/e7d758a6281fa45e5e16
Docker on Alpine Linux on VirtualBox

インストールの全設問に応答したら、パッケージのリポジトリを更新しておく。

/etc/apk/repositoriesを以下のように修正

#/media/cdrom/apks
http://sjc.edge.kernel.org/alpine/v3.12/main
#http://sjc.edge.kernel.org/alpine/v3.12/community
#http://sjc.edge.kernel.org/alpine/edge/main
http://sjc.edge.kernel.org/alpine/edge/community
#http://sjc.edge.kernel.org/alpine/edge/testing

次のコマンドで更新。

# apk update
# apk upgrade

Dockerを入れる

# apk add docker docker-compose
# service docker start
# rc-update add docker boot

sudo の許可

# apk add sudo
# visudo
# %wheel ALL=(ALL) ALL

%wheel ALL=(ALL) ALL

に変更

自分のログインアカウントの追加

# addgroup wheel
# adduser 自分のログインアカウント
# adduser  自分のログインアカウント wheel
# adduser ログインアカウント docker

一旦電源OFF

# poweroff

shutdownじゃないんだね。

USBメモリを抜いてeMMCからブートするようにBIOSの設定を変更。
ブートすると、あらら、ネットワークがつながっていない!
インストール直後に設定の永続化をしなければならなかったのか?

インストールの続き

ネットワーク設定

最初の一連のインストールは setup-alpine スクリプトで行ったが、個別の項目だけインストールする setup-xxxx スクリプトが用意されている。
インストールスクリプトのうち、ネットワークの設定部分は

# setup-interfaces

により再度Wifiに接続する。

Which one do you want to initialize?: wlan0
Type the wireless network name to connect to: *******
Type the "*******" network Pre-Shared Key: *******
Ip address for wlan0: 192.168.1.xx
Netmask?: 255.255.255.0
Gateway: 192.168.1.1

今度は忘れずに、接続を永続化しておく。

# rc-update add wpa_supplicant boot

ディスクの設定

初期のインストールでは、eMMCにルートとswapのパーティションを切り、システムをインストールしたが、増設した1TB SSDは手つかずのまま。そこで、次に1TB SSDを有効化する。

# setup-disk

SSD1TBに/var(250GB)と /home(750GB)を置くように設定したいのだが、setup-diskスクリプトでは、1つのパーティションしか切れないようだ。

Available disks are:
  sda   (1024.2 GB ATA      NT-1TB-TM       )
Which disk(s) would you like to use? (or '?' for help or 'none') [sda]
How would you like to use it? ('sys', 'data', 'lvm' or '?' for help) [?] data

これで、ディスクどうなったか見てみると、

# df -h
Filesystem                Size      Used Available Use% Mounted on
devtmpfs                 10.0M         0     10.0M   0% /dev
shm                       2.8G         0      2.8G   0% /dev/shm
/dev/mmcblk0p3          110.2G      1.2G    103.4G   1% /
tmpfs                   576.6M    228.0K    576.4M   0% /run
/dev/mmcblk0p1          511.0M    272.0K    510.7M   0% /boot/efi
/dev/sda2               934.0G         0    934.0G   0% /var
cgroup_root              10.0M         0     10.0M   0% /sys/fs/cgroup

SSD1TB(sda)に/varが作成された。
一旦/varパーティションを削除し、あらためて/var(250GB)と /home(750GB)を作成する。

パーティション作成ツールを取得

# apk add -U gptfdisk sgdisk
# gdisk /dev/sda

により、sdaのパーティションを切りなおす。gdiskの使い方はfdiskと同じ。

元のパーティション

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         8390655   4.0 GiB     8200
   2         8390656      2000409230   949.9 GiB   8300

変更後のパーティション

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         8390655   4.0 GiB     8200
   2         8390656       506395300   237.5 GiB   8300  Linux filesystem
   3       506396672      2000409230   712.4 GiB   8300  Linux filesystem

一旦リブートし

# reboot

ディスクをフォーマット

# mkfs.ext4 /dev/sda2
# mkfs.ext4 /dev/sda3

ディスクの UUID を確認

# blkid
/dev/mmcblk0p3: UUID="4594ac58-ef59-420e-93f1-423b09cb92ee" TYPE="ext4"
/dev/mmcblk0p2: UUID="387d4b96-060b-4906-80a7-0c066015d468" TYPE="swap"
/dev/mmcblk0p1: UUID="801B-8E71" TYPE="vfat"
/dev/sda3: UUID="346cbfb9-e881-430b-9005-41881ef5bf1c" TYPE="ext4"
/dev/sda2: UUID="14c53e65-b833-4961-b760-3697ea52acbb" TYPE="ext4"
/dev/sda1: UUID="0fe2b3e9-1468-4a73-aa41-a8eed52f91a8" TYPE="swap"

/etc/fstabにマウントポイント追加

UUID=14c53e65-b833-4961-b760-3697ea52acbb       /var            ext4    defaults 1 2
UUID=346cbfb9-e881-430b-9005-41881ef5bf1c       /home            ext4    defaults 1 2

リブート

# reboot

確認

# df -h
Filesystem                Size      Used Available Use% Mounted on
devtmpfs                 10.0M         0     10.0M   0% /dev
shm                       2.8G         0      2.8G   0% /dev/shm
/dev/mmcblk0p3          110.2G      1.2G    103.3G   1% /
tmpfs                   576.6M    228.0K    576.4M   0% /run
/dev/mmcblk0p1          511.0M    272.0K    510.7M   0% /boot/efi
/dev/sda2               232.7G     60.4M    220.8G   0% /var
/dev/sda3               700.2G     72.0M    664.5G   0% /home
cgroup_root              10.0M         0     10.0M   0% /sys/fs/cgroup

システムのインストール完了。

パッケージのインストール

直にインストールするのは、docker, nginx, sambaのみ。nginxは複数のWebアプリを束ねるリバースプロキシとして使う。sambaはdockerで動かすと細かな資格情報制御がややこしいので直入れする。

dockerはシステムのインストール時に導入済み。

samba

sambaのインストール

# apk add samba

/etc/samba/smb.conf設定

[global]
   unix charset = UTF-8
   dos charset = CP932
   workgroup = WORKGROUP
   server string = %h server (Samba, Alpine)
   dns proxy = no
   interfaces = 127.0.0.0/8 192.168.1.0/24
   bind interfaces only = yes
   map to guest = Bad User
   log file = /var/log/samba/log.%m
   max log size = 1000
   syslog = 0
   panic action = /usr/share/samba/panic-action %d
   server role = standalone server
   passdb backend = tdbsam
   obey pam restrictions = yes
   unix password sync = no
   passwd program = /usr/bin/passwd %u
   passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
   pam password change = yes
   map to guest = bad user
   usershare allow guests = yes
   fruit:metadata = netatalk
   fruit:encoding = native

[larkbox]
   path = /home/samba/share/
   writable = yes
   browseable = yes
   guest ok = no
   guest only = no
   create mode = 0664
   directory mode = 0775
   valid user = 自分のアカウント

[TimeCapsule]
   comment = Backup for Mac Computers
   path = /home/samba/timecapsule
   writable = yes
   browsable = yes
   guest ok = no
   fruit:time machine = yes
   uit:time machine max size = 500M
   valid user = 自分のアカウント

ユーザ登録

# pdbedit -a -u 自分のアカウント

samba再起動

# service samba restart

起動設定

# rc-update add samba

ホスト名の名前解決ができるよう設定

# apk add avahi
# apk add dbus
# rc-update add dbus
# rc-update add avahi-daemon
# service avahi-daemon restart

/etc/avahi/services設定

<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
    <name replace-wildcards="yes">%h</name>
    <service>
        <type>_smb._tcp</type>
        <port>445</port>
    </service>
</service-group>

サービス再起動

# service avahi-daemon restart

nginx

nginxをインストール

# apk add nginx

/etc/nginx/conf.d/default.confを作成

server {
    listen 80;

    server_name larkbox;
    client_max_body_size 128m;

    index index.html index.htm index.php;

    location / {
        proxy_pass http://localhost:8080/;
        access_log off;
    }

}

nginxを起動。

# /etc/init.d/nginx start

起動設定

# rc-update add nginx

Webアプリのインストール

入れたいWebアプリは、片っ端からdocker-composeで入れる。

とりあえず、apacheとdocker管理ツールPortainerを入れてみる。

Apache+php+MySQL

apacheには8080ポートでアクセスするように設定しているが、nginxリバースプロキシ経由で80ポートでアクセスできる。
iPhoneから自宅LAN内のサーバにアクセスする場合、iPhoneではhostsファイルを設定できないのでプロキシサーバで名前解決する必要がある。そのため、apacheにプロキシサーバ機能も持たせる。プロキシポート番号は8888とした。

docker-compose.yaml

version: '3'

services:
  php:
    image: php:7.2-apache
    volumes:
      - ./php.ini:/usr/local/etc/php/php.ini
      - ./html:/var/www/html
      - ./apache2/apache2.conf:/etc/apache2/apache2.conf
      - ./apache2/proxy-html.conf:/etc/apache2/proxy-html.conf
      - ./apache2/hosts:/etc/hosts
    ports:
      - 8080:80
      - 8888:8888
    restart: always
  mysql:
    image: mysql:5.7
    volumes:
      - ./mysql:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=test
      - MYSQL_USER=test
      - MYSQL_PASSWORD=test
    restart: always
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=test
      - PMA_PASSWORD=test
    links:
      - mysql
    ports:
      - 4040:80
    volumes:
      - ./phpmyadmin/sessions:/sessions
    restart: always

./apache2/apache2.conf

LoadModule proxy_html_module /usr/lib/apache2/modules/mod_proxy_html.so
LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
LoadModule proxy_connect_module /usr/lib/apache2/modules/mod_proxy_connect.so
LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so

<IfModule proxy_html_module>
  Include /etc/apache2/proxy-html.conf
</IfModule>

./apache2/proxy-html.conf

<IfModule mod_proxy.c>
  ProxyRequests On
  ProxyVia On
  Listen 8888
  <Proxy *>
    Order deny,allow
    Deny from all
    Allow from all
  </Proxy>
</IfModule>

./apache2/hosts

127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.27.0.2      450ce809bc23
192.168.1.2     centos7
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.27.0.2      450ce809bc23
192.168.1.x     larkbox
192.168.1.1     自宅ルーター名

起動

$ docker-compose up -d

これで、
http://larkbox:8080/
でapacheにアクセスできるようになるが、nginxのリバースプロキシにより
http://larkbox/
でアクセスできるようになる。

Portainer

docker-compose.yaml

version: '2'
services:
  portainer:
    image: portainer/portainer
    ports:
      - 9000:9000
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./data:/data
    restart: always

起動

$ docker-compose up -d

これで、
http://larkbox:9000/
でアクセスできるようになるが、
nginxの設定ファイル/etc/nginx/conf.d/default.confを以下のように書き加えると、

/etc/nginx/conf.d/default.conf

server {
    ...
    location /portainer/ {
        proxy_pass http://localhost:9000;
        rewrite /portainer/(.*)$ /$1 break;
        access_log off;
    }

http://larkbox/portainer
でアクセスできるようになる。

肝心のサーバとしての性能は?

Larkbox導入前は、Corei7-8559UのNuc(memory32GB)上のWindowsPro上のVirtualBox上のCentOS7(memory8GB)をサーバにしていたが、体感的にはこれとあまり変化はない。有線LANが無いサーバだけどそこそこ使える印象。

  • TimeCapsuleのバックアップは、MacBookProの200GBの1回目バックアップが3時間程度だった。
  • Gatsby.jsのサイトはキビキビ動く。
  • 画像たっぷりのWordPressサイトもキビキビ動く。

クソ重いアプリでも試してみた。試しにFess13をインストールしてクロールしてみたが、Fess13のトップページを表示させるだけでもクソ重い。でも動かないわけでもない。クロールもできた。

不安だった放熱も大丈夫っぽい。

いけてるサーバが出来上がった。

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

RHCSA試験対策 - 物理ドライブをLinux OS上でデータ保存域として使うまでの一般的な流れ(応用編/LVMを使う場合)

RHCSA試験対策 - 物理ドライブをLinux OS上でデータ保存域として使うまでの一般的な流れ(応用編/LVMを使う場合)

本記事は、以下のページの続編となりますのでご一読頂いてから本記事をお読み頂けるとご理解を深められると思います。
RHCSA試験対策 - 物理ドライブをLinux OS上でデータ保存域として使うまでの一般的な流れ(基本編)

LVMとは

簡単に説明をすると、従来のパーティションに対して次のような機能を提供してくれる機能です。

  1. 複数のパーティションを連結して、1つのパーティションとして取り扱う
  2. パーティションサイズの伸縮機能の提供
  3. スナップショット機能の提供
  4. RAIDのようなミラーリングやストライピング

ワークステーションや一般的なパソコン利用者向けというよりは、エンタープライズインフラでの活用ケースの方が多そうです。

Linux環境の場合、WindowsやVMware vSphereなどの他のOSと違い、ライセンスはサブスクリプション契約であり、エディションのような機能差を伴う制限は有りませんので、もちろん上記のような非エンタープライズ環境の場合でもサブスクリプション契約があればどなたでも活用出来ます。

なお、LVMについてもっと知りたい方は次のような情報をご確認ください。

第1章 論理ボリューム - Red Hat Enterprise Linux 8
Linux豆知識 085 LVM(logical volume manager:論理ボリューム管理)- LinuC
論理ボリュームマネージャ - Wikipedia
LVMで楽々ディスク管理 - ITmedia

LVMを使ってパーティションマウントまで行う流れ

基本的な流れは次の通りです。
1. LVMがインストールされていることを確認する
2. Physical Volumeを構成する
3. Volume Groupを構成する
4. Logical Volumeを構成する
5. Logical Volumeをファイルシステムでフォーマットする
6. 上記でフォーマットしたファイルシステムをマウントする

それでは上記の流れに従い、各ステップについて見ていきたいと思います。

1. LVMがインストールされていることを確認する

rpm -qa | grep lvm
解説 インストール済みのパッケージを確認する。上記ではlvmという文字列を含むもののみを表示するようにしている。

王道な確認方法ですね。
それ以外の方法としては、yumコマンドで当該パッケージの存在を確認することも出来ます。

yum install lvm2
解説 レポジトリからlvm2をインストールする。

lvm自体は大変メジャーなパッケージなので上から3行目で"already installed."と言われました。
image.png

2. Physical Volumeを構成する

LVMで取り扱う容量を提供してくれる最小単位が"Physical Volume(以下PV)"です。
今回は、/dev/sdbと/dev/sdcの2つのドライブを、1つのVolumeとして取り扱うように構成しようと思います。

下図ではいくつかのコマンドを実行しています。図の下の方に解説を入れます。
image.png

1つ目のコマンド lsblk - 現在のドライブ構成の視認(sdb/sdcは接続済み)
2つ目のコマンド pvdisplay - 現在の"Physical Volume"の有無を確認(初期インストール時に自動構成されたPVのみ存在している)
3つ目のコマンド pvcreate /dev/sdb - sdbをPV化するコマンド(しかし該当のドライブは、PV化出来ずエラーが出る)
4つ目のコマンド pvcreate /dev/sdc - sdcをPV化するコマンド(しかし該当のドライブは、PV化出来ずエラーが出る)
5つ目のコマンド parted /dev/sdb print - sdbのパーティションテーブルを確認(GPT形式である)
6つ目のコマンド parted /dev/sdc print - sdcのパーティションテーブルを確認(GPT形式である)

前回の検証の際に、2つのドライブをGPTドライブとしてパーティションテーブルを作成していた事が要因で、
今回のエラーに当たりました。一度もパーティションテーブルを構成したことがない環境であればこのエラーには当たりません。
今回はパーティションテーブルの削除が必要でしたので、以下の記事に掲載した方法で実施致しました。
RHCSA試験対策 - パーティションテーブルの削除方法

改めてPVの作成を行います。次のコマンドを実行し、正常に作成が終わり且つステータスの確認を行いました。

pvcreate /dev/sdb - /dev/sdbをPV化
pvcreate /dev/sdc - /dev/sdcをPV化
pvdisplay - OS上で認識されたPVを表示

image.png
次は作成した2つのPVを、1つのVolume Group化します。

3. Volume Groupを構成する

Volume Group(以下VG)とは、1つ以上のPVの集合体です。今回は/dev/sdbと/dev/sdcの2つを合体させます。
それぞれのドライブのサイズは20GBですので、作業後は40GBのサイズを持つ1つのVGが構成されます。

初めに作業前に、OS上に存在するVGを確認します。

vgdisplay
解説 OS上で認識されたVGを表示

CentOSの初期インストールの際に構成されたVGが1つだけ存在しています。
これから1つのVGを作成するので、作業後はもう1つのVGが表示されるはずです。
image.png

vgcreate VGにつけたい名前 vgに含めたいPV名
実行例 vgcreate vg8010 /dev/sdb /dev/sdc
解説 /dev/sdbと/dev/sdcを使って、1つのボリュームグループ"vg8010"という名前のVGを作成するという操作コマンド

vgdisplayの結果からも、vg8010が約40GBで構成されていることが確認出来ました。
image.png

4. Logical Volumeを構成する


作成した40GBのサイズを持つVGから30GBのサイズを持つLogical Volumeを切り出します。
lvcreate -n LVにつけたい名前 -L 確保したい容量数 LVをホストするVG名
実行例 lvcreate -n lv8010 -L 30G /dev/vg8010
解説 30GBの容量を持つLV"lv8010"を、/dev/vg8010から切り出すコマンド

image.png
ここまでくれば、後はフォーマットしてマウントするだけです。
この作業については本シリーズの基本編で解説したものと同じ作業を行います。

5. Logical Volumeをファイルシステムでフォーマットする

コマンドの実行の様子は後半に掲載しています。

mkfs.ext4 フォーマットしたいパーティション
実行例 mkfs.ext4 /dev/vg8010/lv8010

6. 上記でフォーマットしたファイルシステムをマウントする

コマンドの実行の様子は後半に掲載しています。

mount マウントしたいパーティション マウント先のディレクトリ
実行例 mount /dev/vg8010/lv8010 /mnt/lvtest

ステップ5と6のコマンドを実行した様子がこちらです。
lsblkを実行して見ると、sdbとsdcからlvm8010が切り出され、それが/mnt/lvtestにマウントされている様子が確認出来ます。
image.png
LVM環境における、一般的なマウントまでの流れは以上となります。もちろん再起動後の自動マウントについては/etc/fstabに対してのUUID及びマウント先の指定記述をお忘れないようにお願いします。(手順は本シリーズの基本編で紹介していますのでそちらをご覧ください。)

LVMのサイズをオンライン拡張してみる

LVMの魅力的な機能の1つが、無停止での容量拡張です。

今回の環境では40GBのサイズがあるVGに対して、30GBのLVを構成しましたので、10GBの空きがあります。
ですので、LVのサイズを30GBから35GBまで延伸してみたいと思います。

パーティションのサイズを確認するコマンド
parted /dev/vg8010/lv8010 print

下図ではパーティションサイズが32.2GBである事が分かります

image.png

次にファイルシステムの現在の容量を確認してみましょう。

ファイルシステムのサイズを確認するコマンド
df -h

image.png

また、オンラインでの拡張(データを失わない)作業という事を確認するためにテスト用ファイルとして"rhcsa"というファイルを配置しました。
image.png
それではここから2種類のコマンドを使用します。

1. 論理ボリューム"lv8010"に対して、5GBの容量を追加するコマンド
lvextend 拡張したいLV名 -L +追加したい容量
実行例 lvextend /dev/vg8010/lv8010 -L +5G

2. パーティション拡張のためのコマンド
resize2fs 対象デバイス名
実行例 resize2fs /dev/vg8010/lv8010

image.png
上図内の下から2行目を確認すると、/dev/vg8010/lv8010のサイズが30GBだったものが35GBに変化しています。
作業後も当該のファイルが存在することを確認出来ました。
image.png

LVMのサイズを縮小してみる

後日掲載予定

LVMボリュームに対してスナップショットを取得してみる

後日掲載予定

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

中華ファンレスNASをOpenWRT(LEDE)で使う

はじめに

中華ファンレスNASをLinux化して「常時起動省電力Linuxサーバー」として運用するにあたり、
色々とハマったので、メモを晒しておきます。
やった事は srchack.org さんのこの記事がベースですが、
自己流に頑張ろうとして色々と大事故になったのですが、
海外サイトにも解決策が殆ど無い状態でしたので、足跡を残しておきます。

材料

  • KIMAX BS-U35WF
  • 3.5インチHDD

IMG_20200103_104005.jpg

元々、IOデータのRockDisk Nextを使っていて、未だに現役で困ってはいませんが、
さすがにlinux kernel 2.6.31 ってのは古すぎ(10年前・・・)で、
gcc環境を構築してもkernelが古すぎてビルドできないOSSが殆どになってきたので、
srchack.org さんの記事も発見していた事もあり、選択しています。
aliexplessの昨年の11.1セールで、3,600円くらいで買いました。
今でも、aliexplessのBlueendless Official Store辺りで買えるみたいです。

別に何でも良かったのですが、重要視した点は以下です。

  • ファンレスNAS
  • それなりのディストリビューションのLinuxがインストール出来る
  • 省電力

国内市場では、ファンレスの小型NASキットは絶滅していて、
RaspberryPiやOrangePi辺りでNAS構築する例も有りますが、
別途HDDケースと本体をケーブルで繋ぐより、
一つの電源・箱でNASを構築したい、と言う欲求です。

尚、Wifiも付いてますが、技適の問題もありますし、
そもそも、NASは「ネットワークが安定していてなんぼ」ですので、無効化して使います。

KIMAX BS-U35WFについて

srchack.org さんの記事で十分事足りるのですが、
MediaTekのチップと言いながら、Ralinkの流れを汲むSoCの様で、
ARM系ではなく、MIPSです。
RaspberryPiは飽きて来て、弄り甲斐が有りそうな環境を求めている方には良いかもしれません。

失敗1 : OpenWRT化時はフルリセットが必要

srchack.org さんの記事にも書かれていますが、
BS-U35WFの標準インターフェースで、OpenWRT/LEDEのファームを食べてくれますが、
どこかのチェックボックスを有効にし忘れたのか、
「/etc 以下を保持したままファームアップデート」と言うとんでもない状態となってしまいました。
折角の素のLinuxですが、/etc/passwd が工場出荷時のままで、rootパスワードが分からない、
というどうしようもない状態です。

OpenWRTのコミュニティーでは、Factory Resetについて等、
他にも色々な情報が有り、試してみましたが、全てNGで受け付けてくれません。
会社での業務時間とは比較にならないくらい、真剣に解析しましたが、打つ手無しです。

最終手段はUART引き出しになるのですが、
srchack.org さんの記事でピンが出てるので簡単かな、と思えど、
コスト削減の為か、基板変更が発生している様で、
最新の基板では残念な事にフレキ接続になってしまっていて、
はんだ付けが必要になってしまいます。
私は、結構危険ですが、セロテープで銅線を固定して、何とかUARTアクセスする事が出来ました。

IMG_20200209_151522.jpg

これでrootログインして、/etc 含めて再度ファームアップデートする事が出来ました。

失敗2 : 最新環境導入はNG?

折角、OpenWRTは現役のディストリビューションですので、最新版の環境を構築したくなりますが、
これが失敗の基でした。
OpenWRTのコミュニティーにも、U35WFのページはしっかりと記載があります。
ここを読むと、19.07の更に最新版で動作しそうな雰囲気を感じますが、乗っかると失敗します。

まず、RC版を使うと、GUI(httpアクセス)の機能が入っていない場合が有ります。
私は19.07.1.4のファームにアップデートしてGUIアクセスNG、前述の失敗1の理由でsshも繋がらず、で
UARTのお世話になっています。

では、安定盤であれば問題ないのか? と言う推測の基に、
19.07を入れて、一見上手く行った様に見えましたが、
Linuxの初期設定を終えて、いざHDDのフォーマットを実行しようとすると、
何故かHDDが認識されていません。

openwrt-19.07.1.dmesg
[    0.000000] Linux version 4.14.167 (builder@buildhost) (gcc version 7.5.0 (OpenWrt GCC 7.5.0 r10911-c155900f66)) #0 Wed Jan 29 16:05:35 2020
[    0.000000] Board has DDR2
[    0.000000] Analog PMU set to hw control
[    0.000000] Digital PMU set to hw control
[    0.000000] SoC Type: MediaTek MT7620A ver:2 eco:6
[    0.000000] bootconsole [early0] enabled
[    0.000000] CPU0 revision is: 00019650 (MIPS 24KEc)
[    0.000000] MIPS: machine is Kimax U35WF
[    0.000000] Determined physical RAM map:
[    0.000000]  memory: 08000000 @ 00000000 (usable)
[    0.000000] Initrd not found or empty - disabling initrd
[    0.000000] Primary instruction cache 64kB, VIPT, 4-way, linesize 32 bytes.
[    0.000000] Primary data cache 32kB, 4-way, PIPT, no aliases, linesize 32 bytes
[    0.000000] Zone ranges:
[    0.000000]   Normal   [mem 0x0000000000000000-0x0000000007ffffff]
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
[    0.000000]   node   0: [mem 0x0000000000000000-0x0000000007ffffff]
[    0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x0000000007ffffff]
[    0.000000] On node 0 totalpages: 32768
[    0.000000] free_area_init_node: node 0, pgdat 8047c5d0, node_mem_map 81000040
[    0.000000]   Normal zone: 256 pages used for memmap
[    0.000000]   Normal zone: 0 pages reserved
[    0.000000]   Normal zone: 32768 pages, LIFO batch:7
[    0.000000] random: get_random_bytes called from 0x8047f740 with crng_init=0
[    0.000000] pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768
[    0.000000] pcpu-alloc: [0] 0 
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 32512
[    0.000000] Kernel command line: console=ttyS0,57600 rootfstype=squashfs,jffs2
[    0.000000] PID hash table entries: 512 (order: -1, 2048 bytes)
[    0.000000] Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
[    0.000000] Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
[    0.000000] Writing ErrCtl register=000281c0
[    0.000000] Readback ErrCtl register=000281c0
[    0.000000] Memory: 123796K/131072K available (3914K kernel code, 181K rwdata, 500K rodata, 1220K init, 215K bss, 7276K reserved, 0K cma-reserved)
[    0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[    0.000000] NR_IRQS: 256
[    0.000000] CPU Clock: 580MHz
[    0.000000] clocksource: systick: mask: 0xffff max_cycles: 0xffff, max_idle_ns: 583261500 ns
[    0.000000] systick: enable autosleep mode
[    0.000000] systick: running - mult: 214748, shift: 32
[    0.000000] clocksource: MIPS: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 6590553264 ns
[    0.000011] sched_clock: 32 bits at 290MHz, resolution 3ns, wraps every 7405115902ns
[    0.015481] Calibrating delay loop... 385.84 BogoMIPS (lpj=1929216)
[    0.087755] pid_max: default: 32768 minimum: 301
[    0.097170] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)
[    0.110206] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)
[    0.129305] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[    0.148789] futex hash table entries: 256 (order: -1, 3072 bytes)
[    0.160975] pinctrl core: initialized pinctrl subsystem
[    0.172592] NET: Registered protocol family 16
[    0.204435] rt2880_gpio 10000600.gpio: registering 24 gpios
[    0.215474] rt2880_gpio 10000600.gpio: registering 24 irq handlers
[    0.228075] rt2880_gpio 10000660.gpio: registering 32 gpios
[    0.239077] rt2880_gpio 10000660.gpio: registering 32 irq handlers
[    0.251668] rt2880_gpio 10000688.gpio: registering 1 gpios
[    0.262498] rt2880_gpio 10000688.gpio: registering 1 irq handlers
[    0.279619] clocksource: Switched to clocksource systick
[    0.291286] NET: Registered protocol family 2
[    0.300868] TCP established hash table entries: 1024 (order: 0, 4096 bytes)
[    0.314652] TCP bind hash table entries: 1024 (order: 0, 4096 bytes)
[    0.327244] TCP: Hash tables configured (established 1024 bind 1024)
[    0.340022] UDP hash table entries: 256 (order: 0, 4096 bytes)
[    0.351550] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
[    0.364242] NET: Registered protocol family 1
[    0.372829] PCI: CLS 0 bytes, default 32
[    0.375669] rt-timer 10000100.timer: maximum frequency is 1220Hz
[    0.388409] Crashlog allocated RAM at address 0x3f00000
[    0.400569] workingset: timestamp_bits=30 max_order=15 bucket_order=0
[    0.419418] squashfs: version 4.0 (2009/01/31) Phillip Lougher
[    0.430919] jffs2: version 2.2 (NAND) (SUMMARY) (LZMA) (RTIME) (CMODE_PRIORITY) (c) 2001-2006 Red Hat, Inc.
[    0.461293] io scheduler noop registered
[    0.468936] io scheduler deadline registered (default)
[    0.480177] Serial: 8250/16550 driver, 16 ports, IRQ sharing enabled
[    0.495645] console [ttyS0] disabled
[    0.502707] 10000c00.uartlite: ttyS0 at MMIO 0x10000c00 (irq = 20, base_baud = 2500000) is a Palmchip BK-3103
[    0.522380] console [ttyS0] enabled
[    0.536194] bootconsole [early0] disabled
[    0.560350] spi spi0.0: force spi mode3
[    0.568784] m25p80 spi0.0: mx25l12805d (16384 Kbytes)
[    0.578959] 4 fixed-partitions partitions found on MTD device spi0.0
[    0.591638] Creating 4 MTD partitions on "spi0.0":
[    0.601210] 0x000000000000-0x000000030000 : "u-boot"
[    0.612069] 0x000000030000-0x000000040000 : "u-boot-env"
[    0.623618] 0x000000040000-0x000000050000 : "factory"
[    0.634640] 0x000000050000-0x000001000000 : "firmware"
[    0.648813] 2 uimage-fw partitions found on MTD device firmware
[    0.660684] Creating 2 MTD partitions on "firmware":
[    0.670605] 0x000000000000-0x00000017dc97 : "kernel"
[    0.681413] 0x00000017dc97-0x000000fb0000 : "rootfs"
[    0.692205] mtd: device 5 (rootfs) set to be root filesystem
[    0.705162] 1 squashfs-split partitions found on MTD device rootfs
[    0.717555] 0x0000003e0000-0x000000fb0000 : "rootfs_data"
[    0.730176] libphy: Fixed MDIO Bus: probed
[    0.747235] gsw: setting port4 to ephy mode
[    0.755872] mtk_soc_eth 10100000.ethernet: loaded mt7620 driver
[    0.768388] mtk_soc_eth 10100000.ethernet eth0: mediatek frame engine at 0xb0100000, irq 5
[    0.785418] rt2880_wdt 10000120.watchdog: Initialized
[    0.796891] NET: Registered protocol family 10
[    0.810102] Segment Routing with IPv6
[    0.817510] NET: Registered protocol family 17
[    0.826477] bridge: filtering via arp/ip/ip6tables is no longer available by default. Update your scripts to load br_netfilter if you need this.
[    0.852322] 8021q: 802.1Q VLAN Support v1.8
[    0.876393] VFS: Mounted root (squashfs filesystem) readonly on device 31:5.
[    0.897213] Freeing unused kernel memory: 1220K
[    0.906279] This architecture does not have kernel memory protection.
[    2.598725] init: Console is alive
[    2.605845] init: - watchdog -
[    2.649566] random: fast init done
[    4.436189] kmodloader: loading kernel modules from /etc/modules-boot.d/*
[    4.536518] usbcore: registered new interface driver usbfs
[    4.547629] usbcore: registered new interface driver hub
[    4.558364] usbcore: registered new device driver usb
[    4.574531] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[    4.589333] ehci-platform: EHCI generic platform driver
[    4.610166] phy phy-usbphy.0: remote usb device wakeup disabled
[    4.621986] phy phy-usbphy.0: UTMI 16bit 30MHz
[    4.630871] ehci-platform 101c0000.ehci: EHCI Host Controller
[    4.642376] ehci-platform 101c0000.ehci: new USB bus registered, assigned bus number 1
[    4.658288] ehci-platform 101c0000.ehci: irq 26, io mem 0x101c0000
[    4.680688] ehci-platform 101c0000.ehci: USB 2.0 started, EHCI 1.00
[    4.694232] hub 1-0:1.0: USB hub found
[    4.702188] hub 1-0:1.0: 1 port detected
[    4.713379] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[    4.727415] ohci-platform: OHCI generic platform driver
[    4.738189] ohci-platform 101c1000.ohci: Generic Platform OHCI controller
[    4.751809] ohci-platform 101c1000.ohci: new USB bus registered, assigned bus number 2
[    4.767726] ohci-platform 101c1000.ohci: irq 26, io mem 0x101c1000
[    4.805850] hub 2-0:1.0: USB hub found
[    4.813800] hub 2-0:1.0: 1 port detected
[    4.825783] kmodloader: done loading kernel modules from /etc/modules-boot.d/*
[    4.844366] init: - preinit -
[    5.755253] usb 1-1: new high-speed USB device number 2 using ehci-platform
[    5.996450] random: procd: uninitialized urandom read (4 bytes read)
[    6.009702] hub 1-1:1.0: USB hub found
[    6.023035] hub 1-1:1.0: 4 ports detected
[    6.498298] 8021q: adding VLAN 0 to HW filter on device eth0
[    6.587457] usb 1-1.1: new high-speed USB device number 3 using ehci-platform
[    7.751995] jffs2: notice: (416) jffs2_build_xattr_subsystem: complete building xattr subsystem, 11 of xdatum (3 unchecked, 8 orphan) and 30 of xref (7 dead, 2 orphan) found.
[    7.786392] mount_root: switching to jffs2 overlay
[    7.825049] overlayfs: upper fs does not support tmpfile.
[    7.849242] urandom-seed: Seeding with /etc/urandom.seed
[    7.997194] procd: - early -
[    8.003234] procd: - watchdog -
[    8.512786] procd: - watchdog -
[    8.519413] procd: - ubus -
[    8.769701] random: ubusd: uninitialized urandom read (4 bytes read)
[    8.785644] random: ubusd: uninitialized urandom read (4 bytes read)
[    8.800088] random: ubusd: uninitialized urandom read (4 bytes read)
[    8.813853] procd: - init -
[    9.724385] kmodloader: loading kernel modules from /etc/modules.d/*
[    9.916360] ip6_tables: (C) 2000-2006 Netfilter Core Team
[    9.950047] Loading modules backported from Linux version v4.19.98-0-gd183c8e2647a
[    9.965210] Backport generated by backports.git v4.19.98-1-0-g8204eb99
[   10.014573] ip_tables: (C) 2000-2006 Netfilter Core Team
[   10.049792] nf_conntrack version 0.5.0 (2048 buckets, 8192 max)
[   10.198184] xt_time: kernel timezone is -0000
[   10.250400] urngd: jent-rng init failed, err: 2
[   10.303138] PPP generic driver version 2.4.2
[   10.316194] NET: Registered protocol family 24
[   10.366897] rt2800_wmac 10180000.wmac: loaded eeprom from mtd device "factory"
[   10.381347] ieee80211 phy0: rt2x00_set_rt: Info - RT chipset 6352, rev 0500 detected
[   10.396820] ieee80211 phy0: rt2x00_set_rf: Info - RF chipset 7620 detected
[   10.411294] ieee80211 phy0: Selected rate control algorithm 'minstrel_ht'
[   10.524116] kmodloader: done loading kernel modules from /etc/modules.d/*
[   22.408357] 8021q: adding VLAN 0 to HW filter on device eth0
[   22.445399] br-lan: port 1(eth0) entered blocking state
[   22.455909] br-lan: port 1(eth0) entered disabled state
[   22.466694] device eth0 entered promiscuous mode
[   22.584853] br-lan: port 1(eth0) entered blocking state
[   22.595327] br-lan: port 1(eth0) entered forwarding state
[   22.606356] IPv6: ADDRCONF(NETDEV_UP): br-lan: link is not ready
[   23.461098] IPv6: ADDRCONF(NETDEV_CHANGE): br-lan: link becomes ready
[   25.625819] ieee80211 phy0: rt2800_rf_self_txdc_cal: Info - RF Tx self calibration start
[   25.642431] ieee80211 phy0: rt2800_rf_self_txdc_cal: Info - RF Tx self calibration end
[   27.528807] ieee80211 phy0: rt2800_loft_iq_calibration: Info - LOFT Calibration Done!
[   27.548309] ieee80211 phy0: rt2800_iq_search: Info - IQCalibration Start!
[   27.575809] ieee80211 phy0: rt2800_iq_search: Info - IQCalibration Done! CH = 0, (gain= 1, phase=3b)
[   27.594938] ieee80211 phy0: rt2800_iq_search: Info - IQCalibration Start!
[   27.622435] ieee80211 phy0: rt2800_iq_search: Info - IQCalibration Done! CH = 1, (gain= f, phase=3a)
[   27.640679] ieee80211 phy0: rt2800_loft_iq_calibration: Info - TX IQ Calibration Done!
[   27.669955] ieee80211 phy0: rt2800_rxiq_calibration: Info - RXIQ G_imb=0, Ph_rx=-1
[   27.697751] ieee80211 phy0: rt2800_rxiq_calibration: Info - RXIQ G_imb=0, Ph_rx=-2
[   27.723017] IPv6: ADDRCONF(NETDEV_UP): wlan0-1: link is not ready
[   27.742455] br-lan: port 2(wlan0-1) entered blocking state
[   27.753488] br-lan: port 2(wlan0-1) entered disabled state
[   27.764831] device wlan0-1 entered promiscuous mode
[   27.903225] IPv6: ADDRCONF(NETDEV_UP): wlan0: link is not ready
[   29.115132] wlan0: authenticate with 34:76:c5:b2:32:90
[   29.134189] wlan0: send auth to 34:76:c5:b2:32:90 (try 1/3)
[   29.149101] wlan0: authenticated
[   29.157215] wlan0: associate with 34:76:c5:b2:32:90 (try 1/3)
[   29.176759] wlan0: RX AssocResp from 34:76:c5:b2:32:90 (capab=0x411 status=0 aid=11)
[   29.192559] wlan0: associated
[   29.280984] IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
[   29.310806] IPv6: ADDRCONF(NETDEV_CHANGE): wlan0-1: link becomes ready
[   29.324120] br-lan: port 2(wlan0-1) entered blocking state
[   29.335106] br-lan: port 2(wlan0-1) entered forwarding state
[   51.696865] random: crng init done
[   51.703653] random: 6 urandom warning(s) missed due to ratelimiting

srchack.org さんの記事でも、対応が本家に取り入れられていない、との事でしたので、
素直に、LEDE 17.01.4 を https://github.com/arvati/lede-U35WF から持ってきて書き込む事で、
kernelバージョンが少し下がってしまいましたが、
(RockDisk Next の kernel 2.6.31 よりは随分とマシです。)
ようやく、無事にNASとしての最低限の機能を確認する事が出来ました。

cd /tmp
wget https://github.com/vanaware/openwrt/releases/download/v17.01.4-u35wf-v1/lede-17.01.4-ramips-mt7620-u35wf-sysupgrade.bin
sysupgrade -n ./lede-17.01.4-ramips-mt7620-u35wf-sysupgrade.bin
LEDE-17.1.4.dmesg
[    0.000000] Linux version 4.4.92 (root@openwrt) (gcc version 5.4.0 (LEDE GCC 5.4.0 r3560-79f57e422d) ) #0 Tue Oct 17 17:46:20 2017
[    0.000000] Board has DDR2
[    0.000000] Analog PMU set to hw control
[    0.000000] Digital PMU set to hw control
[    0.000000] SoC Type: MediaTek MT7620A ver:2 eco:6
[    0.000000] bootconsole [early0] enabled
[    0.000000] CPU0 revision is: 00019650 (MIPS 24KEc)
[    0.000000] MIPS: machine is Kimax U35WF
[    0.000000] Determined physical RAM map:
[    0.000000]  memory: 08000000 @ 00000000 (usable)
[    0.000000] Initrd not found or empty - disabling initrd
[    0.000000] Zone ranges:
[    0.000000]   Normal   [mem 0x0000000000000000-0x0000000007ffffff]
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
[    0.000000]   node   0: [mem 0x0000000000000000-0x0000000007ffffff]
[    0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x0000000007ffffff]
[    0.000000] On node 0 totalpages: 32768
[    0.000000] free_area_init_node: node 0, pgdat 8035c4b0, node_mem_map 81000000
[    0.000000]   Normal zone: 256 pages used for memmap
[    0.000000]   Normal zone: 0 pages reserved
[    0.000000]   Normal zone: 32768 pages, LIFO batch:7
[    0.000000] Primary instruction cache 64kB, VIPT, 4-way, linesize 32 bytes.
[    0.000000] Primary data cache 32kB, 4-way, PIPT, no aliases, linesize 32 bytes
[    0.000000] pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768
[    0.000000] pcpu-alloc: [0] 0 
[    0.000000] Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 32512
[    0.000000] Kernel command line: console=ttyS0,57600 rootfstype=squashfs,jffs2
[    0.000000] PID hash table entries: 512 (order: -1, 2048 bytes)
[    0.000000] Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
[    0.000000] Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
[    0.000000] Writing ErrCtl register=000281c0
[    0.000000] Readback ErrCtl register=000281c0
[    0.000000] Memory: 125940K/131072K available (3017K kernel code, 147K rwdata, 384K rodata, 156K init, 208K bss, 5132K reserved, 0K cma-reserved)
[    0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[    0.000000] NR_IRQS:256
[    0.000000] CPU Clock: 580MHz
[    0.000000] clocksource: systick: mask: 0xffff max_cycles: 0xffff, max_idle_ns: 583261500 ns
[    0.000000] systick: enable autosleep mode
[    0.000000] systick: running - mult: 214748, shift: 32
[    0.000000] clocksource: MIPS: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 6590553264 ns
[    0.000012] sched_clock: 32 bits at 290MHz, resolution 3ns, wraps every 7405115902ns
[    0.015459] Calibrating delay loop... 385.84 BogoMIPS (lpj=1929216)
[    0.080603] pid_max: default: 32768 minimum: 301
[    0.089924] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)
[    0.102939] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)
[    0.122088] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[    0.141572] futex hash table entries: 256 (order: -1, 3072 bytes)
[    0.153715] pinctrl core: initialized pinctrl subsystem
[    0.165351] NET: Registered protocol family 16
[    0.179183] Can't analyze schedule() prologue at 8000acdc
[    0.203165] rt2880_gpio 10000600.gpio: registering 24 gpios
[    0.214191] rt2880_gpio 10000600.gpio: registering 24 irq handlers
[    0.226607] rt2880_gpio 10000638.gpio: registering 16 gpios
[    0.237583] rt2880_gpio 10000638.gpio: registering 16 irq handlers
[    0.250023] rt2880_gpio 10000660.gpio: registering 32 gpios
[    0.261001] rt2880_gpio 10000660.gpio: registering 32 irq handlers
[    0.273444] rt2880_gpio 10000688.gpio: registering 1 gpios
[    0.284252] rt2880_gpio 10000688.gpio: registering 1 irq handlers
[    0.297725] clocksource: Switched to clocksource systick
[    0.309448] NET: Registered protocol family 2
[    0.319075] TCP established hash table entries: 1024 (order: 0, 4096 bytes)
[    0.332853] TCP bind hash table entries: 1024 (order: 0, 4096 bytes)
[    0.345442] TCP: Hash tables configured (established 1024 bind 1024)
[    0.358164] UDP hash table entries: 256 (order: 0, 4096 bytes)
[    0.369705] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
[    0.382378] NET: Registered protocol family 1
[    0.390960] PCI: CLS 0 bytes, default 32
[    0.395325] rt-timer 10000100.timer: maximum frequency is 1220Hz
[    0.408093] Crashlog allocated RAM at address 0x3f00000
[    0.434876] squashfs: version 4.0 (2009/01/31) Phillip Lougher
[    0.446389] jffs2: version 2.2 (NAND) (SUMMARY) (LZMA) (RTIME) (CMODE_PRIORITY) (c) 2001-2006 Red Hat, Inc.
[    0.468534] io scheduler noop registered
[    0.476178] io scheduler deadline registered (default)
[    0.486683] ralink-usb-phy usbphy: invalid resource
[    0.496865] Serial: 8250/16550 driver, 16 ports, IRQ sharing enabled
[    0.513010] console [ttyS0] disabled
[    0.520058] 10000c00.uartlite: ttyS0 at MMIO 0x10000c00 (irq = 20, base_baud = 2500000) is a Palmchip BK-3103
[    0.539735] console [ttyS0] enabled
[    0.553549] bootconsole [early0] disabled
[    0.576124] spi spi0.0: force spi mode3
[    0.584337] m25p80 spi0.0: mx25l12805d (16384 Kbytes)
[    0.594477] 4 ofpart partitions found on MTD device spi0.0
[    0.605411] Creating 4 MTD partitions on "spi0.0":
[    0.614967] 0x000000000000-0x000000030000 : "u-boot"
[    0.626679] 0x000000030000-0x000000040000 : "u-boot-env"
[    0.639228] 0x000000040000-0x000000050000 : "factory"
[    0.651199] 0x000000050000-0x000001000000 : "firmware"
[    0.746692] 2 uimage-fw partitions found on MTD device firmware
[    0.758537] 0x000000050000-0x00000017856f : "kernel"
[    0.770058] 0x00000017856f-0x000001000000 : "rootfs"
[    0.781815] mtd: device 5 (rootfs) set to be root filesystem
[    0.793304] 1 squashfs-split partitions found on MTD device rootfs
[    0.805643] 0x000000c00000-0x000001000000 : "rootfs_data"
[    0.821425] mtk_soc_eth 10100000.ethernet: loaded mt7620 driver
[    0.834093] mtk_soc_eth 10100000.ethernet eth0: mediatek frame engine at 0xb0100000, irq 5
[    0.851134] rt2880_wdt 10000120.watchdog: Initialized
[    0.862683] NET: Registered protocol family 10
[    0.875753] NET: Registered protocol family 17
[    0.884766] bridge: automatic filtering via arp/ip/ip6tables has been deprecated. Update your scripts to load br_netfilter if you need this.
[    0.909922] 8021q: 802.1Q VLAN Support v1.8
[    0.933575] VFS: Mounted root (squashfs filesystem) readonly on device 31:5.
[    0.948554] Freeing unused kernel memory: 156K
[    3.404173] init: Console is alive
[    3.411324] init: - watchdog -
[    6.802198] kmodloader: loading kernel modules from /etc/modules-boot.d/*
[    6.914466] usbcore: registered new interface driver usbfs
[    6.925593] usbcore: registered new interface driver hub
[    6.936335] usbcore: registered new device driver usb
[    7.119418] raid6: int32x1  gen()    25 MB/s
[    7.298175] raid6: int32x1  xor()    42 MB/s
[    7.467750] raid6: int32x2  gen()    48 MB/s
[    7.638181] raid6: int32x2  xor()    49 MB/s
[    7.807910] raid6: int32x4  gen()    63 MB/s
[    7.977862] raid6: int32x4  xor()    48 MB/s
[    8.148566] raid6: int32x8  gen()    71 MB/s
[    8.317997] raid6: int32x8  xor()    54 MB/s
[    8.326496] raid6: using algorithm int32x8 gen() 71 MB/s
[    8.337085] raid6: .... xor() 54 MB/s, rmw enabled
[    8.346632] raid6: using intx1 recovery algorithm
[    8.357175] xor: measuring software checksum speed
[    8.457721]    8regs     :   418.800 MB/sec
[    8.557723]    8regs_prefetch:   399.200 MB/sec
[    8.657719]    32regs    :   499.600 MB/sec
[    8.757722]    32regs_prefetch:   460.400 MB/sec
[    8.766912] xor: using function: 32regs (499.600 MB/sec)
[    9.369359] Btrfs loaded
[    9.421709] SCSI subsystem initialized
[    9.435422] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[    9.450058] ehci-platform: EHCI generic platform driver
[    9.470861] phy phy-usbphy.0: remote usb device wakeup disabled
[    9.482672] phy phy-usbphy.0: UTMI 16bit 30MHz
[    9.491561] ehci-platform 101c0000.ehci: EHCI Host Controller
[    9.503057] ehci-platform 101c0000.ehci: new USB bus registered, assigned bus number 1
[    9.518962] ehci-platform 101c0000.ehci: irq 26, io mem 0x101c0000
[    9.537112] ehci-platform 101c0000.ehci: USB 2.0 started, EHCI 1.00
[    9.550710] hub 1-0:1.0: USB hub found
[    9.558643] hub 1-0:1.0: 1 port detected
[    9.569514] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[    9.583323] ohci-platform: OHCI generic platform driver
[    9.594076] ohci-platform 101c1000.ohci: Generic Platform OHCI controller
[    9.607688] ohci-platform 101c1000.ohci: new USB bus registered, assigned bus number 2
[    9.623559] ohci-platform 101c1000.ohci: irq 26, io mem 0x101c1000
[    9.658508] hub 2-0:1.0: USB hub found
[    9.666458] hub 2-0:1.0: 1 port detected
[    9.676925] uhci_hcd: USB Universal Host Controller Interface driver
[    9.705223] usbcore: registered new interface driver usb-storage
[    9.717911] kmodloader: done loading kernel modules from /etc/modules-boot.d/*
[    9.736658] init: - preinit -
[   10.007850] usb 1-1: new high-speed USB device number 2 using ehci-platform
[   10.662655] random: procd: uninitialized urandom read (4 bytes read, 17 bits of entropy available)
[   10.681138] hub 1-1:1.0: USB hub found
[   10.697533] hub 1-1:1.0: 4 ports detected
[   11.225904] 8021q: adding VLAN 0 to HW filter on device eth0
[   11.312346] usb 1-1.1: new high-speed USB device number 3 using ehci-platform
[   11.375584] usb-storage 1-1.1:1.0: USB Mass Storage device detected
[   11.389007] scsi host0: usb-storage 1-1.1:1.0
[   11.738837] scsi 0:0:0:0: Direct-Access     ASMT     2115             0    PQ: 0 ANSI: 6
[   11.766590] sd 0:0:0:0: [sda] Very big device. Trying to use READ CAPACITY(16).
[   11.781590] sd 0:0:0:0: [sda] 7814037168 512-byte logical blocks: (4.00 TB/3.64 TiB)
[   11.797072] sd 0:0:0:0: [sda] 4096-byte physical blocks
[   11.808137] sd 0:0:0:0: [sda] Write Protect is off
[   11.817746] sd 0:0:0:0: [sda] Mode Sense: 43 00 00 00
[   11.818360] sd 0:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[   11.837863] sd 0:0:0:0: [sda] Very big device. Trying to use READ CAPACITY(16).
[   12.057938]  sda: sda1 sda2
[   12.066239] sd 0:0:0:0: [sda] Very big device. Trying to use READ CAPACITY(16).
[   12.082337] sd 0:0:0:0: [sda] Attached SCSI disk
[   12.323369] mount_root: loading kmods from internal overlay
[   12.357085] kmodloader: loading kernel modules from //etc/modules-boot.d/*
[   12.376389] kmodloader: done loading kernel modules from //etc/modules-boot.d/*
[   15.612785] jffs2_scan_eraseblock(): End of filesystem marker found at 0x10000
[   15.627238] jffs2_build_filesystem(): unlocking the mtd device... done.
[   15.640444] jffs2_build_filesystem(): erasing all blocks after the end marker... done.
[   40.386657] jffs2: notice: (428) jffs2_build_xattr_subsystem: complete building xattr subsystem, 0 of xdatum (0 unchecked, 0 orphan) and 0 of xref (0 dead, 0 orphan) found.
[   40.417944] block: attempting to load /tmp/jffs_cfg/upper/etc/config/fstab
[   40.431976] block: unable to load configuration (fstab: Entry not found)
[   40.445486] block: attempting to load /tmp/jffs_cfg/etc/config/fstab
[   40.458422] block: unable to load configuration (fstab: Entry not found)
[   40.487140] block: attempting to load /etc/config/fstab
[   40.576670] block: extroot: not configured
[   40.732385] jffs2: notice: (425) jffs2_build_xattr_subsystem: complete building xattr subsystem, 0 of xdatum (0 unchecked, 0 orphan) and 0 of xref (0 dead, 0 orphan) found.
[   43.287939] block: attempting to load /tmp/jffs_cfg/upper/etc/config/fstab
[   43.301895] block: unable to load configuration (fstab: Entry not found)
[   43.315539] block: attempting to load /tmp/jffs_cfg/etc/config/fstab
[   43.328454] block: unable to load configuration (fstab: Entry not found)
[   43.342042] block: attempting to load /etc/config/fstab
[   43.353835] block: extroot: not configured
[   43.363661] mount_root: overlay filesystem has not been fully initialized yet
[   43.379609] mount_root: switching to jffs2 overlay
[   44.170272] urandom-seed: Seed file not found (/etc/urandom.seed)
[   44.206864] random: nonblocking pool is initialized
[   44.318238] procd: - early -
[   44.325131] procd: - watchdog -
[   44.890933] procd: - watchdog -
[   44.897556] procd: - ubus -
[   45.108830] procd: - init -
[   45.731585] kmodloader: loading kernel modules from /etc/modules.d/*
[   45.757063] Loading modules backported from Linux version wt-2017-01-31-0-ge882dff19e7f
[   45.773121] Backport generated by backports.git backports-20160324-13-g24da7d3c
[   45.830559] batman_adv: B.A.T.M.A.N. advanced 2016.5 (compatibility version 15) loaded
[   45.934744] rt2800_wmac 10180000.wmac: loaded eeprom from mtd device "factory"
[   45.949259] ieee80211 phy0: rt2x00_set_rt: Info - RT chipset 6352, rev 0500 detected
[   45.964718] ieee80211 phy0: rt2x00_set_rf: Info - RF chipset 7620 detected
[   45.979147] ieee80211 phy0: Selected rate control algorithm 'minstrel_ht'
[   45.986909] kmodloader: done loading kernel modules from /etc/modules.d/*
[   57.393186] 8021q: adding VLAN 0 to HW filter on device eth0
[   57.420436] device eth0 entered promiscuous mode
[   57.449377] br-lan: port 1(eth0) entered forwarding state
[   57.460243] br-lan: port 1(eth0) entered forwarding state
[   59.677642] br-lan: port 1(eth0) entered forwarding state
[   61.558546] IPv6: ADDRCONF(NETDEV_UP): wlan0-1: link is not ready
[   61.585271] device wlan0-1 entered promiscuous mode
[   61.595166] br-lan: port 2(wlan0-1) entered forwarding state
[   61.606497] br-lan: port 2(wlan0-1) entered forwarding state
[   61.896794] br-lan: port 2(wlan0-1) entered disabled state
[   61.946967] IPv6: ADDRCONF(NETDEV_UP): wlan0: link is not ready
[   65.676140] wlan0: authenticate with 34:76:c5:b2:32:90
[   65.695466] wlan0: send auth to 34:76:c5:b2:32:90 (try 1/3)
[   65.710850] wlan0: authenticated
[   65.718855] wlan0: associate with 34:76:c5:b2:32:90 (try 1/3)
[   65.734618] wlan0: RX AssocResp from 34:76:c5:b2:32:90 (capab=0x411 status=0 aid=9)
[   65.750193] wlan0: associated
[   65.756298] IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
[   65.847543] IPv6: ADDRCONF(NETDEV_CHANGE): wlan0-1: link becomes ready
[   65.860783] br-lan: port 2(wlan0-1) entered forwarding state
[   65.872161] br-lan: port 2(wlan0-1) entered forwarding state
[   67.021826] br-lan: port 2(wlan0-1) entered forwarding state

あまり真面目にデバッグしていませんが、
HDDは小基板経由で繋がっているので、
ログに差分の有る 10000638.gpio 辺りが怪しいのかもしれません。

おまけ1 : opkg設定 バグ対応

先ずは LEDE17.01 としてupgradeしておこうとしましたが、
opkg updateで失敗します。

root@LEDE:~# opkg update
・・・
Downloading http://downloads.lede-project.org/releases/17.01.4/packages/mipsel_24kc/accesscontrol/Packages.gz
*** Failed to download the package list from http://downloads.lede-project.org/releases/17.01.4/packages/mipsel_24kc/accesscontrol/Packages.gz

Collected errors:
 * opkg_download: Failed to download http://downloads.lede-project.org/releases/17.01.4/packages/mipsel_24kc/accesscontrol/Packages.gz, wget returned 8.

そもそも、最新のパッケージを見ても、accesscontrol は無いので、
設定から消すのが正解と思いますので、
下記情報を削除します。

/etc/opkg/distfeeds.conf
src/gz reboot_accesscontrol http://downloads.lede-project.org/releases/17.01.4/packages/mipsel_24kc/accesscontrol

おまけ2 : HDDフォーマット

以下の投稿に沿いながらHDDを設定すれば、難なくHDDフォーマット・Mountまで成功しました。

root@LEDE:~# df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/root                10.5M     10.5M         0 100% /rom
tmpfs                    61.6M    532.0K     61.1M   1% /tmp
/dev/mtdblock6            4.0M    960.0K      3.1M  23% /overlay
overlayfs:/overlay        4.0M    960.0K      3.1M  23% /
tmpfs                   512.0K         0    512.0K   0% /dev
/dev/sda1                 3.6T     88.0M      3.4T   0% /mnt/sda1
root@LEDE:~# free
             total       used       free     shared    buffers     cached
Mem:        126096      40956      85140        532      11980      10580
-/+ buffers/cache:      18396     107700
Swap:      1048568          0    1048568

まとめ

自力でNASやルーターのOSをOpemWRT/LEDE等に入れ替えてみる際のTipsとしては、以下です。
特殊な場合がもしれませんが、もし行き詰った場合がある方は、試してみると良いかもしれません。

  1. ファームアップデートの際に/etcの下をバックアップする設定となっていないか確認する
  2. 常に最新版のディストリビューションが最適とは限らない (ブランチにしか反映されていないかもしれない)

では、省電力Linuxサーバーの有る良い生活を!

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

RHCSA試験対策 - パーティションテーブルの削除方法

はじめに

本記事で紹介するコマンドは、物理ドライブ内(HDDやSSD等)の情報を削除する作業です。
作業を行うと、ドライブ内のデータは消失しますので、その点をご留意頂いた上で実行ください。

本記事では、GPTパーティションテーブルを保有しているドライブから、パーティションテーブルを削除するコマンドの紹介です。

インターネット上では、パーティションテーブルの削除方法は何種類か紹介されています。
個人的に最も簡単と思ったものを取り上げています。

wipefsを使った方法

下図では、/dev/sdbと/dev/sdcが既にGPT形式のパーティションテーブルを持った状態になっています。

parted /dev/sdb print
parted /dev/sdb print

上記コマンドの出力からGPT形式であることが確認出来ます。(図内上から5行目と13行目参照)
image.png
上図内では、次のコマンドを実行してドライブのパーティションテーブルの削除を行いました。

wipefs -a /dev/sdb
wipefs -a /dev/sdc

上記パーティションテーブル削除後、再度次のコマンドで確認をするとパーティションテーブルがunknownになりました。無事テーブルの削除が完了しました。

parted /dev/sdb print
parted /dev/sdb print

image.png
以上で、ドライブをまっさらな状態として取り扱う事が出来るようになりました。
もし検証環境などで再度クリアな状態から検証を行いたい場合は、是非活用ください。

ddコマンドを利用したパーティションテーブル削除

こちらは後日時間が空いた際にでも記述しようかと思います。
(本記事の目的が、RHCSA試験対策であるため、試験中に入力しやすいと思われるコマンドにフォーカスしているため)

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

RHCSA試験対策 - 物理ドライブをLinux OS上でデータ保存域として使うまでの基本的な流れ(基本編)

RHCSA試験対策 - 物理ドライブをLinux OS上でデータ保存域として使うまでの基本的な流れ(基本編)

前置き

Linux OS上には、ディストリビューション次第ですが様々なディスク操作のためのコマンドが用意されています。

Windows OSの場合は、殆どの作業を”ディスクの管理”から行えてしまう手軽さからも、Linux初心者からするとディスクへの操作は大変ハードルが高い存在のように見えます。
image.png

この記事では、”あるコンピュータに、1本のHDDドライブを増設して、そのドライブにデータを保存が出来るまで”というシナリオ想定で、作業の流れと各工程で登場するコマンドをを紹介します。

基本的な流れ

次の流れに従い、本記事ではコマンドの作業を紹介して参ります。

  1. 物理的にドライブを搭載する
  2. 物理ドライブがハードウェアレベルで認識されたことを確認する
  3. 物理ドライブがOSレベルで認識されたことを確認する
  4. 物理ドライブにパーティションを作成する
  5. 上記で作成したパーティションをフォーマットする
  6. 上記でフォーマットしたパーティションをOSの特定のディレクトリへマウントする
  7. 再起動後も、該当のファイルシステムが利用出来ることを確認する

1. 物理的にドライブを搭載する

物理的に筐体への接続をする工程です。
接続規格はUSB、SATA、SCSI、SASなどが有るかと思いますが、お手持ちの筐体がサポートするものを接続ください。なお接続方法や搭載可能デバイス数は、製品仕様ガイドなどで確認されると良いでしょう。

こちらはDell OptiPlex 7050という機種の記事を抜粋してみました。
OptiPlex 7050 Small Form Factor - オーナーズマニュアル

image.png

2. 物理ドライブがハードウェアレベルで認識されたことを確認する

こちらについて言えば、Linux固有の操作ではなく物理的にUSB/SATA/SASなどのインターフェースに対してHDDやSSDを接続することを意味します。物理環境の場合で言えば、BIOS画面で当該のドライブを認識しているかを確認します。

私の環境の場合は、仮想環境上に構成した仮想マシンでLinuxを動かしているため、下図では3本の仮想ハードドライブが"VMware Virtual SCSI Hard Drive(0:x)"として3つ搭載が確認できました。

今回は、"VMware Virtual SCSI Hard Drive 0:1"に対して、データを保存するための作業を行っていきます。
image.png
BIOSの画面の様子はお手持ちの製品によっても変わるため、もし確認方法がわからない場合は、製品ベンダーのサポートに質問をするか、Google画像検索などを頼ると良いでしょう。

3. 物理ドライブがOSレベルで認識されたことを確認する

OSが物理ドライブを認識できているかどうかの判別としては、"/dev"配下に物理ドライブの"デバイスファイル"が存在しているかどうかを見るのがメジャーでしょう。

下図では、3つのハードドライブが認識されています。イメージは次の通りです。
LinuxOS
L[HDD#1 sda]"パーティションsda1/パーティションsda2/パーティションsda3"
L[HDD#2 sdb]"パーティション無し"
L[HDD#3 sdc]"パーティション無し"
image.png

また、"lsblk"コマンドを使うと、上記で示したような階層的な視点でのドライブとパーティションの相互関係を把握しやすいです。
記載した後で言うのもなんですが、上記の方法よりもこちらの方が確認においては楽ですね。
image.png
このsdから始まる記述は、通常SCSI/SATA/USBなどの接続規格で通信しているドライブに割り当てられる識別子です。
これ以外のパターンも存在しますが、それについては次のようなページを参照ください。
第3章 永続的な命名属性の概要 - Red Hat
デバイスファイル - Wikipedia
fdisk - LinuCイージス

4. 物理ドライブにパーティションを作成する

物理ドライブに対してデータを配置するには、パーティションを構成し、それに対してデータを保存するためのフォーマット形式を指定する必要があります。

Linux OSにおけるパーティション作成コマンドは、いくつか存在します。
代表的なものとして次のものがあります。
【 fdisk 】コマンド――パーティションを作成、削除する
【 gdisk 】コマンド――GPT対応のパーティションを作成、削除する
【 parted 】コマンド――GPT対応のパーティションを作成、削除する

ここで、多くの初学者の方は”どれを使えばいいの?”と疑問に思う分けですが、本記事投稿時点では"parted"が良いでしょう。
理由としては、現在HDDやSSDのようなドライブはMBR形式またはGPT形式のどちらかとして取り扱ってシステムに接続します。
fdiskはMBR形式のドライブに対しての専用コマンドです。
gdiskはGPT形式のドライブに対しての専用コマンドです。
partedは両方に対応しています。partedが最も後発のコマンドであり、出番も多いのでpartedを個人的におすすめします。

ここからはpartedを用いたパーティションの作成までの流れを図解します。
まず下図では、現在のドライブの認識をlsblkで改めて確認し、BIOSで確認した2本目のドライブが"sdb"として認識されていることを確認しました。
また、"parted /dev/sdb print"にて現在の2本目のドライブに対してのステータスを確認しています。
image.png

下から3行目に注目すると、"Partition Table: unknown"とあります。未初期化のドライブです。
まずはGPT形式で初期化処理を行います。
image.png
上図では、"parted /dev/sdb mklabel"にてGPT形式で初期化を終えました。
上図上から2行目の"New disk label type?"で、tabキーを2回押下すると指定可能な形式一覧が表示されますので便利です。
上図下から4行目では、改めて実行した"print"コマンドにて、GPTの文字が確認出来ました。

続いてパーティションを作成します。以下のコマンドにて作業を行います。
image.png

今回はmkpartで終わらせることで、パーティション名/種類/サイズ指定を対話式で入力しました。
フォーマットの種別を聞かれたタイミングで、tabキー2回で上図のように種類を確認が出来ます。
サイズの指定は、ドライブ上でのパーティション開始位置と終了位置を入力しますが、開始位置を%で入力し、終了位置を単位指定しています。
開始位置も単位指定は可能ですが、例えばこれを開始位置を0からとした場合、次のような警告が出ます。
image.png
このエラーメッセージ"Warning: The resulting partition is not properly aligned for best performance."で検索をすると多くの報告が上がっています。これは最近登場した4Kドライブを意識してのセクター開始位置指定への警告とのこと。
根本原因として参考にさせていただいたのはこちらの記事です。
partedでパフォーマンスの警告が出た場合の対処法
今回は一般的なドライブ増設手法の紹介ですので、この点については深く追求はしません。

上記のエラーに当たらないための最もシンプルな手法は0%で開始位置を指定するのが楽でしょう。
なお、1つのドライブ上に2つ目以降のパーティションを作成する際は、0%指定は使えません。この場合は1つ前のパーティションのサイズにほぼ近い数字を入れてみましょう。下図では2つ目のパーティションを作成しており、開始位置を"10.1G"として指定しました。レイアウトが美しい。
image.png

ここまでくれば後は、フォーマットとマウントです。次のステップに進みます。

5. 上記で作成したパーティションをフォーマットする

フォーマット自体は、パーティションの作成ほど難しく有りません。
下図ではsdb1とsdb2に対してext4でのフォーマットを行っています。
image.png

mkfs.○○ の形式のコマンドです。○○には該当のファイルシステム名が入ります。
2つのパーティションに対してext4の記載が追加されたことが確認出来ました。
image.png

6. 上記でフォーマットしたパーティションをOSの特定のディレクトリへマウントする

最後はパーティションのマウントです。
Windows OSの場合ですと、各パーティションはドライブ文字を持ち、それぞれが各ドライブ文字のルートになります。
Linux OSの場合は、ユーザーが/配下の任意のディレクトリにパーティションをマウントします。

今回は、/mnt配下にtest01, test02という名称のディレクトリを作成しました。
image.png

下図ではマウントを実行し、2つのパーティションがそれぞれ/mnt配下のディレクトリにマウントされている様子をlsblkで確認しています。
image.png

これでファイルの保存が出来るようになりました。各ディレクトリに、rhcsa, rhceという名称の空ファイルを作成してみました。
image.png

7. 再起動後も、該当のファイルシステムが利用出来ることを確認する

ここまでようやくドライブの増設からファイルの保存が出来る状態にするまで様々な作業をしてきたのですが、実は再起動するとファイルシステムのマウントは解除されます。ですので、下図では先程のrhcsaやrhceファイルが確認出来ません。
image.png

再マウント後にlsで確認をするとファイルの生存が確認出来ました。
image.png

再起動後に、自動的に特定のファイルシステムが指定のディレクトリにマウントされるためには、"/etc/fstab"という設定ファイルにそれを記述する必要があります。

下図内の下から2行目と3行目に自動マウントするための行を追加しました。(vi /etc/fstabにて編集を行いました。)
一番左にあるのがsdb1とsdb2が持つUUIDと呼ばれるパーティションの識別子です。それ以降はマウント指定箇所やファイルシステムの情報を掲示しますが、記述ルールは以下を参照ください。
Linux豆知識 175「/etc/fstab」- LinuC
/etc/fstabに記述されている数字の意味-@IT
image.png

なお、パーティション毎のUUIDはlsblk -fで確認が可能です。
image.png

これで作業は以上となります。これ以降は再起動をした際でも自動的にfstabによって指定されたファイルシステムはマウントされます。

おまけ fstabの編集誤りは怖い

記述に問題が有ると、OS起動時に次のような画面になってしまいます。初見ですと完全にパニックになりますね。
image.png

fstab編集後の再起動である場合は、慌てずCLI画面上でfstabファイルを確認してみましょう。
最初のプロンプトではrootのパスワードを入力後コマンドを打てる状態になります。

cat /etc/fstabで確認してみた所、どこがおかしいか分かりますか?
image.png

上図では、下から2行目の先頭から"UUID="を削除して疑似障害を起こしてみました。本画面からもviコマンドでの修正は可能です。
修正後の様子がこちらです。
image.png

これで後は保存をして、再起動すればOKです。

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

RHCSA試験対策 - 物理ドライブをLinux OS上でデータ保存域として使うまでの一般的な流れ(基本編)

RHCSA試験対策 - 物理ドライブをLinux OS上でデータ保存域として使うまでの一般的な流れ(基本編)

前置き

Linux OS上には、ディストリビューション次第ですが様々なディスク操作のためのコマンドが用意されています。

Windows OSの場合は、殆どの作業を”ディスクの管理”から行えてしまう手軽さからも、Linux初心者からするとディスクへの操作は大変ハードルが高い存在のように見えます。
image.png

この記事では、”あるコンピュータに、1本のHDDドライブを増設して、そのドライブにデータを保存が出来るまで”というシナリオ想定で、作業の流れと各工程で登場するコマンドをを紹介します。

基本的な流れ

次の流れに従い、本記事ではコマンドの作業を紹介して参ります。

  1. 物理的にドライブを搭載する
  2. 物理ドライブがハードウェアレベルで認識されたことを確認する
  3. 物理ドライブがOSレベルで認識されたことを確認する
  4. 物理ドライブにパーティションを作成する
  5. 上記で作成したパーティションをフォーマットする
  6. 上記でフォーマットしたパーティションをOSの特定のディレクトリへマウントする
  7. 再起動後も、該当のファイルシステムが利用出来ることを確認する

1. 物理的にドライブを搭載する

物理的に筐体への接続をする工程です。
接続規格はUSB、SATA、SCSI、SASなどが有るかと思いますが、お手持ちの筐体がサポートするものを接続ください。なお接続方法や搭載可能デバイス数は、製品仕様ガイドなどで確認されると良いでしょう。

こちらはDell OptiPlex 7050という機種の記事を抜粋してみました。
OptiPlex 7050 Small Form Factor - オーナーズマニュアル

image.png

2. 物理ドライブがハードウェアレベルで認識されたことを確認する

こちらについて言えば、Linux固有の操作ではなく物理的にUSB/SATA/SASなどのインターフェースに対してHDDやSSDを接続することを意味します。物理環境の場合で言えば、BIOS画面で当該のドライブを認識しているかを確認します。

私の環境の場合は、仮想環境上に構成した仮想マシンでLinuxを動かしているため、下図では3本の仮想ハードドライブが"VMware Virtual SCSI Hard Drive(0:x)"として3つ搭載が確認できました。

今回は、"VMware Virtual SCSI Hard Drive 0:1"に対して、データを保存するための作業を行っていきます。
image.png
BIOSの画面の様子はお手持ちの製品によっても変わるため、もし確認方法がわからない場合は、製品ベンダーのサポートに質問をするか、Google画像検索などを頼ると良いでしょう。

3. 物理ドライブがOSレベルで認識されたことを確認する

OSが物理ドライブを認識できているかどうかの判別としては、"/dev"配下に物理ドライブの"デバイスファイル"が存在しているかどうかを見るのがメジャーでしょう。

ls -la /dev | grep sd 
解説 /dev配下のsdという文字が含まれるファイルやディレクトリを検索するコマンド

下図では、3つのハードドライブが認識されています。イメージは次の通りです。
LinuxOS
L[HDD#1 sda]"パーティションsda1/パーティションsda2/パーティションsda3"
L[HDD#2 sdb]"パーティション無し"
L[HDD#3 sdc]"パーティション無し"
image.png
また、"lsblk"コマンドを使うと、上記で示したような階層的な視点でのドライブとパーティションの相互関係を把握しやすいです。
記載した後で言うのもなんですが、上記の方法よりもこちらの方が確認においては楽ですね。
image.png
このsdから始まる記述は、通常SCSI/SATA/USBなどの接続規格で通信しているドライブに割り当てられる識別子です。
これ以外のパターンも存在しますが、それについては次のようなページを参照ください。
第3章 永続的な命名属性の概要 - Red Hat
デバイスファイル - Wikipedia
fdisk - LinuCイージス

4. 物理ドライブにパーティションを作成する

物理ドライブに対してデータを配置するには、パーティションを構成し、それに対してデータを保存するためのフォーマット形式を指定する必要があります。

Linux OSにおけるパーティション作成コマンドは、いくつか存在します。
代表的なものとして次のものがあります。
【 fdisk 】コマンド――パーティションを作成、削除する
【 gdisk 】コマンド――GPT対応のパーティションを作成、削除する
【 parted 】コマンド――GPT対応のパーティションを作成、削除する

ここで、多くの初学者の方は”どれを使えばいいの?”と疑問に思う分けですが、本記事投稿時点では"parted"が良いでしょう。
理由としては、現在HDDやSSDのようなドライブはMBR形式またはGPT形式のどちらかとして取り扱ってシステムに接続します。
fdiskはMBR形式のドライブに対しての専用コマンドです。
gdiskはGPT形式のドライブに対しての専用コマンドです。
partedは両方に対応しています。partedが最も後発のコマンドであり、出番も多いのでpartedを個人的におすすめします。

ここからはpartedを用いたパーティションの作成までの流れを図解します。
まず下図では、現在のドライブの認識をlsblkで改めて確認し、BIOSで確認した2本目のドライブが"sdb"として認識されていることを確認しました。

parted /dev/sdb print
解説 sdbのドライブの情報を確認するコマンド, sdbを他のデバイスに置き換えても利用可能

image.png
下から3行目に注目すると、"Partition Table: unknown"とあります。未初期化のドライブです。
まずはGPT形式で初期化処理を行います。
image.png
上図では、"parted /dev/sdb mklabel"にてGPT形式で初期化を終えました。
上図上から2行目の"New disk label type?"で、tabキーを2回押下すると指定可能な形式一覧が表示されますので便利です。
上図下から4行目では、改めて実行した"print"コマンドにて、GPTの文字が確認出来ました。

続いてパーティションを作成します。以下のコマンドにて作業を行います。
image.png

今回はmkpartで終わらせることで、パーティション名/種類/サイズ指定を対話式で入力しました。
フォーマットの種別を聞かれたタイミングで、tabキー2回で上図のように種類を確認が出来ます。
サイズの指定は、ドライブ上でのパーティション開始位置と終了位置を入力しますが、開始位置を%で入力し、終了位置を単位指定しています。
開始位置も単位指定は可能ですが、例えばこれを開始位置を0からとした場合、次のような警告が出ます。
image.png
このエラーメッセージ"Warning: The resulting partition is not properly aligned for best performance."で検索をすると多くの報告が上がっています。これは最近登場した4Kドライブを意識してのセクター開始位置指定への警告とのこと。
根本原因として参考にさせていただいたのはこちらの記事です。
partedでパフォーマンスの警告が出た場合の対処法
今回は一般的なドライブ増設手法の紹介ですので、この点については深く追求はしません。

上記のエラーに当たらないための最もシンプルな手法は0%で開始位置を指定するのが楽でしょう。
なお、1つのドライブ上に2つ目以降のパーティションを作成する際は、0%指定は使えません。この場合は1つ前のパーティションのサイズにほぼ近い数字を入れてみましょう。下図では2つ目のパーティションを作成しており、開始位置を"10.1G"として指定しました。レイアウトが美しい。
image.png

ここまでくれば後は、フォーマットとマウントです。次のステップに進みます。

5. 上記で作成したパーティションをフォーマットする

フォーマット自体は、パーティションの作成ほど難しく有りません。
下図ではsdb1とsdb2に対してext4でのフォーマットを行っています。
image.png

mkfs.○○ の形式のコマンドです。○○には該当のファイルシステム名が入ります。
2つのパーティションに対してext4の記載が追加されたことが確認出来ました。
image.png

6. 上記でフォーマットしたパーティションをOSの特定のディレクトリへマウントする

最後はパーティションのマウントです。
Windows OSの場合ですと、各パーティションはドライブ文字を持ち、それぞれが各ドライブ文字のルートになります。
Linux OSの場合は、ユーザーが/配下の任意のディレクトリにパーティションをマウントします。

今回は、/mnt配下にtest01, test02という名称のディレクトリを作成しました。
image.png

下図ではマウントを実行し、2つのパーティションがそれぞれ/mnt配下のディレクトリにマウントされている様子をlsblkで確認しています。
image.png

これでファイルの保存が出来るようになりました。各ディレクトリに、rhcsa, rhceという名称の空ファイルを作成してみました。
image.png

7. 再起動後も、該当のファイルシステムが利用出来ることを確認する

ここまでようやくドライブの増設からファイルの保存が出来る状態にするまで様々な作業をしてきたのですが、実は再起動するとファイルシステムのマウントは解除されます。ですので、下図では先程のrhcsaやrhceファイルが確認出来ません。
image.png

再マウント後にlsで確認をするとファイルの生存が確認出来ました。
image.png

再起動後に、自動的に特定のファイルシステムが指定のディレクトリにマウントされるためには、"/etc/fstab"という設定ファイルにそれを記述する必要があります。

下図内の下から2行目と3行目に自動マウントするための行を追加しました。(vi /etc/fstabにて編集を行いました。)
一番左にあるのがsdb1とsdb2が持つUUIDと呼ばれるパーティションの識別子です。それ以降はマウント指定箇所やファイルシステムの情報を掲示しますが、記述ルールは以下を参照ください。
Linux豆知識 175「/etc/fstab」- LinuC
/etc/fstabに記述されている数字の意味-@IT
image.png

なお、パーティション毎のUUIDはlsblk -fで確認が可能です。
image.png

これで作業は以上となります。これ以降は再起動をした際でも自動的にfstabによって指定されたファイルシステムはマウントされます。

おまけ fstabの編集誤りは怖い

記述に問題が有ると、OS起動時に次のような画面になってしまいます。初見ですと完全にパニックになりますね。
image.png

fstab編集後の再起動である場合は、慌てずCLI画面上でfstabファイルを確認してみましょう。
最初のプロンプトではrootのパスワードを入力後コマンドを打てる状態になります。

cat /etc/fstabで確認してみた所、どこがおかしいか分かりますか?
image.png

上図では、下から2行目の先頭から"UUID="を削除して疑似障害を起こしてみました。本画面からもviコマンドでの修正は可能です。
修正後の様子がこちらです。
image.png

これで後は保存をして、再起動すればOKです。

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