Skip to content

Instantly share code, notes, and snippets.

@polaris-xoxo
Created May 18, 2025 10:19
Show Gist options
  • Select an option

  • Save polaris-xoxo/e7f0cf8b153c2d4c0e280e8583cfa615 to your computer and use it in GitHub Desktop.

Select an option

Save polaris-xoxo/e7f0cf8b153c2d4c0e280e8583cfa615 to your computer and use it in GitHub Desktop.
PS2 Modchip HDD Formatter
#!/bin/bash
clear
C_RED_BLD='\033[1;31m' C_YLW_BLD='\033[1;93m' C_GRN_BLD='\033[1;32m' C_BLU_BLD='\033[1;94m' C_CYN_BLD='\033[1;36m' C_WHT_BLD='\033[1;37m' C_GRY_BLD='\033[1;30m'
C_RED='\033[0;91m' C_YLW='\033[0;93m' C_GRN='\033[0;92m' C_BLU='\033[0;94m' C_CYN='\033[0;36m' C_WHT='\033[0;37m' C_GRY='\033[0;30m'
C_BLANK='\033[0m' C_FLASH='\033[1;5m'
TOOLKIT_PATH="${HOME}/ps2"
function function_apa_checksum_fix() {
sudo dd if=${DEVICE} of=/tmp/apa_header_full.bin bs=512 count=2
"${TOOLKIT_PATH}/apps/PS2 APA Header Checksum Fixer.elf" /tmp/apa_header_full.bin | sed -n 8p | awk '{print $6}' | xxd -r -p > /tmp/apa_header_checksum.bin
sudo dd if=/tmp/apa_header_checksum.bin of=${DEVICE} conv=notrunc
}
function function_apajail_magic_number() {
echo ${MAGIC_NUMBER} | xxd -r -p > /tmp/apajail_magic_number.bin
sudo dd if=/tmp/apajail_magic_number.bin of=${DEVICE} bs=8 count=1 seek=28 conv=notrunc
}
function function_clear_temp() {
sudo rm /tmp/apa_header_address.bin &> /dev/null
sudo rm /tmp/apa_header_boot.bin &> /dev/null
sudo rm /tmp/apa_header_checksum.bin &> /dev/null
sudo rm /tmp/apa_header_full.bin &> /dev/null
sudo rm /tmp/apa_journal.bin &> /dev/null
sudo rm /tmp/apa_header_probe.bin &> /dev/null
sudo rm /tmp/apa_header_size.bin &> /dev/null
sudo rm /tmp/apajail_magic_number.bin &> /dev/null
sudo rm /tmp/apa_index.xz &> /dev/null
sudo rm /tmp/gpt_2nd.xz &> /dev/null
sudo rm /tmp/conf_hdd.cfg &> /dev/null
}
function function_continue() {
echo
read -p "Press any key to continue. "
echo
}
function function_device() {
echo -e "Choose your ${C_YLW_BLD}internal PS2 disk${C_BLANK} (eg: ${C_YLW}/dev/sdx${C_BLANK}) from device list below:"
echo
lsblk -p -o MODEL,NAME,SIZE,LABEL,MOUNTPOINT
echo
read DEVICE
echo -e "Ok, so yo have chosen: \"${C_YLW_BLD}${DEVICE}${C_BLANK}\""
}
function function_disk_size_check() {
LBA_MAX=$(sudo blockdev --getsize ${DEVICE})
if [ ${LBA_MAX} -gt 4294967296 ]; then
echo -e "${C_RED_BLD}ERROR:${C_RED} Disk size exceeding 2TiB. Formatting aborted.${C_BLANK}"
function_exit
fi
}
function function_exit() {
echo
read -p "Press any key to exit script. "
exit
}
function function_make_ps2_dirs() {
if [ ! -d "/tmp/ps2_dirs" ]; then
mkdir /tmp/ps2_dirs
fi
if [ "$(echo ${DEVICE} | grep -o /dev/loop)" = "/dev/loop" ]; then
sudo mount ${DEVICE}p${PARTITION_NUMBER} /tmp/ps2_dirs
else sudo mount ${DEVICE}${PARTITION_NUMBER} /tmp/ps2_dirs
fi
cd /tmp/ps2_dirs
sudo mkdir -p APPS/ # Open PS2 Loader: applications
sudo mkdir -p ART/ # Open PS2 Loader: disc covers (<GameID>_COV.png, <GameID>_ICO.png, <GameID>_SCR.png etc.)
sudo mkdir -p CFG/ # Open PS2 Loader: per game configs (<GameID>.cfg)
sudo mkdir -p CHT/ # Open PS2 Loader: cheats (<GameID>.cht)
sudo mkdir -p CD/ # Open PS2 Loader: CD disc images (*.iso, *.zso)
sudo mkdir -p DVD/ # Open PS2 Loader: DVD disc images (*.iso, *.zso)
sudo mkdir -p LNG # Open PS2 Loader: Language files
sudo mkdir -p THM/ # Open PS2 Loader: theme dirs (thm_<ThemeName>/*)
sudo mkdir -p VMC/ # Open PS2 Loader: non-ECC PS2 Memory Card images (generic or <GameID>_0.bin, <GameID>_1.bin)
sync
sudo umount -l /tmp/ps2_dirs
}
function function_warning_apajail() {
echo
echo -e "${C_RED_BLD}APA-Jail${C_RED} is a danger for normal users because once setup, it cannot be edited by"
echo -e "ordinary tools on PC and PS2. By doing so, data loss is guaranteed!${C_BLANK}"
}
function function_zeroing() {
# wiping out APA and MBR/GPT:
sudo dd if=/dev/zero of=${DEVICE} bs=128M count=1 conv=notrunc status=none
# wiping out GPT backup:
LBA_MAX=$(sudo blockdev --getsize ${DEVICE})
LBA_GPT_BUP=$(echo "$((${LBA_MAX}-2048))")
sudo dd if=/dev/zero of=${DEVICE} seek=${LBA_GPT_BUP} bs=512 count=2048 conv=notrunc status=none
# updating partition table:
sudo partprobe ${DEVICE}
echo
}
# ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
echo -e "${C_GRN_BLD}PS2 Modchip HDD Formatter by Burroughs - Based on PS2HDH by Berion"
echo -e "${C_YLW}Script for formatting internal disk using APA-J for use with modchip dev.2 boot"
echo
echo -e "${C_RED_BLD}Confirm root permissions everytime you will be asked.${C_BLANK}"
echo
# ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
# APA-Jail
echo -e "${C_YLW}This operation will ${C_YLW_BLD}mix${C_YLW} ${C_YLW_BLD}APA${C_YLW} and ${C_YLW_BLD}MBR${C_YLW} together. (APA cut on 4GiB)"
echo
echo -e "${C_WHT_BLD}Partition tables:${C_BLANK}"
echo -e " ∙ creating APA and MBR"
echo
echo -e "${C_WHT_BLD}Partitions:${C_BLANK}"
echo -e " ∙ basic PS2 partitions (cannot exceed 4GiB)"
echo -e " ∙ empty 128mb partition for dev.2 boot from APA"
echo -e " ∙ recovery partition on MBR"
echo -e " ∙ protection area + exFAT"
function_warning_apajail
function_continue
function_device
function_continue
function_disk_size_check
function_zeroing
echo -e "device ${DEVICE}\ninitialize yes\nmkpart __boot 128M PFS\nls -l\nexit" | cat | sudo "${TOOLKIT_PATH}/apps/PFS Shell.elf"
echo
# Signature injection (type A2):
MAGIC_NUMBER="4150414A2D413200"
function_apajail_magic_number
# Setting up MBR:
echo -e ",4GiB,17\n,32MiB,17\n,,07" | sudo sfdisk ${DEVICE}
sudo partprobe ${DEVICE}
if [ "$(echo ${DEVICE} | grep -o /dev/loop)" = "/dev/loop" ]; then
sudo mkfs.ext2 -L "RECOVERY" ${DEVICE}p2
sudo mkfs.exfat -c 32K -L "OPL" ${DEVICE}p3
else
sleep 4
sudo mkfs.ext2 -L "RECOVERY" ${DEVICE}2
sudo mkfs.exfat -c 32K -L "OPL" ${DEVICE}3
fi
PARTITION_NUMBER=3
function_make_ps2_dirs
# Finalising recovery:
if [ ! -d "${TOOLKIT_PATH}/storage/hdd/recovery" ]; then
mkdir ${TOOLKIT_PATH}/storage/hdd/recovery
fi
if [ "$(echo ${DEVICE} | grep -o /dev/loop)" = "/dev/loop" ]; then
sudo mount ${DEVICE}p2 ${TOOLKIT_PATH}/storage/hdd/recovery
else sudo mount ${DEVICE}2 ${TOOLKIT_PATH}/storage/hdd/recovery
fi
sudo dd if=${DEVICE} bs=128M count=1 status=progress | xz -z > /tmp/apa_index.xz
sudo cp /tmp/apa_index.xz ${TOOLKIT_PATH}/storage/hdd/recovery
LBA_MAX=$(sudo blockdev --getsize ${DEVICE})
LBA_GPT_BUP=$(echo $(($LBA_MAX-33)))
sudo dd if=${DEVICE} skip=${LBA_GPT_BUP} bs=512 count=33 status=progress | xz -z > /tmp/gpt_2nd.xz
sudo cp /tmp/gpt_2nd.xz ${TOOLKIT_PATH}/storage/hdd/recovery
sync
sudo umount -l ${TOOLKIT_PATH}/storage/hdd/recovery
rmdir ${TOOLKIT_PATH}/storage/hdd/recovery
function_apa_checksum_fix
# ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function_clear_temp
unset DEVICE
unset LBA_GPT_BUP
unset LBA_MAX
unset MAGIC_NUMBER
unset PARTITION_NUMBER
echo -e ${C_WHT_BLD}
read -p "All done. Press any key to exit. "
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment