可以参考以下模板文件:

1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=Docker compose on boot
Wants=network-online.target
After=network-online.target
RequiresMountsFor=/run/containers/storage

[Service]
WorkingDirectory=/opt/project
ExecStart=docker-compose up -d

[Install]
WantedBy=multi-user.target

如果有其它需要mount的文件夹, 例如容器依赖CIFS, 则将路径追加到RequiresMountsFor中即可, 空格分隔.

把文件链接或复制到 /etc/systemd/system/ 目录下, 使用 systemctl daemon-reload, systemctl enable ... 即可启动服务.

如果没有安装podman-docker可能没法直接使用docker-compose命令, 此时只需要加上对应的socket参数即可, 例如(对于root): docker-compose -H unix:///run/podman/podman.sock, 或将其设为DOCKER_HOST环境变量.

Mod: Minecraft Transit Railway

Issue: Refresh Path button not working on multiplayer server #352

非常好的一个mod,但是用的时候刷新路径按键一直不正常, 看了mod的源码也没看出来什么问题. 尝试打开客户端日志, 有一个错误消息非常让人在意:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
[15:37:50] [Render thread/ERROR]: Error executing task on Client
java.lang.IndexOutOfBoundsException: readerIndex(23) + length(1) exceeds writerIndex(23): PooledUnsafeDirectByteBuf(ridx: 23, widx: 23, cap: 23)
at io.netty.buffer.AbstractByteBuf.checkReadableBytes0(AbstractByteBuf.java:1442) ~[netty-all-4.1.68.Final.jar%2326!/:4.1.68.Final]
at io.netty.buffer.AbstractByteBuf.readByte(AbstractByteBuf.java:730) ~[netty-all-4.1.68.Final.jar%2326!/:4.1.68.Final]
at net.minecraft.network.FriendlyByteBuf.readByte(FriendlyByteBuf.java:909) ~[client-1.18.2-20220404.173914-srg.jar%2380!/:?]
at net.minecraft.network.FriendlyByteBuf.m_130242_(FriendlyByteBuf.java:344) ~[client-1.18.2-20220404.173914-srg.jar%2380!/:?]
at net.minecraft.network.FriendlyByteBuf.m_130136_(FriendlyByteBuf.java:486) ~[client-1.18.2-20220404.173914-srg.jar%2380!/:?]
at net.minecraft.network.FriendlyByteBuf.m_130277_(FriendlyByteBuf.java:482) ~[client-1.18.2-20220404.173914-srg.jar%2380!/:?]
at mtr.packet.PacketTrainDataGuiClient.createRailS2C(PacketTrainDataGuiClient.java:120) ~[MTR-forge-1.18.2-3.0.0.jar%2372!/:?]
at mtr.MTRClient.lambda$init$22(MTRClient.java:288) ~[MTR-forge-1.18.2-3.0.0.jar%2372!/:?]
at mtr.forge.RegistryClientImpl.lambda$registerNetworkReceiver$0(RegistryClientImpl.java:47) ~[MTR-forge-1.18.2-3.0.0.jar%2372!/:?]
at dev.architectury.networking.forge.NetworkManagerImpl.lambda$createPacketHandler$6(NetworkManagerImpl.java:150) ~[architectury-4.3.53.jar%2354!/:?]
at dev.architectury.networking.transformers.PacketTransformer$1.inbound(PacketTransformer.java:47) ~[architectury-4.3.53.jar%2354!/:?]
at dev.architectury.networking.forge.NetworkManagerImpl.lambda$createPacketHandler$7(NetworkManagerImpl.java:145) ~[architectury-4.3.53.jar%2354!/:?]
at net.minecraftforge.eventbus.EventBus.doCastFilter(EventBus.java:247) ~[eventbus-5.0.3.jar%232!/:?]
at net.minecraftforge.eventbus.EventBus.lambda$addListener$11(EventBus.java:239) ~[eventbus-5.0.3.jar%232!/:?]
at net.minecraftforge.eventbus.EventBus.post(EventBus.java:302) ~[eventbus-5.0.3.jar%232!/:?]
at net.minecraftforge.eventbus.EventBus.post(EventBus.java:283) ~[eventbus-5.0.3.jar%232!/:?]
at net.minecraftforge.network.NetworkInstance.dispatch(NetworkInstance.java:68) ~[forge-1.18.2-40.1.0-universal.jar%2384!/:?]
at net.minecraftforge.network.NetworkHooks.lambda$onCustomPayload$1(NetworkHooks.java:75) ~[forge-1.18.2-40.1.0-universal.jar%2384!/:?]
at java.util.Optional.map(Optional.java:260) ~[?:?]
at net.minecraftforge.network.NetworkHooks.onCustomPayload(NetworkHooks.java:75) ~[forge-1.18.2-40.1.0-universal.jar%2384!/:?]
at net.minecraft.client.multiplayer.ClientPacketListener.m_7413_(ClientPacketListener.java:1824) ~[client-1.18.2-20220404.173914-srg.jar%2380!/:?]
at net.minecraft.network.protocol.game.ClientboundCustomPayloadPacket.m_5797_(ClientboundCustomPayloadPacket.java:57) ~[client-1.18.2-20220404.173914-srg.jar%2380!/:?]
at net.minecraft.network.protocol.game.ClientboundCustomPayloadPacket.m_5797_(ClientboundCustomPayloadPacket.java:7) ~[client-1.18.2-20220404.173914-srg.jar%2380!/:?]
at net.minecraft.network.protocol.PacketUtils.m_131356_(PacketUtils.java:22) ~[client-1.18.2-20220404.173914-srg.jar%2380!/:?]
at net.minecraft.util.thread.BlockableEventLoop.m_6367_(BlockableEventLoop.java:157) ~[client-1.18.2-20220404.173914-srg.jar%2380!/:?]
at net.minecraft.util.thread.ReentrantBlockableEventLoop.m_6367_(ReentrantBlockableEventLoop.java:23) ~[client-1.18.2-20220404.173914-srg.jar%2380!/:?]
at net.minecraft.util.thread.BlockableEventLoop.m_7245_(BlockableEventLoop.java:131) ~[client-1.18.2-20220404.173914-srg.jar%2380!/:?]
at net.minecraft.util.thread.BlockableEventLoop.m_18699_(BlockableEventLoop.java:116) ~[client-1.18.2-20220404.173914-srg.jar%2380!/:?]
at net.minecraft.client.Minecraft.m_91383_(Minecraft.java:1013) ~[client-1.18.2-20220404.173914-srg.jar%2380!/:?]
at net.minecraft.client.Minecraft.m_91374_(Minecraft.java:663) ~[client-1.18.2-20220404.173914-srg.jar%2380!/:?]
at net.minecraft.client.main.Main.main(Main.java:205) ~[client-1.18.2-20220404.173914-srg.jar%2380!/:?]
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?]
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
at java.lang.reflect.Method.invoke(Method.java:568) ~[?:?]
at net.minecraftforge.fml.loading.targets.CommonClientLaunchHandler.lambda$launchService$0(CommonClientLaunchHandler.java:31) ~[fmlloader-1.18.2-40.1.0.jar%2316!/:?]
at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:37) [modlauncher-9.1.3.jar%235!/:?]
at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:53) [modlauncher-9.1.3.jar%235!/:?]
at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:71) [modlauncher-9.1.3.jar%235!/:?]
at cpw.mods.modlauncher.Launcher.run(Launcher.java:106) [modlauncher-9.1.3.jar%235!/:?]
at cpw.mods.modlauncher.Launcher.main(Launcher.java:77) [modlauncher-9.1.3.jar%235!/:?]
at cpw.mods.modlauncher.BootstrapLaunchConsumer.accept(BootstrapLaunchConsumer.java:26) [modlauncher-9.1.3.jar%235!/:?]
at cpw.mods.modlauncher.BootstrapLaunchConsumer.accept(BootstrapLaunchConsumer.java:23) [modlauncher-9.1.3.jar%235!/:?]
at cpw.mods.bootstraplauncher.BootstrapLauncher.main(BootstrapLauncher.java:149) [bootstraplauncher-1.0.0.jar:?]

从这个错误消息入手, 找到一个非常简短且冷门的帖子: I cannot connect to a modded server 帖子里面提到删除玩家对应的dat文件. 尝试停服删除之后重启, 一切正常. 推测是之前停电导致的服务器未正确关闭引起的玩家数据异常.

Windows访问SMB共享的时候 一个服务器下多个用户的时候会提示 你没有权限访问xxx, 请与网络管理员联系请求访问权限 但又找不到地方可以重新登录SMB, 此时需要使用命令行(震怒):

net use 查看目前所有的链接

net use <路径> /delete 找到对应服务器的已建立的链接, 并删除 名为$IPC的链接也要删除.

net use * /delete 或者使用删除全部的SMB链接.

net use \\<服务器IP>\<Share> /USER:<用户名> <密码> /PERSISTENT:YES 输入新的用户名和密码 注意, 如果删除链接之后直接在Explorer里双击打开的话还是会使用原来的账号密码.

net use <盘符>: \\<服务器IP>\<Share> /USER:<用户名> <密码> /PERSISTENT:YES 添加一个网络映射 执行这个命令不要使用管理员权限, 否则映射出来的磁盘不能在普通用户的文件管理器里看到.

如果访问同一个服务器用了多个账户, 则net use命令会遇到报错:

1
2
3
发生系统错误 1219。

不允许一个用户使用一个以上用户名与服务器或共享资源的多重连接。中断与此服务器或共享资源的所有连接,然后再试一次。

此时, 先尝试按照上述命令清除已经建立的链接. 如果还不行, 可以看下Windows凭据管理器里是否有预设账号密码, 如果有则删除. 如果以上都没问题的话可以尝试重启 Workstation 服务 (任务管理器里叫 LanmanWorkstation) 使用服务单元管理器的 重新启动 或者下面的命令(需要管理员权限):

1
2
net stop workstation
net start workstation

Workstation服务描述: 使用 SMB 协议创建并维护客户端网络与远程服务器之间的连接。如果此服务已停止,这些连接将无法使用。如果此服务已禁用,任何明确依赖它的服务将无法启动。

规避同一服务器只能使用一个账号的限制: Windows对此的限制是服务器名维度, 所以可以尝试使用多个指向相同IP的域名使用不同账户来访问 (例如hosts文件, 自定义dns等) 以达到实际上多账户访问同一服务器的效果.

参考

Accessing a Windows share with a different username

“net use” does not create drives in Explorer on Windows 10

Net Use Error 1219 - I just want to mount a network share

How can I clear the “authentication cache” in Windows 7 to a password protected samba share?

How to Clear Saved Credentials for Network Share or Remote Desktop Connection

Samba+Windows: Allow multiple connections by different users?

深入NAS协议系列: 召唤SMB2 OpLock/Lease

迅雷下载提示文件路径超出系统限制, 可以通过解除Windows默认的路径长度限制来解决. 使用Powershell管理员执行以下命令, 重启后生效.

1
New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" ` -Name "LongPathsEnabled" -Value 1 -PropertyType DWORD -Force

参考

Maximum Path Length Limitation

谢谢你,田所浩二

Vitas!别一天老喊那海豚音谁不会啊!

凤凰传奇!你们根本没在自由飞翔,你躲哪去了?

米津玄师!别一天老哼那Loser,谁不会啊!

稲葉曇『ラグトレイン』Vo. 歌愛ユキ / 稻叶昙- Lagtrain (Vo. 歌爱雪)

【64作品比较】延迟列车

Rob Gasser - Hyperspeed 2016年关注的…

【2017歌曲串烧】 Best Remixes Of Popular Songs 2017 Melbourne Bounce Mix Youtube原版被吞了…

【作業用BGM】人生で1度は聞いておくべきNCS(EDM)メドレー!![BEST of NCS Mix]

a song which can’t be sung - heiakim

Top 30 NoCopyRightSounds songs Best of NCS 2H NCS nonstop compilation : The Best of all time

DEAF KEV - Invincible [NCS Release]

往期优秀作品推荐

2022年3月

年轻人的第一台100T NAS

主板: B450 Aorus M

CPU: Intel(R) Core(TM) i5-10600KF CPU @ 4.10GHz

内存: DDR4 2666Mhz 16G*4

硬盘: 西数 HC550 WUH721816ALE6L4 16TB*10

机箱: 追风者 PHANTEKS PK620PC

系统: TrueNAS-SCALE-22.02.0.1

HBA卡: 惠普SAS 9205-8i 已刷IT模式 自带两个MiniSAS口 需要MiniSAS SFF8087转SATA一拖四线

之前买错了线, 买成SFF-8643了 看知乎说是兼容的结果对比发现插不进去 线下买被坑了300块…

HBA卡没驱动的情况下从主板里可能没法直接看到硬盘, 装TrueNAS的时候会自动扫HBA卡


配置了一个存储池, 内含两个vdev, 每个vdev五个磁盘, 组成raid-z2

如果10个盘放在一起的话推荐的是raid-z3. 允许最多丢失3个盘. raid-z2的话就是每个vdev最多允许丢失2个盘. 因为组了raid-z2的缘故所以最终容量大约只有85T.

最好新建一个dataset home 用来给各个用户当Home, 配置分享前需要创建用户: Credentials -> Local Users, 点Add. 填写用户信息. Home Directory选择刚刚创建的dataset. 如果不需要远程登录的话可以配置Shell为nologin. 启用Samba Authentication以便稍后用于文件分享.

配置SMB分享的时候需要注意高级选项里Path Suffix这一项应该留空, 有一些默认配置会设为%U 即为各个用户在这个dataset下新建一个同名的文件夹 以实现不同用户分享同一个dataset的效果.

Proxmox创建CIFS存储的时候可能有问题, 比如明明能连上却显示Connection timeout. 可以尝试命令行创建:

扫描CIFS服务器下对应的文件夹(Share) pvesm scan cifs <服务器IP> --username <SMB用户名> --password 会提示输入密码

添加CIFS存储: pvesm add cifs <存储名称> --server <服务器IP> --share <Share名称> --username <SMB用户名> --password 会提示输入密码

如果还是一直卡在 trying to acquire cfs lock 'file-storage_cfg' ... 上, 需要重启PVE服务器…

配置NFS之后 Proxmox连接一直失败, 报错Permission denied, 没找到原因和解决方案.

关于S.M.A.R.T测试, 这个配置跑Long Test的话可能需要40个小时才行. 目前采用的是每天一次short, 每月一次long. 网上有一些推荐的配置是每4个小时一次short, 每两周一次long.

配置告警: 入口在右上角Alerts图标, 点击后在弹出的侧边栏中选择设置: Email 以配置SMTP或Gmail服务. 配置后选择 Alerts -> Settings -> Alert Services, 在新页面中选择E-Mail -> Edit -> SEND TEST ALERT 可以发送测试告警邮件

参考

RAIDZ Levels 介绍ZFS Raid-Z不同等级

Truenas Scale基础入门设置

TrueNAS服务-创建NFS共享

Issue with incorrect cfs lock

Ghost username dataset being created by TN12, user home directory already exists.

CIFS Issue - error with cfs lock ‘file-storage_cfg’ (working now but shows question mark)

Recommended SMART tests and scrub settings?

S.M.A.R.T. Tests | TrueNAS Scale

Do S.M.A.R.T. tests wear out the hard disk?

以下没什么太大的用, 仅供参考

Help! Proxmox FreeNAS NFS permission denied

TrueNAS NFS for Proxmox

Removing GMail OAuth config doesn’t work

发现了神器systemd-run, 可以用来创建临时的服务和定时任务

目前在 wg-ops 中使用此命令创建定时任务进行DNS查询, 命令格式如下:

systemd-run -u <name> --collect --timer-property AccuracySec=10 --on-calendar *:*:0/30 <cmd>

-u 用来指定服务名称. name.timername.service会被创建出来. 如果不指定这个那么systemd-run会自动生成一个ID. 可以从命令执行的输出中拿到ID.

--collect 无论任务是否成功都销毁临时服务与定时器.

--timer-property 用来指定定时任务的属性. 其中AccuracySec=用于指示systemd多久检查一次任务触发时间.

--on-calendar 用来指定触发周期. *:*:0/30 表示每分钟0秒和30秒分别触发一次. 这个表达形式和cron有点不一样, 但是看起来稍微清晰一些. 奇怪的是没找到每隔30秒运行一次的选项. 尝试使用了OnActiveSec=也不管用, timer执行一次之后就消失了.

因为是临时任务, 所以如果执行完成会被systemd回收. 使用systemctl stop停止时也会被systemd回收. 如果不加--collect, 若服务执行失败会保留. 这种情况下可以用systemctl reset-failed手动改掉失败状态, 就会被systemd回收了.

参考

systemd-run — Run programs in transient scope units, service units, or path-, socket-, or timer-triggered service units

systemd.timer — Timer unit configuration

systemd/Timers - ArchWiki

What Settings Are Currently Available For Transient Units?

電の花 TØm最新力作

宮本浩次-冬の花 (Eurobeat Remix),But 120bpm

宮本浩次-冬の花

Self Titled - S3RL

Put Your Phones Up - S3RL feat Minto

Well, That Was Awkward - S3RL

wowaka 『裏表ラバーズ』feat. 初音ミク / wowaka - Ura-Omote Lovers (Official Video) ft. Hatsune Miku

Diplo - Set It Off ft. Lazerdisk Party Sex (TheFatRat Remix)

Xomu - Last Dance

Xomu - Lanterns

Xomu - Walpurgis Night

All Of Xomu’s Music 2021

Joshiraku Ending Theme | Nippon Egao Hyakkei | Lyrics 呦 吼 吼!【4K-女子落语】OP+ED,动漫音乐

『 入 站 必 刷 』 卡祖笛

【东方虹龙洞BGM】大吉猫咪【豪德寺三花角色曲】

往期优秀作品推荐

2022年2月

Dr. Dre - Still D.R.E. (Official Music Video) ft. Snoop Dogg / 这个转场让人猝不及防完整版 / 高中生校园现场钢琴演奏Dr.Dre,全场起立狂欢

Tiësto & KSHMR feat. Vassy - Secrets (Official Music Video)

100 Songs You´ve Heard And Don´t Know The Name

Childish Gambino - Redbone (Official Audio) 经典前奏

Crystal Dolphin 经典欢乐BGM

Roundabout (2008 Remaster) JoJo经典 “To be continued”

YOASOBI「怪物」Official Music Video (YOASOBI - Monster)

Into The Night

Attack on Titan S2 OST - YOUSEEBIGGIRL/T:T (Reiner and Berthold transformation theme) / 这个“叛变神曲”我能再听亿遍!!! 进击的巨人叛变神曲

【HD】 六兆年と一夜物語 【IAオリジナル曲・PV付】- KEMU VOXX

WORLD ORDER “SINGULARITY”

WORLD ORDER ”CENSORSHIP”

WORLD ORDER “HAVE A NICE DAY “ Shibuya Ver.

Nostalgic - S3RL feat Harri Rush

Jaded AF - S3RL feat ChiyoKo & MC Riddle

It’s This Again - S3RL ft Jamie-Rose

Friendzoned - S3RL feat Mixie Moon

Where Did You Go - S3RL feat Charlotte

电棍:唢呐破坏者

电棍:♿♿反射

Namewee 黃明志 Ft. Dwagie 大支【Ghost Island 鬼島】@亞洲通話 2019 Calling Asia

Non-Stop Version【Thai Cha Cha/泰國恰恰/เพลงไทยชะช่า】Namewee 黃明志Ft. Bie The Ska @亞洲通吃 2017 All Eat Asia

Namewee 黃明志 Ft. Anthony Perry 黃秋生【China Reggaeton 中國痛】@亞洲通才 2020 Asian Polymath

进巨分析

非常透彻, 十分建议观看

大盘点之全知全能的艾伦究竟进行了什么操作(妹篇)

大盘点之马莱篇的艾伦进行了什么操作(姐篇)

往期优秀作品推荐

2022年1月