ホーム » スタッフ » 斉藤徹 » Computer

Computer」カテゴリーアーカイブ

2022年11月
 12345
6789101112
13141516171819
20212223242526
27282930  

最新の投稿(電子情報)

アーカイブ

カテゴリー

mariadbトラブル appamor

mariadb が止まってしまう

パッケージの更新をしていたら、mariadb が起動しなくなる。systemctl start mariadb を実行すると、コマンドラインに帰ってこない。Ctrl-Z で background にすると WordPress も動いているし問題ないのかと思えば、30分ほどするとエラーを吐いてとまる。journalctl -xe で吐いているエラーを確認すると以下のようなメッセージが残っていた。

AVC apparmor="DENIED" operation="connect" info="Failed name lookup - disconnected path" error=-13 profile="/usr/sbin/mysqld" name="run/nscd/socket" pid=67400 comm="mysqld" requested_mask="wr" denied_mask="wr" fsuid=118

メッセージを元にググると、こちらの記事が該当した。

AppArmor(Application Armor)は、各プログラムにセキュリティプロファイルを結びつけ、プログラムのできることに制限をかけるプログラム…らしい。(wikipediaより)

AppArmor の不具合を解消

パッケージを MySQL から MariaDB に移行する際に、AppArmor でトラブルが残ったみたい。こちらの記事を参考に、以下のコマンドで、ゴミを消したらうまく起動するようになった。

$ sudo aa-remove-unknown
Removing '/usr/sbin/mysqld'         mysql関連のゴミを消してくれたみたい。
$ sudo systemctl start mariadb      無事に起動

mariadb の utf8mb4 への移行完了

自宅サーバで、mysqlからmariadbへの移行、内部文字コードが Latin1 になっていたものを utf8mb4 への変更がようやく上手くいったと思う。そこで、学科のWebサーバも同様に移行作業を行う。ただ、文字コードの移行などの際にデータベースの物理ファイルを壊してしまったようで、どこまで上手く治ったのかが不安。

mysql5.7でFROZNモード

先日、mysql-server-5.6 からのアップグレードに失敗し、mariadb, mysql 8 などを入れたり消したりのトラブルを発生させちゃったけど、今日 “aptitude safe-upgrade” を実行したら、アップグレード時にデータベースの互換性で問題ありと判定され、FROZEN モードになってしまい、データベースとつながらなくなった。おかげで WordPress が動かなくなる。

明日からの試験で、Webでの講義資料公開ができなくなると、学生さんからも不満が出そう。

早々に修正と思うけど、FROZEN ファイルを読むと、mysql-server-5.7 が入っているけど、mysql-server-5.6 からのアップグレードに問題があるから、一度 5.6 にダウングレードしてから、5.7 にアップグレードしろ…との説明。

でも、5.6 はインストール対象から外されている。ひとまず、その後に dpkg-reconfigure mysql-server-5.7 を実行せよと書いてあるので、dpkg-reconfigure を実行。データベースの更新やらチェックが行われて、若干エラーが出たけどうまく修復できたみたい。rm /etc/mysql/FROZEN して systemctl start mysql を実行。無事 WordPress が動き出す。

mysql更新に失敗

自宅サーバが、mysql-5.6 で運用していたけど、世の中 mariadb-10.x , mysql-8.x のご時世なのでアップグレードしたけど、すごく苦労した。自宅は debian だけど mysql-5.6 は oldstable まで遡らないと管理されていない古いパッケージとなっていた。

mysql-5.7 は focal ではサポートしていない

色々とトラブルはあったけど、自宅サーバは mariadb-10.x にできたけど、この電子情報のサーバも確認したら、ubuntu20(focal) で mysql-5.7 で動いていた。これまた ubuntu18(bionic) まで遡らないと 管理されていないパッケージ。

ということで、自宅と同様に mariadb などに上げようとチャレンジしてみた。

しかし、これまた、mariadb-10.3 に失敗して、ダメ元で mysql-8.0 も試したけど、これまた失敗。昨日は自宅サーバの mariadb-10.4 になるまで苦労して疲れてるので、今回は断念。どうも、mysql-5.7 での root パスワードを忘れて更新してからの作業だったのが、諸悪の根源なのかもしれない。

bionic パッケージで mysql-5.7 で復旧… # 戻っただけじゃん…

ひとまず、bionic の apt-source を有効にして、mysql-5.7 をインストール。mariadb やら mysql-8.0 のゴミやら root パスワードの更新の悪影響かで、mysql-5.7 に戻すだけでも苦労したけど、ようやく復旧。

EmoCheck2.1

Emotet が2月に変化があったようで、EmoCheck 2.1 で改めて確認してみよう。

PDFファイルのタイトル/著者を一括修正

例年実施している学生の卒研発表のレジメ資料のWeb公開。しかしながら表示させると、画面の左上のメニュー部に「講演題目第1行目は…」。PDFファイルのタイトル部に、ひな形ファイルの属性が残っているみたい。著者欄にもひな形の著者情報が残っている。

なんとなくカッコ悪いので、タイトル部と著者情報を消したい。

((( 必要なツールのインストール )))
$ aptitude install libimage-exiftool-perl
((( 一つのファイルなら )))
$ exiftool -Title="" -Author="" -overwrite_original hoge.pdf
((( find+xargs で一括修正 )))
$ find . -name "*.pdf" -print \
  | xargs exiftool -Title="" -Author="" -overwrite_original

自室UPSの交換

今年に入り、たびたび自室の UPS がピーピー鳴くようになってきた。バッテリーの日付を確認すると7年以上前だった。apcupsd などのツールで監視はしていて、バッテリー供給可能時間 30分 はあったので、さすがに古くても瞬間停電には耐えられるだろうと使っていた。最近は1日に数回アラームが鳴るし、apctest コマンドを使って バッテリーの日付を新しくしておいたけど、やっぱりアラームが鳴る。

年度末に向けて、交換用の 新しい UPS (APC ES 750 USB: 外観は違うけど中身は今まで使っていたのと同じ) を購入しておいたので、ようやく交換した。バッテリーも購入したので、古い UPS の中身と入れ替えて、別に使う予定。

Emotet チェックツール EmoCheck

Emotet は、メール添付の マクロ付き Word / Excel によって拡散するマルウェアで、感染者のメールの Reply などを装って送信されるため間違って開く可能性が高く、広範囲に被害がでている。

全国の高専の中でも発生が確認されており、注意が必要となっている。(私の手元には、2月4日現在では届いていないけど)

このため、「Emotet の感染確認のためのツール EmoCheck での確認せよ」とのお達しが出ている。

ぜひとも、EmoCheck で感染確認をしましょう。

Linux演習

Linux演習資料

理解度確認

WebAssembly環境の構築

卒研で WebAssembly を使った開発をしてもらっているけど、自分でも試したいので環境の構築。

Debian emscripten パッケージだけではダメだった

卒研の学生さんが、emscripten 使っているという話だったので、”aptitude search emscripten” を実行したら、パッケージがあったので、”aptitude install emscripten” を実行。鉄板の hello world をコンパイルしようとしたら、”LLVM version appears incorrect (seeing “11.0”, expected “10.0”)”というエラーが出て、コンパイルに失敗。

llvm の C コンパイラとのバージョンが合わない様子。ということで、git より環境を構築してみる。

git で emsdk 環境の構築

通常ユーザであれば、”git clone https://github.com/juj/emsdk.git” を実行すると、その PATH 直下に環境が作られるみたい。こういう使い方は好きじゃないので…

$ sudo bash
((( ひとまず emscripten は必要みたい )))
# apt-get install emscripten # 導入後は不要?
((( emsdk のインストール )))
# cd /usr/local
# git clone https://github.com/juj/emsdk.git
# cd emsdk
# ./emsdk install latest
# ./emsdk activate latest

Hello World を試す

((( 自分の環境で以下のコマンドにより環境変数をセット )))
$ source /usr/local/emsdk/emsdk_env.sh
((( Hello World をコンパイル )))
$ cd ~/public_html
$ mkdir test
$ cd test
$ vi hello.c
#include 
int main( int argc , char* argv[] ) {
   printf( "Hello World\n" ) ;
   return 0 ;
}
$ emcc test.c -s WASM=1 -o test.html
$ ブラウザで test.html を開く http://...URL.../~t-saitoh/test/test.html

ブラウザから自分のC言語(wasm)を呼び出し結果を出力

$ mkdir html_template
$ cp /usr/local/emsdk/upstream/emscripten/src/shell_minimal.html html_template
$ vi html_template/shell_minimal.html
((( C言語側を呼び出すボタンを埋め込む )))
<textarea class="emscripten" id="input"></textarea>
<input type="button" value="CALL WASM" onclick="Module._ems_func();"/>

((( test.cxx )))
#include <stdio.h>
#include <emscripten/emscripten.h>
#include <string>

int main( int argc , char* argv[] ) {
  return 0 ;
}

// void* getElementValue_( char const* id ) { ... } が作られる
EM_JS( void* , getElementValue_ , (char const* id) ,
{
  var e = document.getElementById( UTF8ToString( id ) ) ;
  var str = e.value ;
  var len = lengthBytesUTF8( str ) + 1 ;
  // コンパイル時に -s EXPORTED_FUNCTIONS="['_malloc']" しないとエラーがでる
  var heap = _malloc( len ) ;

  stringToUTF8( str , heap , len ) ;
  return heap ;
 } ) ;

// std::string型はC++の文字列処理の型
//   std::string s( "abcde" ) ;
//   s.c_str() で、C言語のNULターミネータ付きの文字列を参照できる。

std::string getElementValue( std::string const &id )
{
  void *p = getElementValue_( id.c_str() ) ;
  std::string s( (char const*) p ) ;
  free( p ) ;
  return s ;
}

void setElementValue( std::string const &id , std::string const &value )
{
  EM_ASM( {
      var e = document.getElementById( UTF8ToString( $0 ) ) ;
      e.value = UTF8ToString( $1 ) ;
    } , id.c_str() , value.c_str() ) ;
}

#ifdef __cplusplus
extern "C" {
#endif

  /* HTMLに埋め込んだ onclick=_ems_func() で呼び出される*/
  void EMSCRIPTEN_KEEPALIVE ems_func() {
    std::string input = getElementValue( "input" ) ;
    setEnvironmentValue( "output" , input ) ;
  }

#ifdef __cplusplus
}
#endif

((( test.cxx をコンパイル )))
$ source /usr/local/emsdk/emsdk_env.sh
$ em++ -o test.html test.cxx -O3 -s WASM=1 -s EXPORTED_FUNCTIONS="['_main','_malloc']" --shell-file html_template/shell_minimal.html