Fedora24でLinuxのkernelをbuildする

さて作業レポート. dockerの課題を先にやれと言われそうだが….

とりあえずKVMにあげてからの話.

まずLinuxのkernelを kernel.orgから持ってくる. …のだが,hostの都合で今回は4.8.6を使う

vm

$wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.8.6.tar.xz

バージョンは適当に変えよう. 落としてきたのはtar.xzファイルであるので解凍して展開する.

$tar  Jxfv  linux-4.9.tar.xz

(この展開している時スーパーハカー感あってすごく楽しい)

あとは公式サイトに書いてある通りにやっていく

$ dnf install fedpkg fedora-packager rpmdevtools ncurses-devel pesign 
$ dnf install ncurses-devel

はずなのだが…? これで通るはずだが,何故か1つずつやっていかないとinstall出来なかった…. しかし pesign-rh-test-certs は無いらしい.おいおい.

でめでたくbuild出来ると思いきや openssl/bio.h: No such file or directoryなエラーがmakeしてると出る. なので

dnf install openssl-devel

を行う必要がある.

履歴によると実際に僕がやったのはこの辺

    22 | install openssl-devel    | 2016-12-24 18:34 | Install        |    8   
    21 | install pesign           | 2016-12-24 18:27 | Install        |    3   
    20 | install fedora-packager  | 2016-12-24 18:23 | Install        |   86   
    19 | install kernel-devel     | 2016-12-24 18:17 | Install        |    1   
    18 | install zlib-devel       | 2016-12-24 17:07 | Install        |    1   
    17 | update                   | 2016-12-24 16:48 | E, I, U        |   86 EE
    16 | install ncurses-devel    | 2016-12-24 16:42 | Install        |    2   

ここまで行くと多分build出来るので

$make clean

$make mrproper

して設定を消去(ゴミ削除)して

$make menuconfig

する.kernel debugにチェックをいれないといけないが,実はデフォルトで入っている.そのままsaveして

$ make >& ers &
$ disown %m
exit

あたりすれば大丈夫らしい.

心配ならtmuxをinstallして起動した状態で

$ make >& ers &

を行えばバックグラウンドでmakeが行われていく筈. logはersに入っているのでmoreとかで確認すると1~2時間くらいでbuild出来ている.

続いて

make modules_install

とするのだがエラーが出る. どうも

dnf install elfutils-libelf-devel

しないとダメらしい.

あとは

make install

すればokなのだが,この後gdbで追う様の設定が結構キツイ.それはまた次回で


(追記 2017/01/15)

kernelのbuildで失敗することが多くなり(具体的には make manuconfigが出来ない)

色々試したのですが

dnf reinstall ncurses-devel

したら解決しました.コンパイラでマクロが読めてなかったのは,このライブラリ群が破損していたからだそうです.

VirtualBoxを使って(気合で)Fedora24のパーティションを拡張する

わりと辛かったのでメモ

講義でqcow2な形式を拡張して,LinuxのKarnelをbuildする必要があったのだが,root権限が使えない一般ユーザーなので 自分で出来るVirtualBoxでやってみる. 気合と書いてるのはその為.

なぜVirtualBoxを使わないといけないのか

どうもVirtualBoxで初期に振ったHDD容量以外は fdisk /dev/sda しても降ることが出来ないらしい….今回は2時間くらいそこで悩んだ


VirtualBoxでの操作

まずは拡張したいVirtualBoxのイメージをCloneしておく. 右クリックでClone押せば出来るっぽい.(なぜかCloneする時のアイコンが羊です) それで拡張する為に一旦shut downしておく.


 ターミナル上での操作

まずはローカルで ~/VirtualBox VMs にcd.

続いて容量の確認

$ VBoxManage showhdinfo anagura.vdi

UUID:           4e7f002a-a846-4880-a960-c59912501cd0
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       /Users/e155730/VirtualBox VMs/anagura/anagura.vdi
Storage format: VDI
Format variant: dynamic default
Capacity:       50000 MBytes
Size on disk:   4898 MBytes
Encryption:     disabled
In use by VMs:  anagura (UUID: c4dfd1e7-5ebd-44d6-abb3-c12a3494529d)

ここの Capacityが問題.今回はやった後なんでわりとでかいが,8Gb程度になってるはず. さて変換 30Gほどあれば良いか

$ VBoxManage modifyhd clone-disk1.vdi --resize 30720
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

多分確認すれば増えている筈.


実際に反映させていく

さてこれでHDDを物理的に増やした(仮想的だけど)ので,それを実際にマシン側に反映させていく.

とりあえず先程反映させたVMを起動,rootあたりで入っておく.(一応suとかしてrootになっとく)

まずは今現在のパーティション環境を確認したいので

$ fdisk /dev/sda

fdisk (util-linux 2.28.2) へようこそ。
ここで設定した内容は、書き込みコマンドを実行するまでメモリのみに保持されます。
書き込みコマンドを使用する際は、注意して実行してください。


コマンド (m でヘルプ): 

な画面を表示させる.ここで確認はpだからおもむろにpを押すと

デバイス  起動 開始位置 最後から   セクタ サイズ Id タイプ
/dev/sda1  *        2048  1026047  1024000   500M 83 Linux
/dev/sda2        1026048 16777215 15751168   7.5G 8e Linux LVM

な画面が表示される. これは後々使うのでメモっておいてください

ここでsda2の方を拡張するのでsda2を消す.(先の段階でサイズが直ってたら変更する必要ない) fdisk内でdを選択

コマンド (m でヘルプ): d
パーティション番号 (1,2, 既定値 2): 2

パーティション 2 を削除しました

な感じで削除. 続いて サイズ変更fdisk内でnを選択して作る この時 開始位置を最初の通りに設定する こと.多分デフォルトでそうなってる. 終了位置を書かれてるMAXに設定して,再びp をすると大きくなっている.

ここでファイルに反映させるので必ずwを推して書き込ませること.

で,実際に反映させる.

$pvresize  /dev/sda2
  Physical volume "/dev/sda2" changed
  1 physical volume(s) resized / 0 physical volume(s) not resized

さて変更されているか.

$ pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               fedora_401
  PV Size               48.34 GiB / not usable 2.00 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              12374
  Free PE               10452
  Allocated PE          1922
  PV UUID               QmA0cN-CnqX-2nFy-2FoX-JFh0-cWhP-V51KUs

やっためう!! さて続いては論理的に拡張 今回は /dev/mapper/fedora(fedora_401)-rootに対して行う

$ lvextend -l +100%FREE /dev/mapper/fedora_401-root          
  Size of logical volume fedora_401/root changed from 6.71 GiB (1717 extents) to 47.54 GiB (12169 extents).
  Logical volume root successfully resized.

確認しとく

[root@401]/home/anagura# lvdisplay                                        
  --- Logical volume ---
  LV Path                /dev/fedora_401/swap
  LV Name                swap
  VG Name                fedora_401
  LV UUID                RyM5Tj-qGQN-PM13-gMUo-Uy7R-SdDd-4Id4Yt
  LV Write Access        read/write
  LV Creation host, time 401.pc.ie.u-ryukyu.ac.jp, 2016-10-14 20:13:39 +0900
  LV Status              available
  # open                 2
  LV Size                820.00 MiB
  Current LE             205
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:1
   
  --- Logical volume ---
  LV Path                /dev/fedora_401/root
  LV Name                root
  VG Name                fedora_401
  LV UUID                LJZan7-IpRp-7ssR-0BbZ-rovN-LcLz-7QMzpR
  LV Write Access        read/write
  LV Creation host, time 401.pc.ie.u-ryukyu.ac.jp, 2016-10-14 20:13:39 +0900
  LV Status              available
  # open                 1
  LV Size                47.54 GiB
  Current LE             12169
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0

おーけー. ここで resize2fs /dev/mapper/fedora_401-root したさはあるが,これは古いらしく

$xfs_growfs /dev/mapper/fedora_401-root
meta-data=/dev/mapper/fedora_401-root isize=512    agcount=4, agsize=439552 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1 spinodes=0
data     =                       bsize=4096   blocks=1758208, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 1758208 to 12461056

で行う.

$ df -h                                 
ファイルシス                サイズ  使用  残り 使用% マウント位置
devtmpfs                      359M     0  359M    0% /dev
tmpfs                         371M     0  371M    0% /dev/shm
tmpfs                         371M  584K  370M    1% /run
tmpfs                         371M     0  371M    0% /sys/fs/cgroup
/dev/mapper/fedora_401-root    48G  3.8G   44G    8% /
tmpfs                         371M  8.0K  371M    1% /tmp
/dev/sda1                     477M  155M  293M   35% /boot
tmpfs                          75M     0   75M    0% /run/user/1000

無事変更されてる.良かった.

この辺参考にすると良い? qiita.com

mkdirしたら自動でリモートのmercurialにcloneする

というわけでzshrcあたりに記述するシェル芸を久々に書いた. いちいちcloneしたりpushする時にパス書くのも面倒くさいし ディレクトリ作るためだけにリモート行くのもやや面倒くさい…. その為に osmkdir ex2.11 とかするとディレクトリ生成とclone,ついでにhgrcを書いてpush出来るようにする関数を作ってみました.

osmkdirするとディレクトリとpathを記述したhgrcを作り,mercurialにcloneす ...

やってることはただコマンド並べてるだけなのでわりかし簡単…. SSH変数のとこを適当に変えてください

perlの()

最近Perl勉強しています.楽しいです. 今日の発見なんですが

#!/usr/bin/env perl
use strict;
use warnings;

chomp (my $input = <STDIN>);

sub reject{

    my $number = @_;

    if ($number == 0) {
       $number =1;
    } else {
       $number *= &reject($number-1); 
    }
}

print reject($input) ."\n";

なコードがエラーを吐いて? だったのですが. Perl入学式で質問してみると

いわゆるコンテキストなアレ 問題だったらしい.要素数だけが返されてたのね…

どうもただ ()使っているだけに感じていた

my($foo,$hoo) = @_;($foo,hoo) がリストとして解釈されたから上手く行っていたらしい. なるほど…Perlは奥が深い…

ぴかぴか(自称)のPerl1ねんせい

この記事は Perl入学式 Advent Calendar 2016 12日目の記事です。

自己紹介

今年から始まりましたPerl入学式 in 沖縄の受講生です.アナグラといいます.in沖縄は第2回まで開催されてますが,第1回の第三部から参加させて頂いてます.

情報工学系を勉強している大学2年次です.CodeHex先生の後輩に相応します.力の差があるので気楽に後輩と言えない.

受講したきっかけ

ぶっちゃけ詳しく覚えてないです. 確かCodeHex先生がニュースサイトに投稿しているので知ったような気がします. 当時は大学でC言語java,あとpythonをちょろっと触ったのですが,どれも今一踏み込んで書けるLevelではなく.

 スラスラ書けるのがシェルスクリプトだけ という状態だったので 母国語(プログラミング的な意味で)  が欲しくて受講を決めました.

ちなみに当時のPerlに対する認知レベルは Perl? 真珠? レベルです.

第2回までの流れ

in 沖縄では第二回の時に第三回も纏めて行ったので,知識としてはリファレンスあたりまで勉強しました. 講師はpapixさんやOkinawa.pmの皆さんが中心だと思います. perl入学式は勉強したことをすぐコードに起こすので,知識と実装が同時に入ってくる感じがあり勉強しやすいです. 何より楽しい

papixさんを始めサポーターの皆さんが優しいのですごい助かっています. Slackの方でも質問に答えて頂いて,ここまでしていただいて良いのかと思っています.

perlについて

復習と予習がてらリャマ本も進めていますが,正直リファレンスを初めとして未知の部分が多いです. コンテキストの違いはこないだ少しわかってきました.(多分)

今書いているコードはハッシュとpush,popなど以外はperlらしいコードをあまり書いていないんじゃないかなぁというレベルです. なのでよりPerlらしい(?)コードを書けるように勉強します!!

後はpaizaとかやってます.入学式に参加してからPerlでB問題が解けるようになりました…!嬉しい…!

懇談会

in 沖縄では毎回Perl入学式終了後にOkinawa.pmさんとの懇談会が行われます. 懇談会ではLTが行われたり,技術トークで盛り上がったり,相談に乗っていただいたりしています.

技術トークは技術力がないのでまだ追いついていけない事が多いですが,後々トークにあがっていたwordを聞くことがあり,いつか混ざりたいです.

それと前回の懇談会では自己紹介のLTさせて頂きました.温かい空気ありがとうごうざいます.

まとめ

まだin沖縄の全日程を走りきってないので卒業していないPerl 1年生ですが Perlはいいぞおじさん(Perl Monger) になれるようにコードガリガリ書いていきたいです.

とりあえずはアルパカ本を読み切るのがしばらくの目標です. 後は何か作ってみたいですね.はてなブログにターミナルから投稿できるプログラムとかとか….

なのでperl入学式in 沖縄卒業まで頑張っていきます! 

後は彼女がいないので,いつか「Perl入学式に参加したら彼女が出来た件について」書けるようになりたいですね.

container迎撃戦(途中)

作業メモですね.まだ終わってないというか詳細の考察が出来てないです…

作業の目的は dockerが作ったcontainerにhostから入り込めたいので,場所を特定する です.

とりあえずcontainerを作ってrunさせてみる. containnerの中にattachしておもむろにファイルシステムを調べるためにdfコマンドを使うと

$df .
Filesystem                                                                                           1K-blocks   Used Available Use% Mounted on
/dev/mapper/docker-253:4-4886298774-a92010df79ba7ec88ff7cf9805c59a0547f642c06599a5dfbc43b9e10952940b 103080888 641328  97180296   1% /

と/dev/mapperにmappingされてるファイルシステムを使っているらしい. 253:4-488とかは多分作られたcontainerに一意に振られたものなんだろうと予想.

containner内部でlsblkすると

[@a92010df79ba]/% lsblk                                            

**略 **

`-sdd1   8:49   0     2T  0 part 
sr0     11:0    1  1024M  0 rom  
loop0    7:0    0   100G  0 loop 
loop1    7:1    0     2G  0 loop 

おぅふ.中からはよくわからないが,dockerを走らせた状態で一旦抜けてホスト側から見ると

sr0                                   11:0    1  1024M  0 rom  
loop0                                  7:0    0   100G  0 loop 
└─docker-253:4-4886298774-pool       253:5    0   100G  0 dm   
  └─docker-253:4-4886298774-a92010df79ba7ec88ff7cf9805c59a0547f642c06599a5dfbc43b9e10952940b
                                     253:6    0   100G  0 dm   
loop1                                  7:1    0     2G  0 loop 
└─docker-253:4-4886298774-pool       253:5    0   100G  0 dm   
  └─docker-253:4-4886298774-a92010df79ba7ec88ff7cf9805c59a0547f642c06599a5dfbc43b9e10952940b
                                     253:6    0   100G  0 dm   

ふむ.loop0とloop1という名前で接続されてるのがこのcontainerの中身か. ならその中を見たいのだけど.

container側からdf取った時に見れたディレクトリに移動してみると

[e155730@dalmore]/dev/mapper% ls -la
 docker-253:4-4886298774-> ../dm-6

的なものが.ふ〜む.結局これはdm-6にリンク張られてるだけか. しかしdm-6というもの,物理的なファイルシステムを論理ファイルシステムとして見れるようにしたもの (昨日までの理解なので間違っている可能性大) なのでlessやcdは当然出来ない.

他のdockeerが絡んでそうな/var/libe/docker/ は管理者権限ないので覗けないし… これ以上追えない疑惑が…

実際dockerがホストのどこに配置したのかは自分のVMで作って見てみるのが早そうかなぁ. ただ学科のcontainerで計測したデータを転送したいのだけど,ホスト->containerは可能でも container->ホストはディレクトリが判明しないとわからないのでデータの送信という面でもどうするか….

う〜ん…このへんは聞かないとどうにもならなさそう…

さらにjavaシステムコールの処理時間はプロセス分けただけなら時間同じじゃね?と思ったら,containerの方が2倍ほど遅いという結果に…う〜ん…わからん…

mercurialのmerge関連

これですが手順としては間違っているので参考にしないで下さい

 

 

一応まとめておいたほうが良いかも?ということで OSの課題の奴です.参考になるかはわかりませんが.

mercurialでpull requestをするにはBitbucketとかgithubが自動でやってくれていた所を自分でどうにかしないといけない. それは何かと言えば,リモートのリポジトリの権限を振ってあげないといけない.

mercurialの場合,pushしたリポジトリからcloneしてpull request(push)する際に対象となるのはリモートのリポジトリgithub使ってるときは$git push origin master (だっけ)する対象だよね.

ただ自分が作っただけだとパーミッションが755.つまり自分だけしかなにも出来ない状態になっている. なので他の人がpushしようとしてもロックがかかってしまう訳.

じゃぁどうするかと言うと権限を変えれば良い. グループ内だけ出来るようにすれば良いので775で良いと思うのだけど,777にしとくのがベター? それと再帰的にするので -Rを忘れずに

$chmod 775 -R .hg

すればおそらく出来る筈.mergeは調べれば出てくる気がするけど

$ hg merge other-branch

あたりすれば良いかなぁ. 終わったらパーミッション戻しとこう

$chmod 755 -R .hg

閲覧サービスのgrafでmergeされてればokかな.たぶん


2016/12/01(追記)

mergeする際にconflictが起こった場合,OSXの場合はXcodeのFileMergeがデフォルトで起動するらしい. hgrcにmergeの記述を書いといたほうがエディタで書けるので便利