ソースの表示以前のリビジョンバックリンク全て展開する/折り畳む文書の先頭へ Share via Share via... Twitter LinkedIn Facebook Pinterest Telegram WhatsApp Yammer Reddit Teams最近の変更Send via e-Mail印刷パーマリンク × FreeBSD環境で更新日が1970年1月1日になったNextcloudのファイルを直す 数年前のある日、突然Nextcloudのクライアントが「ファイルの更新日時が不正」というエラーを吐いてファイルの同期ができなくなった。確認してみると、大量のファイルの更新日時(mtime)が1970年1月1日になってるやんけえええええええ!!!! どこをどうみてもUNIXエポックです、本当にありがとうございました。デスクトップクライアントv3.4.0でのやらかしらしい? 同期を再開させるだけなら、touchでmtimeを現在日時に更新してやればよい。でもワタクシはファイル探すときに結構mtime使うんですよね、なので極力元に戻したい。幸い、作成日時(ctime)とアクセス日時(atime)のいずれかは無事なようなので、それらからmtimeの復元を試みる。公式でmtime correction tool kitという、名前のとおりの復旧ツールが用意されているが、こちらはLinux環境向けでFreeBSDでそのまま使うことはできない1)ので、これらを参考に手動で直す。 まずは、mtimeが1970/1/1になったファイルを抽出する。Nextcloudのデータフォルダは/mnt/nextcloud/dataとする。 findで「mtimeがUNIX時間の0である」と指定する方法がわからなかったので、「mtimeが40年前(2024年9月時点で1984年9月)より新しい」とした。単位は分であることに注意。で、該当するファイルの作成日時(birthtime)、作成日時(ctime)、更新日時(mtime), 最終アクセス日時(atime), ファイル名をファイルに書き出す。 # cd /mnt/nextcloud/data # find . -mmin +21024000 -print0 | xargs -0 stat -f "%SB,%Sc,%Sm,%Sa,\"%N\"" -t "%s" > /tmp/epoch_time_file_list.csv CSVをExcelで開き、諸々整形する。UNIX時間→Excel日時の変換数式は=(UNIX時間のセル+32400)/86400+25569で、セル書式をyyyy/mm/dd hh:mm:ssとすればよい。 とりあえず、各種タイムスタンプの中で最も新しい値をmtimeとして採用することにした。どうもNextcloudに突っ込んだ時点でmtime以外の情報は消失しているような気がする2)ので、こんなに頑張っても仕方ないと思いつつ、現在日時にするのはなんか嫌なので。 Excelからタイムスタンプ,ファイルパスのCSVを書き出し、以下のようなスクリプトに食わせればmtime, atimeがそれなりに復旧できる。 #!/usr/local/bin/bash while IFS=, read datetime file do touch -t $datetime "$file" done < $1 それにしてもだなー、Nextcloudがmtimeしか保持してないっぽいのは結構衝撃。デバイス間の同期が楽で、意識することなく履歴付きバックアップにもなるなーと思って建てたけど、自分の用途には合わないかなぁ…便利なんだけどさー。zipなんかも更新日時しか保持しないし、アクセス日時はともかく、みんな作成日時とか気にしないのかしら…? 他のクラウドストレージはどうなんだろう、と気になってたらDropboxとGoogle Driveを調べてる方がいた。子曰く、どちらも基本的に同期クライアントを使った場合は更新日時は保持されるとのこと。デスヨネー。 結局、ファイル属性含めて保持しておきたいなら、ローカルストレージかSMBでせっせとバックアップするしかないのかねぇ。理想の形はMacのTimeMachine。設定したら知らぬ間にバックアップがとられてて、イザって時に大助かりというやつ。WindowsもVSS(復元ポイント)で似たようなことはできるが、如何せんUIがダメダメすぎる。TimeMachine並にイケててリッチにしろとは言わないが、ファイル/フォルダのプロパティに押し込まれててアクセス性が最悪すぎる。 かといってOneDriveは仕様が素晴らしすぎて全く使う気になれないし。 Windowsのバックアップソリューション、もっとなんとかならんものか。 参考サイト Desktop client 3.4.0 destroys local time stamp and keeps uploading data to server - 📱 Desktop & mobile clients - Nextcloud community GitHub - nextcloud-gmbh/mtime_fixer_tool_kit: Tool kit to fix the mtime issue on the server state 多分すごく分かり易い!UNIXTIMEをエクセルで扱う方法 - まるノート 【備忘録】ファイルの更新日時を維持したまま、オンラインストレージに預けたり取り出したりしたい!|犬川さと 1) コマンドの書式が微妙に異なり動かない 2) DB上はmtime, mtime_storageというフィールドしかない。初回アップロードを行ったオリジナルのローカルファイルが無くなると、ctime等は失われると思われる。 Windowsのローカルユーザーのパスワードをネットワーク越しに変更する Ctrl+Del+Altからのパスワード変更画面で、ユーザー名をリモートコンピュータ名\ユーザー名とすると、ローカルPCアカウントと同じ要領でリモートPCのローカルアカウント(ややこしい)のパスワードを変えられるそうなんだけど、最近のWindowsでは以下のおまじないが必要だそう。 コマンドプロンプトで以下のコマンドを実行(レジストリ追加) REG ADD HKLM\SYSTEM\CurrentControlSet\Services\LanManServer\Parameters /v NullSessionPipes /t REG_MULTI_SZ /d SAMR /f REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Lsa /v RestrictRemoteSamAuditOnlyMode /t REG_DWORD /d 1 /f Windowsファイアウォールで「Netlogonサービス」を許可 ファイヤウォールの穴あけまで言及してるサイトが殆どなくて結構ハマった。 参考サイト 山市良のえぬなんとかわーるど: 覚書:リモートからサーバーのローカルユーザーのパスワード変更(ワークグループ、Windows Server 2016 以降) リモトでサバのパスワド更 - 役に立つ…かもしれないパソコン日記 動的ライブラリをリンクしたシェルをログインシェルにしてはいけない freebsd-updateなどでシステム更新の際、手順ミスでライブラリに不整合が生じることがある。Shared object “libxyzw.so.8” not found的なアレ。 これがログインシェルで起きると悲劇で、シェルの起動に失敗しシステムにログインできなくなってしまう。マシンに物理アクセス可能ならシングルユーザーモードなりで復旧可能だが、アクセス手段がsshとかしかなかったりすると詰むんですわ。お察しの通り、記事にしてるくらいだから実際に詰んだんですけどね。 実家サーバをfreebsd-updateが中途半端な状態で再起動したら、以下のような状態でsshログイン不可になってしまった。 $ ssh Decomo@192.168.0.1 Password for Decomo@: Last login: Sun Nov 6 13:06:52 2022 from 192.168.0.2 FreeBSD 13.1-RELEASE-p1 GENERIC Welcome to FreeBSD! Release Notes, Errata: https://www.FreeBSD.org/releases/ Security Advisories: https://www.FreeBSD.org/security/ FreeBSD Handbook: https://www.FreeBSD.org/handbook/ FreeBSD FAQ: https://www.FreeBSD.org/faq/ Questions List: https://lists.FreeBSD.org/mailman/listinfo/freebsd-questions/ FreeBSD Forums: https://forums.FreeBSD.org/ Documents installed with the system are in the /usr/local/share/doc/freebsd/ directory, or can be installed later with: pkg install en-freebsd-doc For other languages, replace "en" with a language code like de or fr. Show the version of FreeBSD installed: freebsd-version ; uname -a Please include that output and any error messages when posting questions. Introduction to manual pages: man man FreeBSD directory layout: man hier To change this login announcement, see motd(5). ld-elf.so.1: Shared object "libncurses.so.8" not found, required by "fish" Connection to 192.168.0.1 closed. ログインシェルの変更さえできればリモートアクセスできそうなものの、ssh経由で実現する方法はついぞ見つけられなかった。実のところ作業自体は11月の実家帰省中に行っており、目の前にマシンも液晶モニタもあるのに、D-Sub→DVI-Iのケーブルがなく、手も足も出なかったという。この度、ケーブル持参でようやく復旧できたというわけ。 そもそも、リモートアクセス手段しかない状態でシステム更新すんなよって話だが…静的リンクなbashであるbash-staticがPortsに存在する理由を“わからせ”られた。 というわけで、動的リンクなシェルをログインシェルにしてはいけない。どうしても設定する場合は、/bin/shをログインシェルとするリモートアクセス可能な緊急回復用ユーザー3)を作っておくと良いだろう。 3) rootとtoorの関係が近いが、well-knownなユーザーをssh可にするのは流石に怖い FreeBSDのSambaのビルドでncurses not availableが出てた 家鯖のFreeBSDのnet/samba413をビルドしようとすると、configureでncursesが見つからんと言われてコケるようになっていた。 ncurses not available, cannot build regedit ncurses not available, but --with-regedit was specified ncursesってbaseに含まれてたような…なんでエラーになんの?と思いつつ、念のためdevel/ncursesを入れても効果なし。Sambaの依存パッケージじゃないし、そりゃそうだ。 portsのバグを疑いしばらく放置&再試行してみたものの、一向に直る気配がない。そもそもエラーでググってもそれらしい結果が出てこないので、自分の環境の問題なのだろう。 では、どうやってシステムのncursesを直すか? base.txzあたりでシステムを上書きすれば良さそうではあるものの、ncursesがどのtarballに含まれているのかが分からない。かといって、なんも考えずにtxz一式を展開した結果、設定ファイルなどがデフォルトに戻るのは避けたい。 そんな感じでモニョってたんだけど、たまたま目にしたFreeBSD-SA-00:68.ncursesに解決策があった。/usr/src/lib/libncursesでmake installするだけで良かったのだ。 # cd /usr/src/lib/libncurses # make && make install そしてSamba 4.13が無事ビルドできて一件落着。 # portmaster net/samba413 システムを飛ばしたときの復旧が不十分だったんだろうなぁ、たぶん。近いうちにbuildworldしとくか… ディスクがどのzpoolに所属していたか調べる 複数のHDDを抜き差ししてると、どのHDDがどのzpoolの構成員か分からなくなる事がある。ちゃんと管理しとけって話だが、そんな時はzdb -lでZFSのラベル情報を表示すればよい。 ProxmoxVE (ZFS on Linux)での実行なので、デバイス名はsdXになっている。 # zdb -l /dev/sdh1 ------------------------------------ LABEL 0 ------------------------------------ version: 5000 name: 'zdata' ★これ state: 0 txg: 23527188 pool_guid: 15920220212014191793 hostid: 1525007054 hostname: 'hostname.example.com' top_guid: 1118325231086088749 guid: 9773797371878116701 vdev_children: 1 vdev_tree: type: 'raidz' id: 0 guid: 1118325231086088749 nparity: 1 metaslab_array: 34 metaslab_shift: 37 ashift: 12 asize: 31989740601344 is_log: 0 create_txg: 4 children[0]: type: 'disk' id: 0 guid: 3334618698730764157 path: '/dev/ada5p1' phys_path: 'id1,enc@n3061686369656d31/type@0/slot@3/elmdesc@Slot_02/p1' whole_disk: 1 DTL: 291 create_txg: 4 children[1]: type: 'disk' id: 1 guid: 4503436449772901953 path: '/dev/ada3p1' phys_path: 'id1,enc@n3061686369656d31/type@0/slot@1/elmdesc@Slot_00/p1' whole_disk: 1 DTL: 290 create_txg: 4 children[2]: type: 'disk' id: 2 guid: 9773797371878116701 path: '/dev/ada2p1' phys_path: 'id1,enc@n3061686369656d30/type@0/slot@3/elmdesc@Slot_02/p1' whole_disk: 1 DTL: 289 create_txg: 4 children[3]: type: 'disk' id: 3 guid: 1033141966906037929 path: '/dev/ada4p1' phys_path: 'id1,enc@n3061686369656d31/type@0/slot@2/elmdesc@Slot_01/p1' whole_disk: 1 DTL: 288 create_txg: 4 features_for_read: com.delphix:hole_birth com.delphix:embedded_data labels = 0 1 2 3 注目すべきはnameの項目で、プール名がそのまんま入っている。さらに他の項目からプールの詳細がわかる。 name: プール名 hostname プールを作成したホスト名 vdev_tree: type プールの構成方法 vdev_tree: children vdevを構成するストレージの数 vdev_tree: children: path プール構成ストレージとして最後に認識された時のデバイスパス これらを読み解くと、/dev/sdh1は「FreeBSDマシン4)hostname.example.comで作られた4台構成のRAID-Zプールzdata」の構成デバイスだった、ということが推測できる。 4) pathのadaXから推定 start.txt 最終更新: 2022-07-27 15:26by Decomo