やっぱりWSLでCentOSが使いたい(挫折編)

Bash On Windows、WSL(Windows Subsystem for Linux)で提供されているディストリビューションは ubuntu ですが、ubuntuの環境が動くんなら、他のディストリビューションも動くでしょ? というのが普通の感情(^^

ちょちょっとググってみると、やっぱりあります。
WSL Distribution Switcher ( https://github.com/RoliSoft/WSL-Distribution-Switcher )

Python3で書かれている一連のスクリプトツールのようですが、これを使うといろんなディストリビューションをインストールして切り替えて使えるようです! やったー!
ってなわけで、単純なオイラはすぐに Python の Windowsバイナリをインストールして、早速試してみました。

要するにこのツールは、LinuxディストリビューションのDockerイメージを取得・展開・切り替えの一連の手順をスクリプト化したもののようです。間違ってたらすみません。

で、結果的には、CentOSで運用できるところまではいかなかった・・・。いえ、一応CentOSをインストールできてbashは起動できたんですが・・・このエントリは、その時の備忘録です。

※ Pythonで書かれているので、Windows版のPython3バイナリをインストールしておく必要があります。cygwin環境のpythonだと dockerイメージの解凍に失敗してしまいました。この辺よく分かりません(m´・ω・`)m ゴメン…

上記サイトに行き、git 使っている方は、clone、使ってない方はzip書庫をダウンロードして適当なフォルダに展開してください。私は デスクトップに展開して作業しました。
ちなみに、Windows10のバージョンは Anniversary Update ( Windows10 v1607/Build14393 ) です。

まずは、README.mdに書かれている手順を行う前に、hook_postinstall_all.sample.sh というファイルをリネームして、hook_postinstall_all.sh にしときます。単に sample を消すだけです。
普通にインストールすると root のパスワードが設定されないので、困ることになるので、hook_postinstall_all.shを編集します。具体的には 下記の行をスクリプト上部のコメントが終わった直後ぐらいに追記しときます。

#rootのパスワード設定
ROOTPASSWD="0000" 

前準備完了。

1、get-source.py で Docker Hub 内の オフィシャルイメージを取得します。

僕の目的は CentOSの最新版なので、単に centos と指定。 たぶん動かないと思うけど CentOS6系なら ‘centos:6’ というような感じで指定するみたいです。指定の仕方は docker のまんまですね・・・。詳しくは上記サイトのREADME.md 参照。

C:\Users\xxx\Desktop\WSL>> python get-source.py centos

これで tarボールがダウンロードできました。

2、install.py で tarボールの解凍および切り替え

ダウンロードしたtarボールを指定するか、イメージ名を引数にして install.py を実行。

C:\Users\xxx\Desktop\WSL>> python install.py centos

これで、%localappdata%\lxss ディレクトリにある既存のubuntuが入った rootfs がリネームされ、新しい rootfs に先ほどのイメージが格納されます。
その後、hook_postinstall_all.sh が実行されます。

これで一応インストール完了。試しに bash を立ち上げて、/etc/redhat-release を見ると

$ cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)

3、switch.py で切り替える

元の ubuntu に戻すときは、

C:\Users\xxx\Desktop\WSL>> python install.py ubuntu:trusty

引数なしで実行すると、インストールされているディストリビューションの一覧が表示されます。

C:\Users\xxx\Desktop\WSL>> python install.py
usage: ./switch.py image[:tag]

The following distributions are currently installed:

  - centos:latest*
  - ubuntu:trusty

To switch back to the default distribution, specify ubuntu:trusty as the argument.

4、sudo とかその他諸々がエラーで使えない!!!

さて、実はこれからです(笑)
CentOSがインストールされてやったー!と思って、以下のコマンドを叩くと・・・

$ sudo vi /etc/hosts
sudo: unable to create sockets: Socket type not supported

どうやら sudo コマンドが使えないみたい・・・。
README.mdには、その対策として、 alias sudo=”sudo -S” で回避するように、とのことですが、僕の環境だと同じエラーが出ます・・・。
仕方ないので、su でrootになって作業するしかありません・・・めんどくさーーーーーー!
他にも、localectl とか timedatectl とか なんちゃらctl が動かない。どーなっとんじゃー!?

ってな感じです。CentOS7自体まだ触ったことないんで・・・。ちなみに CentOS6はbash自体起動できず。まぁ、カーネルバージョンが違うので当たり前? これもよくわかんないです。

ってなわけで? おとなしく ubuntu に戻しました・・・。今後のWSLのアップデートに期待です・・・。次のWindows10のバージョンアップ( Creators Update でしたっけ?)でネットワーク関係のシステムコールがまともに使えるようになるんでしょうか・・・・???? 現状ネットワークドライブにアクセスできないので、まともに使えない・・・Apacheとかsambaとかフツーに使えるようにしてyo!!!

(m´・ω・`)m オネガイシマス。

WSL/Bash + CMD.EXE = やめてくれ!

Windows10 Anniversary Update、スタートメニューやその他いろいろ更新されましたが、開発者としての関心事はやっぱり “Windows Subsystem for Linux”(以下WSL)じゃないでしょうか。。。さっそく開発者モードにしてこの機能を有効にしてみました(^^)

僕はてっきりBash用のターミナルで動かすんでしょう??(これでコマンドプロンプトからおさらばさ!) と思ってましたが・・・まさかのコマンドプロンプト(CMD.EXE)立ち上げ、からの “bash”タイプ・・・。ここでかなりのガッカリ感が・・・。

Linuxは Redhat系のCentOSしか知らないので、apt-get とかよくわかんねーよ。とりあえず、sudo apt-get yumとかでパッケージ管理してしまおうかな(笑)
WSL自体よく仕組みが分かんないけど、ubuntuの他にも選択肢があればいいのになー、と素人考えはダメですか(^^;;;

当面 Cygwin で問題無い。っていうか、ホンモノが欲しかったらVMで用意すれば・・・同じことができるんじゃ・・・。そういえば、DockerのWindows版が出たってニュース記事があったし・・・。

なんにせよ、選択肢が多いとどれ使えば正解なのかよくわかりません・・・。使いやすい環境を自分で構築していく労力が無駄だなぁーと思うときはあります・・・。本来の仕事が効率的に前に進まない・・・。

Tweet image download agent.


【追記】2016/09/06 テキストボックスのところをコンボボックスに張り替え。新しいものから10個まで入力履歴を記憶できるように修正。他、諸々修正。
https://osdn.jp/users/earlgreyx/pf/TwitterImageDownloadAgent/wiki/FrontPage


【追記】2016/04/27 GW前に、ちまちま修正他、検索ワードに対応。これで画像収集が捗るわい(^^;


ちょっと前に書いたツイッターの画像を一括ダウンロードするやつ、のGUI版を 非同期タスクのお勉強も兼ねて日曜プログラミング(^^;

コンソールでコマンドを打つ方が慣れているのでわざわざGUIみたいなクソめんどくさいもん書く必要もなかったんですが・・・。

とくに最近、C#でアシンクやらアウェイトやらウェイタブルとか今まで見たこともないキーワードがガンガン出てくるようなコードを見る機会が多くなったので、勉強がてら練習で作ってみました。・・・・というレベルです(m_m)
とはいいつつ、awaitとかasyncとかまだよく分からないので、Task.Run()をふんだんにちりばめてみました(^_^;;; ま、自分で使うツールだから動けばいいや。
検索とかはまだ実装していません、というか、自分には必要ないので、やるつもり無し。時間があればまたブラウザで解析して・・・時間があれば・・・。
そもそもこの手のツールは他にもっと便利なソフトが窓の杜とかVectorとか探せばあると思うので。。。
動画とかも落とせればいいかなー、とか思って昼休みにchromeの開発者ツールでちょっと調べてみたけど、結構めんどくさそうですね・・・。

twitterimageagent-1 twitterAgent2

Twitter APIじゃないので、ブラウザでの表示方法が変更されると誤動作するでしょう。

ビルド済みのファイルとあまり綺麗では無いソースファイルは、OSDN.JPの作業部屋 ↓↓↓から。(使い方よく分かってません・・・)
https://osdn.jp/users/earlgreyx/pf/TwitterImageDownloadAgent/wiki/FrontPage

CSSで文字回転

HTMLで表組みを組んでいくと、カラム数が多くなるとどうしても↓の左端のように不格好になりますよねぇ。。。。
damedame
イラレとかで文字を縦書きにして描画してSVGで書き出して配置すれば一応解決しますが・・・できるならそんなメンドッチーこと抜きに、画像を使わずCSSだけで済ませたい・・・。

はじめは、writing-mode プロパティを使えば縦書きにできるやろ???? と思ってth要素にwriting-mode: vertical-lrと設定してみたけど、だめだった。それならば・・・と思って、<th>タグ内のテキストを<span>タグで囲ってやり、そのspan要素に writing-mode: vertical-lr;を設定すれば一応縦書きになってくれた。
でも、望んでいるものと違う。縦書きだとアルファベットが90度回転してしまうので、縦書きではなく、横書きのまま90度回転した状態になってほしいんだな。。。

で、CSS3ならtransformプロパティでテキスト回転できる!ってのをグーグル先生に教えてもらって早速やってみたんですが・・・これがなかなか、圧倒的な知識不足でスマートな指定が分からない。試行錯誤して下記のような感じにできました。
kaiten
しかし・・・やり方がスマートじゃない・・・・。

<!-- HTML 抜粋 -->
<tr>
  <th><span style="margin-top:3em;">ほにゃらら</span></th>
  <td>
     ナンチャラ<br>
     かんちゃら
  </td>
</tr>

で、CSSは

/* ベンダープレフィックスは省略 */
th {
  vertical-align: middle;
  text-align: left;
  width: 1em !important;
}
th > span {
  transform: rotate(-90deg);
  transform-origin: left top;
  display: inline-block;
  white-space: nowrap;
  position: absolute;
  line-height: 1;
}

ようするに、セル内のspan要素を反時計回りに90度回転。デフォルトでspan要素の中心で回転するので不揃いになるので、回転軸は 左端上に設定。これだけではダメで、左端で回転するのでせっかくth要素でvertical-align:middleにして縦中央表示させているのにずれてしまう。これを補正するため、span要素にわざわざstyle属性で、span要素内の文字数の半分の長さだけマージンを設定。

span要素を補正するのはスクリプトを使って、文字数を割り出して・・・って自動でやればいいかもしれない。

/* サンプル */
(function($)
{
  $('th > span').each( function(){ $(this).css('margin-top', $(this).width() / 2); } );
}(jQuery);

一応画像は使わずできたけど、正直やり方が強引過ぎて納得できない。たぶんもっとCSS3のプロパティとか探せばパシッとスマートな設定(プロパティ・値)があるのかもしれないけど・・・ザラッと調べてみた感じ見つけられなかった。

グーグル先生にどういうワードで検索すればヒットするんだろ・・・T(;_;)T 教えてエロい人!

CentOS6でシステムのHDDを入れ替える手順

(*)その後を書き足し。(2016/5/2)
(*)若干書き足し。(2016/3/2)

例によって、記録(備忘録)記事です。前置きがかなり長いです(m_m)

社内で使用しているテストサーバーは、Webアプリケーションの開発及び稼働チェック、社内マシンへのDNSサービス、ダミーのMTA、ソース管理(Subversion)サーバー、Sambaによるファイルサーバー等、僕が仕事する上で必要な機能がたった1つのマシンに集約されてます。というか、一台しか使わせて貰えない(^_^;;;

さらに、このマシンは10年前に買ってもらったCore2 Duo搭載のWindowsXPマシンだったものを社内のOSをXPからWindows7に一斉に変更するタイミングでWindows7へのアップグレードの対象外にされたもの。これを半ば強引に奪い取り(笑)、Linux(CentOS)を入れて今まで特に問題もなく、使用してきましたが、なんせ10年もHDD交換せずに稼働してきたので、そろそろHDDも寿命が尽きる頃。っていうか、もう十分寿命過ぎてる感があるのですが・・・。

HDDだけ新品に交換すれば十分ということで、内蔵HDDを経費として認めてもらえそうなので、仕事が一段落したらシステム移行することにした。

Windowsなら、ドライブごとコピー・・・とかすればいいんでしょうけど、Linuxではやったことないし、2つのHDDをLVMパーティションで作成して/,swap,/usr,/homeという風に分けて使っているのでそう単純にいかないことに気付く。かといって、クリーンインストールはできるだけ避けたい(やってる暇が無い・・・)

ってことで、前置きが長くなりましたが、実作業前に手順を記録して、VMWareで仮想マシンを一度作成しCentOSをインストール後、新しい仮想HDDを追加してHDD移行をシミュレートしてみました。

結果的に上手くいったので実作業前に移行手順を記録しておくことにした。でも正直これでいいのかどうか分からない。参考程度に見て頂くといいかもしれない。

一応分からないことはドキュメントを読んだり、ググったりしたけど、rsyncとかddとかfdiskとか、LVM関係とかの基本的なコマンドは普段殆ど使わないからオプションの指定の仕方とか合ってるかどうかわからん。

素人なりに考えた方法なので、たぶんもっとスマートな方法があるんだと思う。。。

※ パーティションの作成とかブートフラグをつける、等のfdiskやpartedコマンドの操作は省いています。それもできない、分からない、という人は大人しくクリーンインストールした方がいいと思う(逃げ)

(1)環境のチェック

現在のHDD構成 。使用率は20%ぐらい。1TBあるけどほとんど活用されていない。CentOSインストールするときRAID1構成にしようと思ったけど、はじめて仕事で使うサーバーだったので、知識ないのと、なんかあったら怖い、という理由でRAID1構成を諦めた経緯がある(ーー;

  • /dev/sda (500GB)
  • /dev/sdb (500GB)

新しいHDDは、500GB。このHDDに現在のHDDをシュリンクする。

  • /dev/sdc (500GB)

moving

現在のパーティション構成 (*bootable flag)
-------------------------------------------
/dev/sda1(*) Linux        => /boot

/dev/sda2    Linux LVM -+
                        | =>  /,/home,/usr,swap
/dev/sdb1    Linux LVM -+

現在のPV
-------------------------------------------
/dev/sda2  VolGroup lvm2 465.27G
/dev/sdb1  VolGroup lvm2 465.76G

現在のVG
-------------------------------------------
name: VolGroup

現在のLV
-------------------------------------------
lv_home VolGroup ext4 465.76G
lv_root VolGroup ext4  50.00G
lv_swap VolGroup swap   8.00G
lv_usr  VolGroup ext4 407.27G

(2)新しいHDDを現在のHDDと同じ構成にする。

 /dev/sdc1 => /boot 用
 /dev/sdc2 => LVMパーティション(/,/usr,/home,swap用)

作成した/boot用パーティション(/dev/sdc1)へ現在の/bootパーティション(/dev/sda1)をコピー。

 >> dd if=/dev/sda1 of=/dev/sdc1 bs=64MB

LVMパーティション/dev/sdc2にボリュームグループを作成する。
この際VolumeGroup名を現在のものとは別名(VolGroup01など)にする。
(現在のHDDを取り外した後、現在の名前にリネームするので)

 >> vgcreate VolGroup01 /dev/sdc2

この新しいVolumeGroup01から論理ボリューム(LV)を切り出していく(サイズは適当)

 >> lvcreate VolGroup01 -n lv_root -L 22GB 
 >> lvcreate VolGroup01 -n lv_swap -L 8GB 
 >> lvcreate VolGroup01 -n lv_usr -L 70GB 
 >> lvcreate VolGroup01 -n lv_home -l 100%Free
 各論理ボリューム上にファイルシステムを作成
 >> mkfs.ext4 /dev/VolumeGroup01/lv_xxxx (xxxxはroot,usr,home)

 スワップ用には
 >> mkswap /dev/VolumeGroup01/lv_swap

ここまでで、一旦シャットダウンする。

(3)インストールメディアから起動し、レスキューモードで立ち上げる。

(VolumeGroupがinactiveの場合はアクティベートする)
>> vgchange -a y 

(マウントポイント作成)
>> mkdir /mnt/src
>> mkdir /mnt/src/root
>> mkdir /mnt/src/home
>> mkdir /mnt/src/usr
>> mkdir /mnt/dest
>> mkdir /mnt/dest/root
>> mkdir /mnt/dest/home
>> mkdir /mnt/dest/usr

(論理ボリュームをマウントする)
>> mount /dev/VolGroup/lv_root /mnt/src/root
>> mount /dev/VolGroup/lv_home /mnt/src/home
>> mount /dev/VolGroup/lv_usr /mnt/src/usr
>> mount /dev/VolGroup01/lv_root /mnt/dest/root
>> mount /dev/VolGroup01/lv_home /mnt/dest/home
>> mount /dev/VolGroup01/lv_usr /mnt/dest/usr

(パーティションごとコピーする)
rsync -aHxv /mnt/src/root/ /mnt/dest/root
rsync -aHxv /mnt/src/home/ /mnt/dest/home
rsync -aHxv /mnt/src/usr/ /mnt/dest/usr

(コピーが終わったらマウントを解除して、後片付け)
>> umount /mnt/src/root
>> umount /mnt/src/home
>> umount /mnt/src/usr
>> rm -fr /mnt/src
>> umount /mnt/dest/root
>> umount /mnt/dest/home
>> umount /mnt/dest/usr
>> rm -fr /mnt/dest

(fdisk or parted コマンドで/dev/sdc1 にブートフラグを付ける)

ここで、poweroff (shutdown -h now)する。

(4) 一旦電源断して古いHDDを取り外し、再度レスキューモードで起動する

レスキューモードで起動する際の最終段階で、既存のLinuxインストールの探索をスキップしないように。スキップしてしまうと、せっかく上でコピーしたパーティションが/mnt/sysimageにマウントされないので)

ここまで来たらあとは、ボリュームグループのリネームとMBRのインストールするだけ。現在のHDDを取り外した後は、新しいHDDが /dev/sda と認識されるはずなので、ボリュームグループ名を元に戻す。.autorelabelファイルの作成は別にしなくてもいいかも。たぶんリブートしたら強制的にリラベルされるはず(僕が試したときはそうだった)

(ボリュームグループ名を旧HDDにあったものと同じにする)
>> vgrename VolGroup01 VolGroup

(grubインストール: MBRの復旧?)
>> chroot /mnt/sysimage
>> grub-install /dev/sda

(selinux relabel)
>> touch /.autorelabel

(5) インストールメディアを取り外し、リブートして起動を確認する。

ここで、起動に失敗したら、なんかおかしい事になってるので、もう一度HDDを古いものに接続しなおしてやりなおし(^^;;;;
とにかく一度仮想環境で手順を実際にやっておく方がいいと思う。
僕はWindows上のVMWareでHDD容量を1/20サイズでシミュレーションをしたらどうにか上手くいってシステム移行ができた。

(6)でも、ホントにこれで移行できるかどうか分からん

実機で、しかもLinuxで、のシステム環境移行ってやったことないので、デーモンがいろいろ動いていて実稼働しているシステムが本当に移行後上手く動いてくれるのかすんげぇ心配。

また、実際に実機でやってみて結果を追記する予定。でも・・・まだHDD買えてないんですけどね(^_^;;そもそも移行前にHDDが限界で壊れたらどうしよう・・・オロオロ (・_・ )( ・_・) オロオロ

(7) その後 2016年5月2日 追記

飛び石連休の最中、1日だけ出ても仕事は中途半端になるので、システム移行を決行。
HDDは、東芝製のバルクHDD(DT01ACA050)の500GBを買ってきて、PCに接続・・・ブートしない・・・orz
いろいろ試行錯誤した結果、元からあるHDDと新しく買ってきたHDD全部SATAポートに繋ぐと、ブートしないと判明。BIOS画面では一瞬認識するけど、すぐフリーズする。元からあるHDDとマザーボードはかなり古い機種なので混在するとダメなのかもしれないが、原因は不明。

仕方ないので、S-ATA ⇔ USB3 の変換コネクタを使用して新しいHDDをUSBストレージとして認識させた。コピーが遅くなるけど、仕方ない。

移行そのものは、スムーズに進行・・・と思いきや、(3)のrsyncでコピーする際、スラッシュを付け忘れているのに気付かず、(4)のレスキューモードで再起動した際、既存のLinuxシステムの検索に失敗したorz 。結局mvコマンドで1つ上のディレクトリに移動(^^;;;

最終的には上手くいきました。手順と理屈がある程度分かると、ツールを使ったHDD丸ごとコピーよりマニュアルでやる方が早いかも(^^)