labunix's blog

labunixのラボUnix

chroot-jessieにJava(JDK8)をインストールする。

■chroot-jessieにJava(JDK8)をインストールする。
 まだSqueezeを使っている人はchroot環境位、自分で構築出来るだろうけど。。。

 Squeeze上のsid chrootにjessieのchroot環境を構築、Squeezeへ移動
 http://d.hatena.ne.jp/labunix/20130507

 Wheezy上にchroot環境のWheezyを構築
 http://labunix.hateblo.jp/entry/20130819/1376924059

■ホストのWheezyに脆弱性の多いJavaを入れるのは気が引ける。
 「脆弱性の多い」の頻度はCVE数で考えた場合のほぼ1日に1回か、2日に1回の割合。
 ※影響度は考慮していない。

 $ wget http://cve.mitre.org/data/downloads/allitems.csv.gz && \
    gunzip allitems.csv.gz && \
    grep -i java allitems.csv | \
      awk -F, '/^CVE/ {print $1}' | cut -c 5-8 | \
      awk '{a[$1]+=1};END{for (n in a){print n,a[n]}}' | sort -nr -k2
2013 331
2014 232
2009 231
2010 206
2006 202
2008 198
2007 193
2012 177
2011 168
2005 130
2002 117
2004 62
2015 54
2001 47
2003 34
2000 28
1999 18

■インストール対象システムは、Jessie on Wheezy 64bit版
 chroot環境なので、「df」コマンドは使えない。

$ cat /etc/debian_version 
8.0
$ uname -m
x86_64
$ df -h
df: マウントされているファイルシステムのテーブルを読めません: そのようなファイルやディレクトリはありません

■chrootのホストであるWheezyには必要ならプロキシの設定がある前提。
 Oracleが提示するライセンスに同意してダウンロード。

 Java SE Development Kit 8u45
 Java SE Development Kit 8u45 Demos and Samples Downloads
 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

■scpなり、chroot-jessieのいずれかをマウントするなりして転送。

$ md5sum jdk-8u45-linux-x64*
003e3ed2cd19e3be7f94964a4d694492  jdk-8u45-linux-x64-demos.tar.gz
1ad9a5be748fb75b31cd3bd3aa339cac  jdk-8u45-linux-x64.tar.gz

■ホストのWheezy側でパッケージのセクションの確認。

$ echo "fakeroot java-common java-package" | \
  for list in `xargs`;do apt-cache show $list | grep ^Section;done
Section: utils
Section: java
Section: contrib/misc

■chroot-jessieのsources.listにはcontribが無いので追加。

$ grep contrib /etc/apt/sources.list && \
  sudo sed -i -e 's/main/& contrib/' /etc/apt/sources.list && \
  sudo apt-get update

$ echo "fakeroot java-common java-package" | \
  for list in `xargs`;do \
    dpkg -l $list | grep ^ii || sudo apt-get install -y $list; \
  done

■ユーザ権限でインストールする。

$ fakeroot make-jpkg jdk-8u45-linux-x64.tar.gz | sed -e 's/.sh /& \\\n/g'
Creating temporary directory: /tmp/make-jpkg.yeN0LktUcT
Loading plugins: /usr/share/java-package/common.sh \
  /usr/share/java-package/javase.sh \
  /usr/share/java-package/jdk-doc.sh \
  /usr/share/java-package/jdk.sh \
  /usr/share/java-package/jre.sh \
  /usr/share/java-package/oracle-jdk-doc.sh \
  /usr/share/java-package/oracle-jdk.sh /usr/share/java-package/oracle-jre.sh

Detected Debian build architecture: amd64
Detected Debian GNU type: x86_64-linux-gnu

Detected product:
    Java(TM) Development Kit (JDK)
    Standard Edition, Version 8 Update 45
    Oracle(TM)
Is this correct [Y/n]: Y

Checking free diskspace: done.

In the next step, the binary file will be extracted. Probably a
license agreement will be displayed. Please read this agreement
carefully. If you do not agree to the displayed license terms, the
package will not be built.

Press [Return] to continue: 


Testing extracted archive... okay.

Create debian package:
dpkg-buildpackage: source package oracle-java8-jdk
dpkg-buildpackage: source version 8u45
dpkg-buildpackage: source distribution unstable
dpkg-buildpackage: source changed by Debian Java Maintainers <pkg-java-maintainers@lists.alioth.debian.org>
dpkg-buildpackage: host architecture amd64
 dpkg-source --before-build package
dpkg-checkbuilddeps: Unmet build dependencies: libgl1-mesa-glx libgtk2.0-0 libxslt1.1 libxtst6 libxxf86vm1
dpkg-buildpackage: warning: build dependencies/conflicts unsatisfied; aborting
dpkg-buildpackage: warning: (Use -d flag to override.)

Aborted (-us).

Removing temporary directory: done

■まだライブラリが足りなかった。。。

$ echo "libgl1-mesa-glx libgtk2.0-0 libxslt1.1 libxtst6 libxxf86vm1" | \
  for list in `xargs`;do apt-cache show $list | grep ^Section;done
Section: libs
Section: libs
Section: libs
Section: libs
Section: libs

$ echo "libgl1-mesa-glx libgtk2.0-0 libxslt1.1 libxtst6 libxxf86vm1" | \
  for list in `xargs`;do \
    dpkg -l $list | grep ^ii || sudo apt-get install -y $list; \
  done
ii  libgl1-mesa-glx:amd64 10.3.2-1     amd64        free implementation of the OpenGL API -- GLX runtime
ii  libgtk2.0-0:amd64 2.24.25-3    amd64        GTK+ graphical user interface library
ii  libxslt1.1:amd64 1.1.28-2+b2  amd64        XSLT 1.0 processing library - runtime library
ii  libxtst6:amd64 2:1.2.2-1+b1 amd64        X11 Testing -- Record extension library
ii  libxxf86vm1:amd64 1:1.1.3-1+b1 amd64        X11 XFree86 video mode extension library

■もう一回。

$ fakeroot make-jpkg jdk-8u45-linux-x64.tar.gz | sed -e 's/.sh /& \\\n/g'
...

The Debian package has been created in the current directory.
You can install the package as root with:

    dpkg -i oracle-java8-jdk_8u45_amd64.deb


Removing temporary directory: done

■大量のファイルを含んだdebパッケージの出来上がり。
 インストール時に「update-alternatives」が自動で走る。

$ dpkg -c oracle-java8-jdk_8u45_amd64.deb  | wc -l
1838

$ sudo dpkg -i oracle-java8-jdk_8u45_amd64.deb 

■確認

$ whereis java javac
java: /usr/bin/java /etc/java /usr/share/java /usr/share/man/man1/java.1.gz
javac: /usr/bin/javac /usr/share/man/man1/javac.1.gz
$ java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)

■作成したパッケージと同じ情報であること。

$ dpkg -l | grep oracle-java | awk '/^ii/ {print $2,$3}'
oracle-java8-jdk 8u45
$ dpkg -L oracle-java8-jdk | wc -l
1838

■余談1
 今日インストールしたdebパッケージはどのくらい?
 他にも色々インストールしたので、Javaのためだけではありませんが。。。

$ grep ^`date '+%Y-%m-%d'` /var/log/dpkg.log | awk '/installed/ {print}' | wc -l
433

■余談2
 bashのCVE数は年に数回見つかる程度。
 ※影響度は考慮しない。

$ grep -i bash allitems.csv | \
    awk -F, '/^CVE/ {print $1}' | cut -c 5-8 | \
    awk '{a[$1]+=1};END{for (n in a){print n,a[n]}}' | sort -nr -k2
2014 8
2007 7
1999 6
2006 5
2013 3
2005 3
2010 2
2000 2
2012 1
2008 1
2004 1
2002 1

■PHPはCVE数の推移だけ見ると成長しているように見えます。。。

$ grep -i " *php *" allitems.csv | awk -F, '/^CVE/ {print $1}' | cut -c 5-8 | \
    awk '{a[$1]+=1};END{for (n in a){print n,a[n]}}' | sort -nr -k2
2006 3528
2008 3235
2007 3019
2002 1774
2009 1745
2005 1585
2010 1392
2001 1032
2014 896
2012 866
2011 846
2004 677
2013 628
2000 490
1999 356
2003 337
2015 156

$ grep -i " *python *" allitems.csv | \
    awk -F, '/^CVE/ {print $1}' | cut -c 5-8 | \
    awk '{a[$1]+=1};END{for (n in a){print n,a[n]}}' | sort -nr -k2
2008 33
2013 32
2014 31
2012 30
2011 24
2009 20
2010 16
2005 12
2006 11
2007 9
2015 6
2004 5
2002 5
2003 4