それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

NAS(Samba)のログイン・パスワードを削除してユーザーを変更する。

Samba にログインしたユーザー名を切り替える。

SambaログインするユーザーはWindowsに記憶されてて切り替えるのが面倒ですよね。一旦接続すると、切断するまで記憶しているし不用意に触ると接続してしまいます。

コントロールパネルの資格情報マネージャーで

保存したユーザ名とパスワードを消せる。

f:id:takuya_1st:20170122135008p:plain

f:id:takuya_1st:20170122134520p:plain

コマンド・プロンプトで切断。

毎回毎回切断作業やExplorerの再起動をするのはめんどくさいので、コマンドから履歴でEnterすれば簡単に切り替えられますね。

net use /delete * 

関連資料

http://takuya-1st.hatenablog.jp/entry/20101224/1293986650

ありがとうございます。

https://mobile.twitter.com/_HODA/status/822011412922798080

桜乃(´ . .̫ . `) (@cerasus26) on Twitter

参考資料

http://tecstaff.blog.so-net.ne.jp/2016-11-26_nasne-Windows10

Windows 10 のエクスプローラーの表示切り替えのショートカット

Windows 10 の表示切り替えが遠くて辛い

リボンメニューは粗悪品。小さいアイコン、大きいアイコン、一覧、詳細 の切り替えだけでちょっとどこにあるか探し回ることになって大変。なんで表示メニュー消しちゃったの・・・

エクスプローラーのレイアウト切り替えのキーボードショートカット

レイアウト    キー
特大アイコン    Ctrl + Shift + 1
大アイコン    Ctrl + Shift + 2
中アイコン    Ctrl + Shift + 3
小アイコン    Ctrl + Shift + 4
一覧    Ctrl + Shift + 5
詳細    Ctrl + Shift + 6
並べて表示    Ctrl + Shift + 7
コンテンツ    Ctrl + Shift + 8

マイクロソフトはどこに書いているの・・・

アクセシビリティにも、Windows10のキーボードショートカットの項目にも該当エントリがないので、存在しないのかと思っちゃったよ。

https://www.microsoft.com/ja-jp/enable/products/keyboard/default.aspx?navIndex=4#ln01

https://support.microsoft.com/ja-jp/help/12445/windows-keyboard-shortcuts

参考資料

Windows10 - エクスプローラーの表示レイアウトの変更(設定) - PC設定のカルマ

Sambaサーバーの接続を確認する。

linux からSambaサーバに接続を試す

Debian から、Sambaサーバに接続、ログイン、閲覧可能なフォルダ一覧を確認。いちいちWindowsに切り替えて確認するのも面倒な話だし。SSHでリモートでSamba接続くらい確認したいよねってことで。

smbclient コマンド

smbclient コマンドで、Samba への接続可否を確認することが出来る。

takuya@:~$ smbclient -L 192.168.2.8
Enter takuya's password:
Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.5.6]
tree connect failed: NT_STATUS_ACCESS_DENIED

同時にSambaサーバ側で ログを見る

エラーログを見ながらやると更に捗る。

takuya@NAS : $ sudo tail -f /var/log/samba/samba.log
[2017/01/19 18:28:16.477288,  1] smbd/service.c:678(make_connection_snum)
  create_connection_server_info failed: NT_STATUS_ACCESS_DENIED
[2017/01/19 18:28:16.489171,  1] smbd/service.c:678(make_connection_snum)
  create_connection_server_info failed: NT_STATUS_ACCESS_DENIED
[2017/01/19 18:28:33.829766,  0] smbd/map_username.c:140(map_username)
  can't open username map /etc/samba/smbusers. Error そのようなファイルやディレクトリはありません

接続が成功した場合。

takuya@:~$ smbclient -L 192.168.2.8
Enter takuya's password:
Domain=[WORKGROUP] OS=[Unix] Server=[Samba xx.x.x]

    Sharename       Type      Comment
    ---------       ----      -------
    sekkei01        Disk      設計01用フォルダ
    共用ファイル Disk      共通フォルダ
    takuya          Disk      ファイルサーバーのテスト場所
    temp            Disk      一時的に使うところ
Domain=[WORKGROUP] OS=[Unix] Server=[Samba x..x.x]

    Server               Comment
    ---------            -------

    Workgroup            Master
    ---------            -------

サーバー側でログオン状態を確認

smbstatus -b
smbstatus -d

まとめ

linux 側クライアントから smbclient サーバー側から、 smbstatustailf /var/log/samba/samba.log

GNU Linux でも brew コマンドで homebrew したい

brew 便利ですよね。

brew すごく便利です。 /usr/local/~/.brew などに環境を組み立てる事ができる。

linux 側でmake しまくってると管理がめんどくさいし、dpkg だと衝突が・・・

linuxbrew.sh というサイトがあった

調べたら http://linuxbrew.sh/ というサイトが出来ていた。

早速使ってみることに

事前準備

sudo apt-get install build-essential curl git python-setuptools ruby

インストール

takuya@:~$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install)"
==> This script will install:
/home/takuya/.linuxbrew/bin/brew
/home/takuya/.linuxbrew/Library/...
/home/takuya/.linuxbrew/share/doc/homebrew
/home/takuya/.linuxbrew/share/man/man1/brew.1
/home/takuya/.linuxbrew/share/zsh/site-functions/_brew
/home/takuya/.linuxbrew/etc/bash_completion.d/brew
/home/takuya/.cache/Homebrew/

Press RETURN to continue or any other key to abort
==> Downloading and installing Linuxbrew...
remote: Counting objects: 1060, done.

インストール完了

PATHを通す

export PATH="$HOME/.linuxbrew/bin:$PATH"

コマンドインストール出来る

takuya@:~$ brew list
takuya@:~$ brew install hello
==> Installing dependencies for hello: patchelf
==> Installing hello dependency: patchelf
==> Downloading https://linuxbrew.bintray.com/bottles/patchelf-0.9_1.x86_64_linux.bottle.tar.gz
######################################################################## 100.0%
==> Pouring patchelf-0.9_1.x86_64_linux.bottle.tar.gz
🍺  /home/takuya/.linuxbrew/Cellar/patchelf/0.9_1: 6 files, 1.2M
==> Installing hello
==> Downloading https://linuxbrew.bintray.com/bottles/hello-2.10.x86_64_linux.bottle.tar.gz
######################################################################## 100.0%
==> Pouring hello-2.10.x86_64_linux.bottle.tar.gz
🍺  /home/takuya/.linuxbrew/Cellar/hello/2.10: 52 files, 595.4K
takuya@:~$ hello
Hello, world!
takuya@:~$

sqlite 入れようとしたら・・・

ためしにsqliteをいれようとしたら、nucurses から入り始めた。

なるほど、完全にゼロから環境作るのか。安全にインストールできるけど、、、独自ディストリをユーザ空間に作るようなもので・・・コンパイル済みバイナリが提供されない初期のMac Homebrew な感じある。

takuya@:~$ brew install sqlite
==> Tapping homebrew/dupes
Cloning into '/home/takuya/.linuxbrew/Library/Taps/homebrew/homebrew-dupes'...
remote: Counting objects: 41, done.
remote: Compressing objects: 100% (41/41), done.
remote: Total 41 (delta 0), reused 3 (delta 0), pack-reused 0
Unpacking objects: 100% (41/41), done.
Checking connectivity... done.
Tapped 35 formulae (101 files, 329.5K)
==> Installing dependencies for sqlite: pkg-config, homebrew/dupes/ncurses, readline
==> Installing sqlite dependency: pkg-config
==> Downloading https://pkgconfig.freedesktop.org/releases/pkg-config-0.29.1.tar.gz
######################################################################## 100.0%
==> ./configure --prefix=/home/takuya/.linuxbrew/Cellar/pkg-config/0.29.1_2 --disable-host-tool --with-internal-glib --w
==> make
==> make check
==> make install
🍺  /home/takuya/.linuxbrew/Cellar/pkg-config/0.29.1_2: 11 files, 670.3K, built in 1 minute 8 seconds
==> Installing sqlite dependency: homebrew/dupes/ncurses
==> Downloading https://ftpmirror.gnu.org/ncurses/ncurses-6.0.tar.gz
==> Downloading from http://ftp.jaist.ac.jp/pub/GNU/ncurses/ncurses-6.0.tar.gz
######################################################################## 100.0%
==> ./configure --prefix=/home/takuya/.linuxbrew/Cellar/ncurses/6.0_2 --enable-pc-files --with-pkg-config-libdir=/home/takuya/.linuxbrew/Cellar/ncurses/6.0_2/lib/pkg

ただの移植っぽい

ある程度のコマンドはインストール出来るっぽいので、CentOS のEPELや Debian の apt が古いときに便利かもしれないです。

linux なのですが macvim とか見えるんですけどね。。。

takuya@:~$ brew search vim
macvim              pacvim              pyvim               vim                 vimpager            vimpc
takuya@:~$

WindowsBrew とかも出来ないかな・・・ と思って調べてみたら、onegetchocoscoop など乱立してていかにもwindowsらしい。Linux側もいずれ乱立していくんだろうな。。。私はまだcygwinでいくけどね。

関連資料

takuya-1st.hatenablog.jp

MacのHomeBrew環境におけるman について

homebrew いれてると man がグチャグチャ・・

brew したコマンドは無事に動くんだけど、man や completion などが結構大変。今回は man / manpath を何とかするために調べた話。

brew したgnu date の man はどこ?

BSDコマンドはLinuxメインの私には、ちょっと面食らうことが多いので、brewGNU コマンドを使っているのですが、man どこだ。。。

date の man
$ man date # BSD manual 
$ man date -M /usr/local/opt/coreutils/libexec/gnuman/ # GNU User manual

ということで、date コマンドのman は coreutils の gnuman にありました。

なぜ、見れないのか

manpath で解決しないのはナゼなのでしょうか?それは brew link してないからです。brew で link したものは、/usr/local/share/man にリンクされいつも通りに表示できました。それ以外(未link)は出てこないようです。

リンク非推奨の curl なども同じ

これらも 通常のman だけでは調べることが出来ない。

g-prefix については gつけたら見られる

上記のlink 非推奨で link 出来ないコマンドについては g-prefix をつけたらman を見ることが出来る

$ man gls
$ man grm
$ man gsed
$ man gdate
$ man ggrep
$ man gfind

ただし、それでもman が見られないものもある。

ls / date など頻繁に使うコマンドについても BSD コマンドより GNU コマンドのマニュアルをよく使うので、そっちを参照したい。

man のためだけに、いちいちlinux にログインするもの面倒だ

環境変数MANPATHに含めるしか無い。

coreutils / curl / sqlite に関しては、MANPATHで強引に解決することにした。

~/.bashrc
    MANPATH=$(manpath)
    if [[ $( realpath  $(which curl ) ) =~ local   ]] ; then 
      MANPATH=/usr/local/opt/curl/share/man:$MANPATH
    fi 
    if [[ $( realpath  $(which date ) ) =~ local   ]] ; then 
      MANPATH=/usr/local/opt/coreutils/libexec/gnuman:$MANPATH
    fi 
    if [[ $( realpath  $(which sqlite3 ) ) =~ local   ]] ; then 
      MANPATH=/usr/local/opt/sqlite/share/man:$MANPATH
    fi 
    export MANPATH

なぜ brew link --force しないのか

--forcebrew link をすれば一発解決なのですが。brew link 非推奨のコマンドはやっぱり リンクしないほうがトラブルが少ない。

過去に起きたトラブルで時間を無駄にした記憶がある。

「なんでこのコマンドはbrew インストールできない!!」 「なんでコマンド動かない!!」といったトラブルで時間を浪費したことがあり、その原因の大半が brew link --force だったのです。

まとめ

homebrew で入れたコマンドの man が見れない時

  1. g-prefix を試す. 例:ls → gls など
  2. manのパス指定を試す 例:man date -M /usr/local/opt/coreutils/libexec/gnuman/
  3. manpath を先にしておく。
  4. man コマンドでサイトに飛ぶ。 例function man(){ open https://www.die.net/search/?q=$1; }

の解決策がありそうでした。

おまけ

brew コマンドの日本語man はここにあった

takuya@~$ ll /usr/local/share/man/ja/man1/
total 44
lrwxr-xr-x 1 takuya admin 52 2016-11-28 02:08 evim.1 -> ../../../../Cellar/vim/HEAD/share/man/ja/man1/evim.1
lrwxr-xr-x 1 takuya admin 50 2016-11-28 02:08 ex.1 -> ../../../../Cellar/vim/HEAD/share/man/ja/man1/ex.1
lrwxr-xr-x 1 takuya admin 52 2016-11-28 02:06 nkf.1 -> ../../../../Cellar/nkf/2.1.4/share/man/ja/man1/nkf.1
lrwxr-xr-x 1 takuya admin 53 2016-11-28 02:06 nmap.1 -> ../../../../Cellar/nmap/7.31/share/man/ja/man1/nmap.1
lrwxr-xr-x 1 takuya admin 53 2016-11-28 02:08 rview.1 -> ../../../../Cellar/vim/HEAD/share/man/ja/man1/rview.1
lrwxr-xr-x 1 takuya admin 52 2016-11-28 02:08 rvim.1 -> ../../../../Cellar/vim/HEAD/share/man/ja/man1/rvim.1
lrwxr-xr-x 1 takuya admin 52 2016-11-28 02:08 view.1 -> ../../../../Cellar/vim/HEAD/share/man/ja/man1/view.1
lrwxr-xr-x 1 takuya admin 51 2016-11-28 02:08 vim.1 -> ../../../../Cellar/vim/HEAD/share/man/ja/man1/vim.1
lrwxr-xr-x 1 takuya admin 55 2016-11-28 02:08 vimdiff.1 -> ../../../../Cellar/vim/HEAD/share/man/ja/man1/vimdiff.1
lrwxr-xr-x 1 takuya admin 56 2016-11-28 02:08 vimtutor.1 -> ../../../../Cellar/vim/HEAD/share/man/ja/man1/vimtutor.1
lrwxr-xr-x 1 takuya admin 51 2016-11-28 02:08 xxd.1 -> ../../../../Cellar/vim/HEAD/share/man/ja/man1/xxd.1

brew コマンド man 自体はここにあった

takuya@~$ ll /usr/local/share/man/man1
total 4172

iTerm2 で表示色やスタイルを維持してコピー&ペースト

iTerm2 でも、リッチテキスト形式でコピペしたい

Terminal.app の場合だとテキストをコピーすると、色付きのRTF(リッチテキスト)でコピペされるんですよね。

これを iTerm2.app でもやりたいと思った。

Option+CMD+C で出来る

コピーするときに、Optionを押しながらコピペすると出来る。

f:id:takuya_1st:20170122040619j:plain:w400

貼り付けはリッチテキストに貼り付ける

コピーしたものを貼り付けるときは、色付きのテキストなので、リッチテキストのエディット・エリアに対して貼り付けることで取得することが出来る

evernote に貼り付けた例

f:id:takuya_1st:20170122034713j:plain:w300

TextEdit.app に貼り付けた例

テキストエディットをリッチテキストで起動すると次のようになって、iTermで取得したものをそのままコピペできるようになる。

f:id:takuya_1st:20170122035811j:plain:w450

コピペするときのコツ

背景色を白のテーマでコピペすると概ねうまくいくと思う。

ブログなどに便利

ブログやEvernoteに貼っておくとちょっとだけ便利になるかもしれないと思います。

Macクリップボードについて。

Macのコピペで使うクリップボードには、数種類ある。それらは、テキスト・バイナリ・リッチテキスト の3種類になっている。

リッチテキストのクリップボードとテキストのクリップボードはほぼ共通で使うことが出来る。クリップボードに格納・取得する際に、OSやアプリ側でどのクリップボードから取り出すか、保存するか決めることが出来る。

コマンドからHTMLで取り出すには、Appkitを経由しないといけないのですが、そんなに難しいわけじゃないので、そのうち作ろうと思う。

pdftk でPDFの各ページの上下左右の回転をする

pdftk でPDFを回転できる。

PDFtoolkit のコマンド pdftk でPDFを回転できたのでメモ

left , down , right

cat するときに、回転キーワードをつければ、全ページ回転できる。

pdftk in.pdf cat 1-endleft    output out.pdf
pdftk in.pdf cat 1-enddown output out.pdf

別の指定方法 north east south west

pdftk in.pdf cat 1-endwest    output out.pdf
pdftk in.pdf cat 1-endsouth output out.pdf

まとめ

回転 方角指定 向き指定
0 north
90 east right
180,+180 south down
270, -90 west left

down left right の例

north east soouth west

DPi 600 で 100ページ超えだと辛かった。

ただ、コレを試したがファイルサイズがあまりに大きいと、一括処理ができなかった。

いったんページを分割して全ページを1ファイルに分割し、それを全ページを1ファイルにまとめてやるとうまくいった。

いちいち imagemagick / convert を通さなくていいのは便利だな

ruby の ri でgemのドキュメントが見られない

mac OSX の ri がgems パッケージを見てくれない。

ri はgems ファイルを探してくれないので、ri は使えないものだと思ってた。

takuya@~$ ri Sequel
Nothing known about Sequel
takuya@~$

OSX バンドルの ri が見てくれないだけだった。

takuya@~$ which ri
/usr/bin/ri

そういえば、rbenv の ruby は実行遅いから直接叩いてたんだった。

rbenv の ri だと見れた

 takuya@~$ rbenv exec ri Sequel::sqlite --no-pager
Sequel::sqlite

(from gem sequel-4.42.0)
------------------------------------------------------------------------------
略

rbenv の ri のパスを指定したら見られた

rbenv exec ri で見られるのなら、/usr/bin/ri にパスを指定してみたら、見られる。

takuya@~$ ri   Sequel::sqlite -d  `gem environment gemdir`/doc/sequel-*/ri --no-pager
Sequel::sqlite

(from
/Users/takuya/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/doc/sequel-4.42.0/ri)
------------------------------------------------------------------------------

Top level module for holding all SQLite-related modules and classes for
Sequel.
------------------------------------------------------------------------------
Constants:

SQLITE_TYPES:
  Hash with string keys and callable values for converting SQLite types.

TYPE_TRANSLATOR:
  [not documented]


Class methods:

  mock_adapter_setup

念のため、gems の環境変数を確認

takuya@~$ gem environment
RubyGems Environment:
  - RUBYGEMS VERSION: 2.5.2
  - RUBY VERSION: 2.3.3 (2016-11-21 patchlevel 222) [x86_64-darwin15]
  - INSTALLATION DIRECTORY: /Users/takuya/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0
  - USER INSTALLATION DIRECTORY: /Users/takuya/.gem/ruby/2.3.0
  - RUBY EXECUTABLE: /Users/takuya/.rbenv/versions/2.3.3/bin/ruby
  - EXECUTABLE DIRECTORY: /Users/takuya/.rbenv/versions/2.3.3/bin
  - SPEC CACHE DIRECTORY: /Users/takuya/.gem/specs
  - SYSTEM CONFIGURATION DIRECTORY: /Users/takuya/.rbenv/versions/2.3.3/etc
  - RUBYGEMS PLATFORMS:
    - ruby
    - x86_64-darwin-15
  - GEM PATHS:
     - /Users/takuya/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0
     - /Users/takuya/.gem/ruby/2.3.0
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :backtrace => false
     - :bulk_threshold => 1000
     - :sources => ["http://rubygems.org/", "http://gems.github.com"]
     - :benchmark => false
(略

パスの解決めんどくさいのでalias することに

alias でいいや

alias ri=`rbenv which ri` 

ruby ri のドキュメントを一括削除・一括インストール

ri かわいいよ ri

ri 便利だよ。gem のインストールが遅いからと ri doc を消すことを推奨するエントリ多いけど ri 便利だよ?

ri があるものを全部インストール

ri の documentation があるものを全部インストール

gem rdoc --all --ri

ri のrdoc を全部消したい。

逆に rdoc がどれくらい容量あるのか見ておき、結構な容量だったら全部消してしまいたい。

gems でinstall された ri /rdoc のpath
takuya@~$ ls -ld   `gem env gemdir`/doc
drwxr-xr-x 159 takuya staff 5406 2017-01-19 16:46 /Users/takuya/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/doc
どれくらい容量くうのか

うちは200M くらいですね。Raspiとか小さめの容量でやってると死活問題。

takuya@~$ du -cksh    `gem env gemdir`/doc
189M    /Users/takuya/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/doc
189M    total
takuya@~$

どれくらいファイル数があるのか

gem 131 個にたいし、doc が 45,000 ファイル・・・。

takuya@~$ gem list | wc -l
131
takuya@~$ find  `gem env gemdir`/doc/ -type f  | wc -l
45861

330 files / gem くらいですね。こりゃ、インストール時間かかるわ。

riがあるgeems からrdoc を全部消したい

doc のフォルダを消して作り直すと手っ取り早い。

doc_path=`gem env gemdir`/doc
rm $doc_path
mkdir $doc_path

あとでまとめて入れることにする。

ri は あとで使いたいときにまとめて導入することにする。 あとからインストールで切ることがわかったので、毎晩の定期実行やトイレ行ってる間にまとめて入れればいいのではないか。

~/.gemrc
install: --no-ri --no-rdoc
update: --no-ri --no-rdoc

をかいて、gems をインストール時には --no-ri を基本にした。

mysql で無精するとCREATE TABLE がなんかいっぱいnot null が付く

SQL 作った

drop table if exists A;

create table A (
  id int  key,
  title varchar(256)
);
show create table A;

実行した

A      
 CREATE TABLE `A` (
  `id` int(11) NOT NULL,
 `title` varchar(256) DEFAULT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=latin1

not null なんかつけた覚えないのに。。。null で怒られたから、なんだろうと思ったら、not null ついてた。SQL難しい。。。

key と書いただけでも。primary key になるのが驚きだ

at_STARBUCKS_Wi2 のぱぱっと

セッションが切れまくるので自動化する。

30分くらいで切れちゃうので、バックグラウンドで、接続をチェックして切れてたら自動ログインするために、XHRを見てmechanizeに書いた。あらっぽい。。。

require 'mechanize'
m = Mechanize.new
m.get 'https://service.wi2.ne.jp/wi2auth/at_STARBUCKS_Wi2' #session-id cookie吐き出させる
m.page.form.submit # 同意手順に従う。
headers = {  "content-type"=> "application/json","dataType"=>"json" }
params = '{"login_method":"onetap","login_params":{"agree":"1"}}'
m.post('https://service.wi2.ne.jp/wi2auth/xhr/login', params,headers)

Wi2のログインはJSで、Cookieの有効期限を仕込んでるんだけど。何のために仕込んでるのか正直わからなった。。。

たぶん、他のWi2でもスマホでワンタップログインする系は、同じだと思う。

openresty/1.7.4.1 ってなんでですかね。

SQLでecho/print するための代替方法

SQL で記述しているとecho が無い。

あれこれSQLを書いてまとめて流しているとコメントを出力したいことがある。

SELECT * from A;
SELECT * from B;
SELECT * from C;

などとしていると、途中で改行を挟んだり、クエリがなんだっけとなるのです。

コメントを入れても出力されない。echo したい・・・

こういうことがやりたい→出来ない。
echo テーブルAの中身
SELECT * from A;
echo テーブルBの中身
SELECT * from B;
echo テーブルCの中身
SELECT * from C;

SELECT を工夫してみました。

select 'Hello World' as '' ;

select as カラム名を指定しないとカラム名の出力がされないので、print したっぽいくなる。

これを利用して

SQL で echo / print 関数っぽいことをやる

select '##  A ' as '';
select * from A ;
select '## B ' as '';
select * from B ;
select '## A,B ' as '';
select * from A , B;

実行結果

takuya@:SQL-JOIN$ mysql  example < sample1.sql
Password:

## A
id  title
1   A1
2   A2
3   A3

## B
id  name
1   B1
3   B3

## A,B
id  title   id  name
1   A1  1   B1
1   A1  3   B3
2   A2  1   B1
2   A2  3   B3
3   A3  1   B1
3   A3  3   B3

うん、それっぽくなって、SQLを次々と実行して出力結果を試すのが楽になったよ!

LVMのlvreduce でファイルシステム(ext)を縮小する(lvresizeについても)

LVMで管理しているボリュームを縮小する。

lvm2 で管理しているLVのボリュームを縮小して、容量を開放するための手順

作業手順は次のようになります。

  1. ターゲットのLVとそのファイルシステムを確認する
  2. FSを縮小する
  3. lv を縮小する

resize2fs はlvreduceの後でも先でもいいが、ボリュームサイズの変更の前にやるほうが無難

現在のファイルシステムとボリューム名を確認しておく。

$ sudo mount /dev/mapper/sample01-lv01 mnt
$ df -h mnt
ファイルシス              サイズ  使用  残り 使用% マウント位置
/dev/mapper/sample01-lv01    60G   44M   28G    1% /home/takuya/mnt
$ sudo umount /dev/mapper/sample01-lv01

ファイルシステムをリサイズする。

今回はext4 だったので、resize2fs を掛けていく。

ファイルシステムをチェックして
$ sudo e2fsck -f  /dev/mapper/sample01-lv01
e2fsck 1.42.12 (29-Aug-2014)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
リサイズする。

今回は60GB→30GB

takuya@:~$ sudo resize2fs /dev/mapper/sample01-lv01 30G
resize2fs 1.42.12 (29-Aug-2014)
Resizing the filesystem on /dev/mapper/sample01-lv01 to 7864320 (4k) blocks.
The filesystem on /dev/mapper/sample01-lv01 is now 7864320 (4k) blocks long.
リサイズできたのを確認

mount とかで確認

LV を縮小する

$ sudo lvreduce sample01/lv01 -L 30G
  WARNING: Reducing active logical volume to 30.00 GiB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce lv01? [y/n]: y
  Size of logical volume sample01/lv01 changed from 60.00 GiB (15360 extents) to 30.00 GiB (7680 extents).
  Logical volume lv01 successfully resized

2022-12-15 追記 lvresize を使う

いちどに沢山の量をリサイズすると、上記の方法ではうまくいかない。

そこで、lvresize を使ったほうが早い また、処理が2回はめんどくさい。上記の手順を一度に終える次のコマンドが安全で確実、
さらに、+/- を使って増分減分を指定できるので便利。

## 縮小
sudo lvresize -v --resizefs --size -10G /dev/mapper/my-root
## 拡張
sudo lvresize -v --resizefs --size +10G /dev/mapper/my-root

まとめ

lvreduce を使うことでかんたんにボリュームの容量を変更できて、物理HDDのパーティションをいじるより圧倒的に楽ちんですね。

2023-05-02

タイポ修正

参考資料

  • man resize2fs
  • man lvreduce

LVMの lvextend でLVを拡張する

LVMで作ったLVのパーティションを拡張する。

手順としては、物理HDDのパーティションを拡張するときや、HDDを大容量に換装した時の手順とほぼ同じですね。

  1. pv の確認
  2. vg の確認
  3. lv の確認
  4. lv の容量を追加する
  5. lv の上のファイルシステムを拡張する

LVの拡張には次のコマンドが大事

sudo lvextend -l +100%FREE vg_name/lv_name

ただし、このコマンドを実行するまでに、pvに追加vgに追加が必要なので、順番に書いておきます。

pv の確認

まず、PVの状態を確認しておきます。

$ sudo pvs /dev/sdc1 
  PV         VG   Fmt  Attr PSize   PFree
  /dev/sdc1       lvm2 ---  150.00g 150.00g

実験用のvg / lv / FS を作ります。

今回は、作業手順を確認するために、VGをそのためだけに作ることにした。

vgの作成
$ sudo vgcreate sample01 /dev/sdc1
  Volume group "sample01" successfully created
lv の作成
$ sudo lvcreate -n lv01 -L 30GB sample01
  Logical volume "lv01" created
$ ls /dev/mapper
sample01-lv01
FSの作成
$ sudo mkfs.ext4 /dev/mapper/sample01-lv01
mke2fs 1.42.12 (29-Aug-2014)
Creating filesystem with 7864320 4k blocks and 1966080 inodes
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
マウントして確認しておく

30GBのファイルシステムが作られていて正しく扱えることを確認した。

$ sudo mount /dev/mapper/sample01-lv01 mnt
$ ls mnt
lost+found
$ df  mnt
ファイルシス              1K-ブロック  使用   使用可 使用% マウント位置
/dev/mapper/sample01-lv01    30832636 44992 29198396    1% /home/takuya/mnt

LV の拡張

実験用の環境が作れたので、ここから、LV を拡張してく。

最初にアンマウントしておく
$ sudo umount /dev/mapper/sample01-lv01
lvextend でLVに容量を追加する。
$ sudo lvextend -L +30GB sample01/lv01
  Size of logical volume sample01/lv01 changed from 30.00 GiB (7680 extents) to 60.00 GiB (15360 extents).
  Logical volume lv01 successfully resized

ポイントは追加したい容量を引数で指定する 。上記の例では30GBを足すので、 -L +30GB と増分を書く。

同じことをするのに、他の指定方法もある。

  • -L +30GB 増分の指定
  • -L 60GB 増加後の容量の指定
  • -l +20% 増分を%で指定。 (VGに対しての%)
  • -l 40% 増分後の容量を%で指定。  (VGに対しての%)
  • -l +100%FREE 残りの容量を全部割り振る

計算が面倒なときや大体でいいときはパーセント指定が楽だよね。あとでLVMは容量変えられるし。

使用量が変化したことを確認しておく

pvs で割当ての容量が変化して、FREEの空き容量が減ったことを確認。

$ sudo pvs /dev/sdc1 
  PV         VG       Fmt  Attr PSize   PFree
  /dev/sdc1  sample01 lvm2 a--  150.00g  90.00g

lvs で、容量が変化していることを確認。

$ sudo lvs sample01/lv01
  LV   VG       Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv01 sample01 -wi-a----- 60.00g

ボリュームの容量が増加したので、これでほぼ作業は終了。あとはファイルシステムをボリュームの空き容量に合わせて拡張していく

ファイルシステムを拡張する

今回は、実験用にext4 を使ったので、ext4 の拡張手順に従って拡張する。

最初にe2fck -fでチェックしておく
$ sudo e2fsck -f  /dev/mapper/sample01-lv01
e2fsck 1.42.12 (29-Aug-2014)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/mapper/sample01-lv01: 11/1966080 files (0.0% non-contiguous), 167409/7864320 blocks
次に resize2fs で空き容量いっぱいまで拡張する

次に、resize2fs のコマンドをオプションの容量指定無しで用い100%までファイルシステムを拡張する。

$ sudo resize2fs /dev/mapper/sample01-lv01
resize2fs 1.42.12 (29-Aug-2014)
Resizing the filesystem on /dev/mapper/sample01-lv01 to 15728640 (4k) blocks.
The filesystem on /dev/mapper/sample01-lv01 is now 15728640 (4k) blocks long.

最後にマウントして確認

$ sudo mount /dev/mapper/sample01-lv01 mnt
$ df -h mnt
ファイルシス              サイズ  使用  残り 使用% マウント位置
/dev/mapper/sample01-lv01    59G   52M   56G    1% /home/takuya/mnt

以上で拡張の手順は終わり。

物理HDDで使う時と、LVMで容量を拡張する時の、2つの大きな違いは、容量追加がとても楽なこと。

パーティションの移動や、前半部分を開けたり後方部分を開けたりといったfdisk のめんどくさい作業が要らなくなって嬉しい。

パーティションを移動するときに比べて圧倒的にかかる時間が少ないのも魅力的である。

ただ、物理ディスク内を虫食いに使ってしまうので、リカバリ時に少し苦労するかもしれない。その懸念もLVMをちゃんと使えれば防ぐことが出来る。その話はまた別のエントリで。

参考資料

  • man lvextend
  • man resiz2fs
  • man e2fsck

LVMでボリュームを切り出して使う - 使い方とメリット

LVM 出来ることを試していくシリーズ

LVMでボリュームを切り出して使う。

今回は、大きなディスクから、小さなディスクを作ってみる。

LVM的に表現すれば、VGから複数のLVを生み出す。この作業になります。

LVM でボリュームを分割する

LVM でLV(論理ボリューム)を切り出して使うことの特徴について。

/dev/sda からパーティション切出しと、似ていますが全然違います。LVMはデバイスマッパー(ディスクの仮想化みたなもの?)なので、パーティションより低レイヤになります。つまり、LVとは可変長のハードディスクだと思っていたらいいと思う。パーティションだと、並び順を意識して容量を変更していきますが、LVMでは不要です。

今回試すこと

LV から複数のLVを切り出して、その中にパーティションを作る。

PV / VG を作る

ぱぱっと実験用のLVMのVGを作っておきます。

$ sudo pvcreate /dev/sdc1
$ sudo vgcreate sample01 /dev/sdc1
$ sudo vgs
  VG       #PV #LV #SN Attr   VSize   VFree
  acid       1   3   0 wz--n- 223.57g 128.57g
  sample01   1   1   0 wz--n- 150.00g 150.00g

一つ目のLV を作成します。

一つ目は lv01 という名前で、VG の空き容量の20% を割当ててみます。

$ sudo lvcreate -n  lv01  -l 20%FREE sample01
  Logical volume "lv01" created
$ sudo lvs
  LV   VG       Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv01 sample01 -wi-a----- 30.00g

二つ目のLVを作成

二つ目は、容量を30GBで指定して作成してみます。

$ sudo lvcreate -n  lv02  -L 30GB  sample01
  Logical volume "lv02" created
$ sudo lvs
  LV   VG       Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv01 sample01 -wi-a----- 30.00g
  lv02 sample01 -wi-a----- 30.00g

lv01 の容量を増量します。

lvexntend を使って、容量を増加させることが出来ます。vg の空き容量から割当てられます。

$ sudo lvextend   -l +20%FREE  sample01/lv01
  Size of logical volume sample01/lv01 changed from 30.00 GiB (7679 extents) to 48.00 GiB (12287 extents).
  Logical volume lv01 successfully resized

ここの動作がディスクのパーティションを作成時との、場合と大きな違いです。

今回は20%を空き容量から割当ててパーティションに追加しました。

もしディスクのパーティションで容量を分割している場合だと、こんなに手軽に容量追加は出来ないでしょう。

ディスクパーティションを切っていた場合。

もし以下のようにパーティションを割っていた場合を考えてみましょう。

  • /dev/sdc
    • /dev/sdc1 30%
    • /dev/sdc2 30G
    • 60%未使用

パーティションを移動のために、まず /dev/sdc2 を後退させ、次に /dev/sdc1 を拡張します。さらにファイルシステムをリサイズし、終わったら確保した空き容量に/dev/sdc1を拡張する必要があります。これはパーティションファイルシステム開始位置を決めないといけないのですごく面倒です。パーティションの移動って面倒なんですよね。dd でパーティションを一旦未使用領域に移せば作業の工数的には楽です。しかし時間がもったいないです。resize2fs とfdisk でパーティションを移動もいいのですが、不便ですよね。

パーティションの場合利用容量に正比例して必要時間が増えていきます。一方でLVMを使ったLV作成・追加では時間がほぼゼロです。これがLVMのLVとVGで管理と、パーティション管理する場合の違いと言えるでしょう。

まとめ LV によるPE分割のメリット

  • /home, /var など容量の読めないものでも扱いやすい。
  • 容量が必要になっても大丈夫
  • 時間はかからない。
  • とりあえず分けておいてあとで考えられる。
  • LVは可変長サイズ・ハードディスク

また、次のようなことも出来ます。

拡張と縮小は別に書きます。