SystemD services & "reboot" using kexec (#1)

* Add: systemd services

* add --reboot on m2_exec.sh to kexec into the running kernel

* rem reboot from m2_exec.sh
This commit is contained in:
Anderson
2026-05-04 12:59:02 -03:00
committed by GitHub
parent 8d364bdaab
commit 0a6c6aefa7
5 changed files with 120 additions and 0 deletions

View File

@@ -1,6 +1,29 @@
# ps5-linux-tools
- `ps5_control.c`: Allows turning on/off fan and boost via `/dev/icc` and `/dev/mp1`.
- `systemd/ps5fan.service`: Starts fan control at boot by running `ps5_control --fan on`.
- `systemd/ps5boost.service`: Starts boost mode at boot by running `ps5_control --boost on`.
- `install.sh`: Builds `ps5_control`, installs the systemd services, and enables fan and boost at startup.
- `m2_init.c`: Creates a fake MBR header and GPT partition that makes PS5 OS happy.
- `m2_install.sh`: Installs a Linux `.img` file by formatting the M.2 as ext4 and copying files over.
- `m2_exec.sh`: Performs kexec into Linux on your M.2 SSD.
## Systemd services
Install the binary and enable both services:
```sh
sudo ./install.sh
```
The installer places `ps5_control` at `/usr/local/sbin/ps5_control` and installs:
- `ps5fan.service`, which runs `/usr/local/sbin/ps5_control --fan on`
- `ps5boost.service`, which runs `/usr/local/sbin/ps5_control --boost on`
Disable either service if you do not want it at startup:
```sh
sudo systemctl disable --now ps5fan.service
sudo systemctl disable --now ps5boost.service
```

70
install.sh Executable file
View File

@@ -0,0 +1,70 @@
#!/usr/bin/env bash
set -euo pipefail
BINARY_NAME="ps5_control"
INSTALL_BIN="/usr/local/sbin/${BINARY_NAME}"
SYSTEMD_DIR="/etc/systemd/system"
usage() {
cat <<EOF
Usage: sudo $0
Installs:
${INSTALL_BIN}
${SYSTEMD_DIR}/ps5fan.service
${SYSTEMD_DIR}/ps5boost.service
Both services are enabled and started by default. Disable either one with:
sudo systemctl disable --now ps5fan.service
sudo systemctl disable --now ps5boost.service
EOF
}
while [[ $# -gt 0 ]]; do
case "$1" in
-h|--help)
usage
exit 0
;;
*)
echo "This installer does not accept options: $1" >&2
usage >&2
exit 1
;;
esac
shift
done
if [[ ${EUID} -ne 0 ]]; then
echo "Run as root: sudo $0" >&2
exit 1
fi
if ! command -v systemctl >/dev/null 2>&1; then
echo "systemctl not found; this installer requires systemd." >&2
exit 1
fi
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
cd "${SCRIPT_DIR}"
echo "Building ${BINARY_NAME}..."
make "${BINARY_NAME}"
echo "Installing ${INSTALL_BIN}..."
install -Dm755 "${BINARY_NAME}" "${INSTALL_BIN}"
echo "Installing systemd units..."
install -Dm644 systemd/ps5fan.service "${SYSTEMD_DIR}/ps5fan.service"
install -Dm644 systemd/ps5boost.service "${SYSTEMD_DIR}/ps5boost.service"
systemctl daemon-reload
echo "Enabling and starting ps5fan.service and ps5boost.service..."
systemctl enable --now ps5fan.service ps5boost.service
echo "Done."
echo "Disable services you do not want:"
echo " sudo systemctl disable --now ps5fan.service"
echo " sudo systemctl disable --now ps5boost.service"

View File

@@ -7,6 +7,7 @@ fi
NVME_PART="/dev/nvme0n1p1"
MNT="/tmp/kexec_mnt"
ROOT_LABEL=$(blkid -s LABEL -o value "$NVME_PART")
if [ -z "$ROOT_LABEL" ]; then

13
systemd/ps5boost.service Normal file
View File

@@ -0,0 +1,13 @@
[Unit]
Description=Enable PS5 boost mode
After=dev-mp1.device
ConditionPathExists=/dev/mp1
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/ps5_control --boost on
ExecStop=/usr/local/sbin/ps5_control --boost off
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target

13
systemd/ps5fan.service Normal file
View File

@@ -0,0 +1,13 @@
[Unit]
Description=Enable PS5 fan control
After=dev-icc.device
ConditionPathExists=/dev/icc
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/ps5_control --fan on
ExecStop=/usr/local/sbin/ps5_control --fan off
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target