Homepage
iYoRoy DN42 Network
About
Friends
Language
简体中文
English
Search
1
Docker下中心化部署EasyTier
1,704 Views
2
Adding KernelSU Support to Android 4.9 Kernel
1,090 Views
3
Enabling EROFS Support for an Android ROM with Kernel 4.9
308 Views
4
在TrueNAS上使用Docker安装1Panel
299 Views
5
2025 Yangcheng Cup Preliminary WriteUp
295 Views
Android
Maintenance
NAS
Develop
Network
Projects
DN42
One Man ISP
CTF
Login
Search
Search Tags
Network Technology
BGP
Linux
BIRD
DN42
C&C++
Android
OSPF
MSVC
AOSP
Windows
Docker
caf/clo
TrueNAS
Interior Gateway Protocol
Services
iBGP
Clearnet
DNS
STL
Kagura iYoRoy
A total of
23
articles have been written.
A total of
11
comments have been received.
Index
Column
Android
Maintenance
NAS
Develop
Network
Projects
DN42
One Man ISP
CTF
Pages
iYoRoy DN42 Network
About
Friends
Language
简体中文
English
23
articles related to
were found.
通过Alist使TrueNAS同步到OneDrive
背景 手上有个E5订阅,本来用的方案是Docker运行driveone/onedrive:edge的方式来实现同步,但是这个方案一个是这种方式没有GUI/WebUI,一个是每次同步的时候都会占用掉CPU 25%-50%的性能。考虑到TrueNAS自带的同步方案可以向WebDAV同步,因此想到能用Alist来挂载OneDrive并转换成WebDAV供TrueNAS挂载。 折腾过程 安装Alist 为Alist创建持久化存储文件夹,并根据Alist官方文档编写Docker Compose: services: alist: environment: - PUID=3000 - PGID=950 - UMASK=022 image: xhofe/alist:latest ports: - '8088:5244' restart: always volumes: - /mnt/systemdata/DockerData/alist/etc:/opt/alist/data - /mnt/data/Storage:/mnt/data 此处我将Alist端口开放在8088,其中映射/mnt/data/Storage是为了让Alist可以管理本地的存储;映射/mnt/systemdata/DockerData/alist/etc作为存储Alist数据的文件夹。 关于如何配置Alist上的OneDrive本文不做讨论,请查询Alist官方文档。此处我将我的OneDrive挂载在/OneDrive。 完成后进入Alist后台-用户,编辑你的用户或者创建一个新用户,勾选Webdav 读取、Webdav 管理以使得该用户可以使用WebDAV。 配置TrueNAS同步 进入TrueNAS后台-Credentials-Backup Credentials,添加一个Cloud Credential,参数如下: Provider: WebDAV Name: 自定义 URL: Alist地址+/dav,例如我这里填写http://127.0.0.1:8088/dav WebDAV Service: OTHER Username和Password: Alist账号密码 Verify Credential确认没问题之后保存。 接着进入TrueNAS后台-Data Protection,添加一个Cloud Sync Task,Provider下的Credentials选择刚刚创建的Alist的WebDAV,点击下一步。此处的参数有很多种,详解如下: Direction: 分为PULL和PUSH,分别对应云端同步到本地和本地同步到云端 Transfer Mode: COPY: 复制文件,若源文件夹中先前有的文件后来删除了云端的不会被删除 MOVE: Copy后删除源文件夹相关文件 SYNC: 保持源文件夹和目标文件夹同步,源文件夹删除的文件也会在目标里删除 Directory/Files: 即本地需要同步的文件或文件夹 Folder: 即云端需要同步的文件夹 Description: 注释 Schedule: Cron定时,可以使用他预设的时段或者自己编写 比如我这里选择的是PUSH,SYNC,从/mnt/data/Storage同步到/OneDrive/TrueNAS,每天0:00执行。 编辑完成后保存,即可在你设置的时段自动将本地文件上传到OneDrive。 旧方案的项目地址: https://github.com/abraunegg/onedrive 参考文章: https://alist.nn.ci/zh/guide/install/docker.html https://alist.nn.ci/zh/guide/drivers/onedrive.html
13/03/2025
171 Views
0 Comments
0 Stars
使用家宽无公网IP+CDNfly实现建站
前言 众所周知家宽建站一般需要有公网IP,但实际上没有公网IP时的某些情况通过特殊手段也可以实现在运营商的出口IP上公开一个端口用于外部对内连接的http端口,即NAT穿透(和FRP、ngrok、花生壳这样的内网穿透不一样,这种穿透不需要服务端) 前置条件 下载NatTypeTester,检测本机的NAT类型。关于NAT类型是什么请自行查阅资料。 请确保你的网络环境满足如下条件: RFC3489下的NAT类型需为Full Cone RFC5780下的TCP的映射行为需要是EndpointIndependent 如果出现UDPBlocked请更换服务器 提升NAT类型的办法 减少路由层数,光猫拨号的尽量直接将设备接在光猫下,多层路由的尽量将设备直接接在最顶上那层路由下 开启路由器的UPnP 设置DMZ主机为服务器IP 开始 使用了Lucky作为NAT穿透的工具,通过Docker Compose部署在TrueNAS上,TrueNAS本地的9080开放了HTTP端口。 部署Web服务器不在本文论述的范围内。 安装Lucky 按照官网介绍,编写DockerCompose: services: lucky: image: gdy666/lucky network_mode: host restart: always volumes: - /mnt/systemdata/DockerData/lucky/luckyconf:/goodluck 请修改持久化存储路径为你自己的路径。 其中network_mode需要为host,当然不是host也可以部署,但是不在本文讨论范围内。 安装完成后打开http://[YourIP]:16601,默认账号666默认密码666。登录后按照要求修改安全设置。 配置穿透 打开Lucky页面左侧的STUN内网穿透,并创建穿透规则。 穿透本地端口填写一任意端口(注意不要和本机的服务冲突),目标地址和端口填写内网下的Web服务所在IP和端口。 完成上述配置后以下几种穿透方式请任选一种 {tabs} {tabs-pane label="NAT-PMP方式"} 开启路由器UPnP功能,打开STUN穿透的NAT-PMP开关,NAT-PMP网关地址填入路由器地址即可。 {/tabs-pane} {tabs-pane label="DMZ主机方式"} 在路由器DMZ主机设置将Lucky所在服务器IP设置为DMZ主机,然后关闭STUN穿透的UPnP、NAT-PMP选项。 {/tabs-pane} {tabs-pane label="非Docker安装+UPnP"} 开启路由器UPnP功能,打开STUN穿透的UPnP开关,UPnP网关IP填写路由器IP,UPnP客户端本地IP填写Lucky所在主机IP,其他留空。 {/tabs-pane} {tabs-pane label="Docker安装+UPnP"} 需要先在非Docker的环境下运行一次Lucky以获取UPnP接口地址。比如我在电脑(Windows)上安装Lucky并创建一条测试隧道,填写内容和上文非Docker安装相同,目标地址和目标端口可随意填写。开启穿透后在日志里能看到类似如下内容: UPNP===>Control URL: http://192.168.3.1:5351/ctl/IPCon (这里的URL是我的小米路由器AX3600的UPnP管理地址,不同路由器不一样) 复制这里的Control URL,再在Docker内的Lucky中将Control URL填写到UPnP控制接口地址一项中并开启穿透即可。 {/tabs-pane} {/tabs} 如果不出问题应该能看到运营商的公网出口所分配的地址和端口,若能够从外面访问或者itdog测速能绿就代表穿透成功了。 配置CDNfly的WebHook 因为这种方式获得的公网IP和端口都是动态的,因此需要类似于DDNS的服务来固定访问方式,可以使用CloudFlare Workers进行重定向,也可以使用CDN动态修改回源IP和端口。我使用的是后面那种方式。 我的CDN使用的是cdnfly管理系统,查阅cdnfly的官方文档可以找到API请求方式。 在编辑STUN内网穿透规则时下面打开Webhook并勾选仅在地址和上一次不同时触发Webhook,接口地址填入cdn网站管理API地址:https://[your-cdn-domain]/v1/sites,请求方法PUT;请求头标填入api-key和api-secret(可以在CDNfly后台看到): api-key: Your API Key api-secret: Your API Secret 请求体用json格式按照cdnfly官方文档的请求方式构建payload(请将id字段改成你的网站id,若存在多个网站则按照如下格式多复制几个并修改对应id即可): [ { "id": 114, "backend_http_port": #{port}, "backend": [ { "addr": "#{ip}", "weight": 1, "state": "up" } ] }, { "id": 514, "backend_http_port": #{port}, "backend": [ { "addr": "#{ip}", "weight": 1, "state": "up" } ] } ] 其中,#{ip}和#{port}是Lucky提供的参数,标识获取到的公网IP和端口。 保存,不出意外的话会自动将CDN对应网站的回源地址和端口改成运营商公网IP和端口。 安全问题 我本人建议使用HTTPS穿透,毕竟HTTP是明文传输,安全性还是不能保证。如果使用HTTPS,需要将上文CDN API调用的Payload中backend_http_port改成backend_https_port并在CDN处改为使用HTTPS回源。 参考文章: https://doc.cdnfly.cn/wangzhanguanli-v1-sites.html https://lucky666.cn/docs/intro https://www.bilibili.com/opus/971100369193009187 https://github.com/gdy666/lucky
09/03/2025
205 Views
0 Comments
1 Stars
在TrueNAS上使用Docker安装1Panel
背景 家里TrueNAS性能剩余,想着部署个web服务。想要装个面板减少点工作量,又考虑到虚拟机性能折损和zfs cache对内存的要求比较大以及NAS本身性能也不好,便打算使用docker部署。再加上1Panel本身也是以docker为介质,二者共同控制TrueNAS宿主机的docker daemon,约等于直接将网站部署到TrueNAS本地并且也便于管理。 分析 {alert type="warning"} 本文默认TrueNAS可以访问dockerhub并且已经配置好了docker daemon {/alert} 环境信息 Storage Pool 存在两个存储池: /mnt/data: 1 x MIRROR | 2 wide | 2.73 TiB | HDD /mnt/systemdata: 1 x DISK | 1 wide | 223.57 GiB | SSD 其中docker数据存储在2号存储池中。 Datasets 存在三个数据集: Storage: 位于data存储池,存放冷数据 DockerData: 位于systemdata存储池,存放容器的持久化存储文件 KaguraiYoRoy: 位于systemdata,用户home文件夹 安装1Panel 使用了moelin/1panel:latest镜像部署,此步骤很多部分都可以参考镜像作者写的README。项目地址: {cloud title="okxlin/docker-1panel" type="github" url="https://github.com/okxlin/docker-1panel" password=""/} 在DockerData数据集创建了一个文件夹专门用于存储1panel数据,即用作容器内/opt/1panel,位于/mnt/systemdata/DockerData/1panel。 持久卷 因为要允许1Panel管理宿主机docker,因此需要映射/var/run/docker.sock和宿主的docker文件夹 映射上文为其创建的数据文件夹 TrueNAS的docker文件夹和一般的Linux位置不一样,一般的Linux位于/var/lib/docker而TrueNAS的位于/mnt/.ix-apps/docker。 环境变量和端口映射 环境变量和镜像作者的设置相同,传入TZ=Asia/Shanghai;端口映射根据需要自行设置即可,容器内端口为10086。 Docker Compose 有了上述信息,编写docker compose就容易许多了。 完整Docker Compose文件如下: services: 1panel: dns: - 223.5.5.5 environment: - TZ=Asia/Shanghai image: moelin/1panel:latest labels: createdBy: Apps ports: - '8085:10086' restart: always volumes: - /var/run/docker.sock:/var/run/docker.sock - /mnt/.ix-apps/docker:/var/lib/docker - /mnt/systemdata/DockerData/1panel/opt:/opt/1panel - /mnt/systemdata/DockerData/1panel/root:/root - /etc/docker:/etc/docker 这里映射/root是因为我需要在容器内运行Git,而Git config存储在/root下; 设置dns是因为1Panel制作环境镜像的时候需要连网下载数据,不指定dns会报错。 安装完成后访问你设置的端口即可。 1Panel基础信息: 默认账户:1panel 默认密码:1panel_password 默认入口:entrance 故障处理 Docker镜像源 实际测试的时候发现如果不设置镜像源,即使配置了Proxy,在安装PHP环境的时候也会报错~~,并且配置了镜像源同时配置了Proxy也会安装失败,不清楚为什么~~ 打开TrueNAS的/etc/docker/daemon.json并添加registry-mirrors: { "data-root": "/mnt/.ix-apps/docker", "default-address-pools": [ { "base": "172.17.0.0/12", "size": 24 } ], "exec-opts": [ "native.cgroupdriver=cgroupfs" ], "iptables": true, "registry-mirrors": [ "https://docker.1panel.live" ], "storage-driver": "overlay2" } 保存,重启主机docker,再去1Panel里安装环境。 {alert type="warning"} 这一步的配置重启后会丢失,尽量一次性安装好环境和需要的app {/alert} 1Panel创建的容器无法启动 这个是因为在1Panel中,默认存储数据的文件夹是我们所映射出来的/opt/1panel,但是实际上创建的容器运行在TrueNAS里,访问的是TrueNAS里不存在的/opt/1panel,并且其/opt默认是只读的,因此在启动容器的时候会报错Read-only filesystem。 我自己的解决方案也很简单粗暴,在TrueNAS主机中先挂载/opt为可读写,再创建一个软链接指向1Panel的数据文件夹。 cd /opt mount -o remount,rw /opt ln -s /mnt/systemdata/DockerData/1panel/opt 1panel 然后就可以正常使用啦 有一个需要注意的点,在1Panel中安装OpenResty时记得避开使用80和443端口,这俩是TrueNAS的webui默认端口
07/03/2025
299 Views
0 Comments
0 Stars
小米845系列机器类原生调用红外摄像头进行人脸识别
背景 小米845系列的小米8、小米8屏幕指纹版有一颗前置红外摄像头用于面部识别,这样即使在无光的环境下仍可以使用面部解锁。然而如果使用LineageOS的设备树不加修改编译出来的类原生无法使用红外摄像头,只能使用普通的摄像头,而PixelExperience的设备树是可以的,故探究其原因。 原因 CameraID 首先是需要指定人脸识别模块使用红外摄像头。翻阅PixelExperience的相关设备树源码可以发现:在overlay中设置了调用CameraID为5的摄像头用作人脸识别。 https://github.com/PixelExperience-Devices/device_xiaomi_dipper/blob/fourteen/overlay/packages/apps/FaceUnlockService/app/src/main/res/values/config.xml <?xml version="1.0" encoding="utf-8"?> <resources> <integer name="override_front_cam_id">5</integer> <bool name="use_alternative_vendor_impl">true</bool> </resources> PixelExperience使用的是motorola的人脸解锁方案,而现在很多类原生使用的是AOSPA的ParanoidSense,因此上述设置的overlay并不适用。 查阅ParanoidSense源码可以看到:使用了Properties属性ro.face.sense_service.camera_id标识使用的摄像头。 https://github.com/AOSPA/android_packages_apps_ParanoidSense/blob/uvite/src/co/aospa/sense/camera/CameraUtil.kt#L32 val cameraIdProp = SystemProperties.get("ro.face.sense_service.camera_id") 因此理论上只要设置ro.face.sense_service.camera_id属性为5即可使其调用红外人脸摄像头。 vendor.camera.aux.packagelist属性 如果仅仅设置上述CameraID相关属性,那么人脸模块调用时会直接报错。翻阅Frameworks部分的代码可以得知:系统默认隐藏了除主前摄和主后摄之外的其他辅助摄像头(即AUXCamera),而红外摄像头也属于AUXCamera之一。 取LineageOS的Framework代码作为例子: https://github.com/LineageOS/android_frameworks_base/blob/lineage-21.0/core/java/android/hardware/Camera.java#L295-L301 /** * Returns the number of physical cameras available on this device. * The return value of this method might change dynamically if the device * supports external cameras and an external camera is connected or * disconnected. * * If there is a * {@link android.hardware.camera2.CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA * logical multi-camera} in the system, to maintain app backward compatibility, this method will * only expose one camera per facing for all logical camera and physical camera groups. * Use camera2 API to see all cameras. * * @return total number of accessible camera devices, or 0 if there are no * cameras or an error was encountered enumerating them. */ public static int getNumberOfCameras() { int numberOfCameras = _getNumberOfCameras(); if (!shouldExposeAuxCamera() && numberOfCameras > 2) { numberOfCameras = 2; } return numberOfCameras; } 不难看出,即使设备有大于2颗摄像头,若函数shouldExposeAuxCamera()返回为False则会强制指定摄像头数量为2,阻止程序访问CameraID>2的摄像头;再来看看这个判断函数的定义: https://github.com/LineageOS/android_frameworks_base/blob/lineage-21.0/core/java/android/hardware/Camera.java#L264-L278 /** * @hide */ public static boolean shouldExposeAuxCamera() { /** * Force to expose only two cameras * if the package name does not falls in this bucket */ String packageName = ActivityThread.currentOpPackageName(); if (packageName == null) return true; List<String> packageList = Arrays.asList( SystemProperties.get("vendor.camera.aux.packagelist", packageName).split(",")); List<String> packageExcludelist = Arrays.asList( SystemProperties.get("vendor.camera.aux.packageexcludelist", "").split(",")); return packageList.contains(packageName) && !packageExcludelist.contains(packageName); } 可以看出,假如包名在属性vendor.camera.aux.packagelist中并且不在vendor.camera.aux.packageexcludelist中就会返回为True,否则False。 那么解决方案就很明了了:将ParanoidSense的包名加到vendor.camera.aux.packagelist属性中即可让其能够调用到红外摄像头。 解决 将ParanoidSense的包名co.aospa.sense加到vendor.camera.aux.packagelist中: https://github.com/YoriInstitute/crDroidAndroid_device_xiaomi_sdm845-common/commit/28fe5bc41d49b31b4acb840bf167b70d70a40c61 设置ro.face.sense_service.camera_id属性以指定摄像头: https://github.com/YoriInstitute/crDroidAndroid_device_xiaomi_equuleus/commit/67518f130650e4592b5f4c7210248072058d48cc https://github.com/YoriInstitute/AOSPA_device_xiaomi_equuleus/blob/topaz/device.mk#L397-L399 在crDroid魔改的ParanoidSense中,因指定了其位于system_ext(https://gitlab.com/crdroidandroid/android_packages_apps_FaceUnlock/-/commit/545688260eb32ba19f348e84e3cae89ba29f20d1),故将这个属性加到system_ext的prop文件中。
06/03/2025
136 Views
0 Comments
1 Stars
简述对AOSP设备树中的一些文件和概念的理解
设备树所共有的内容大致分为以下几类: Android.bp 各种Makefile,后缀.mk prop文件,后缀.prop overlay,放在overlay文件夹中 sepolicy,即SELinux规则,放在sepolicy文件夹中 manifest.xml extract-files.py、setup-makefiles.py和proprietary-files.txt .dependencies结尾的依赖文件 其他各种配置
03/02/2025
214 Views
0 Comments
0 Stars
1
...
3
4
5