#1 Le 13/03/2019, à 10:51
- diesel
[TUTORIEL] Ecrire sur une partition HFS+ (macintosh)
L'écriture sur une partition formatée en HFS+ n'est possible que si la journalisation a été désactivée sur cette partition. Sinon, celle-ci est montée en lecture seule.
Le but de ce tutoriel est de fournir un moyen de désactiver la journalisation sur une partition HFS+ sous linux.
Prérequis.
Il faut disposer de gcc sur la machine. Si celui-ci n'est pas installé, il faut taper dans un terminal
sudo apt install gcc
Puis, il faut entrer le code suivant dans un fichier (j'ai choisi le nom "disable_journal_hfsplus.c", mais n'importe quel nom convient. Il suffit d'adapter la commande en conséquence).
De plus, je me dois de préciser que ce code n'est pas de moi.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <byteswap.h>
int main(int argc, char *argv[])
{
int fd = open(argv[1], O_RDWR);
if(fd < 0) {
perror("open");
return -1;
}
unsigned char *buffer = (unsigned char *)mmap(NULL, 2048, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
if(buffer == (unsigned char*)0xffffffff) {
perror("mmap");
return -1;
}
if((buffer[1024] != 'H') && (buffer[1025] != '+')) {
fprintf(stderr, "%s: HFS+ signature not found -- aborting.\n", argv[0]);
return -1;
}
unsigned long attributes = *(unsigned long *)(&buffer[1028]);
attributes = bswap_32(attributes);
printf("attributes = 0x%8.8lx\n", attributes);
if(!(attributes & 0x00002000)) {
printf("kHFSVolumeJournaledBit not currently set in the volume attributes field.\n");
}
attributes &= 0xffffdfff;
attributes = bswap_32(attributes);
*(unsigned long *)(&buffer[1028]) = attributes;
buffer[1032] = '1';
buffer[1033] = '0';
buffer[1034] = '.';
buffer[1035] = '0';
buffer[1036] = 0;
buffer[1037] = 0;
buffer[1038] = 0;
buffer[1039] = 0;
printf("journal has been disabled.\n");
return 0;
}
Le contenu du fichier peut facilement être vérifié avec la commande
cat disable_journal_hfsplus.c
Une fois que cela est réalisé, il suffit de compiler ce programme (pour ceux pour qui c'est la première compilation, vous verrez que ce n'est pas si compliqué).
gcc disable_journal_hfsplus.c -o disable_journal_hfsplus
Et voilà, vous disposez de l'utilitaire qui va vous permettre de désactiver le journal.
Maintenant, si votre partition HFS+ est accessible en /dev/sdd2 (par exemple, le nom de "device" est à adapter selon votre configuration propre), il suffit de taper dans le terminal
sudo disable_journal_hfsplus /dev/sdd2
Et ça y est, la journalisation a été désactivée.
Maintenant, il suffit de démonter la partition
sudo umount /dev/sdd2
puis de la remonter
sudo mount /dev/sdd2
Et vous pouvez écrire dedans.
De même, si la partition contient des erreurs, il suffit :
1) d'installer le paquet hfsprogs
sudo apt install hfsprogs
2) de taper
sudo fsck.hfsplus /dev/sdd2
bien entendu toujours en adaptant le "/dev/xxx" à votre configuration personnelle.
Et la partition est réparée.
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#2 Le 26/03/2019, à 16:43
- Calyp
Re : [TUTORIEL] Ecrire sur une partition HFS+ (macintosh)
Merci.
Une idée pour faire fonctionner ça chez moi ?
Sachant que... :
moi@moi-XXXXXXX:~$ sudo apt install gcc
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances
Lecture des informations d'état... Fait
gcc est déjà la version la plus récente (4:7.3.0-3ubuntu2.1).
0 mis à jour, 0 nouvellement installés, 0 à enlever et 70 non mis à jour.
moi@moi-XXXXXXX:~$ cat disable_journal_hfsplus.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <byteswap.h>
int main(int argc, char *argv[])
{
int fd = open(argv[1], O_RDWR);
if(fd < 0) {
perror("open");
return -1;
}
unsigned char *buffer = (unsigned char *)mmap(NULL, 2048, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
if(buffer == (unsigned char*)0xffffffff) {
perror("mmap");
return -1;
}
if((buffer[1024] != 'H') && (buffer[1025] != '+')) {
fprintf(stderr, "%s: HFS+ signature not found -- aborting.\n", argv[0]);
return -1;
}
unsigned long attributes = *(unsigned long *)(&buffer[1028]);
attributes = bswap_32(attributes);
printf("attributes = 0x%8.8lx\n", attributes);
if(!(attributes & 0x00002000)) {
printf("kHFSVolumeJournaledBit not currently set in the volume attributes field.\n");
}
attributes &= 0xffffdfff;
attributes = bswap_32(attributes);
*(unsigned long *)(&buffer[1028]) = attributes;
buffer[1032] = '1';
buffer[1033] = '0';
buffer[1034] = '.';
buffer[1035] = '0';
buffer[1036] = 0;
buffer[1037] = 0;
buffer[1038] = 0;
buffer[1039] = 0;
printf("journal has been disabled.\n");
return 0;
}
moi@moi-XXXXXXX:~$ gcc disable_journal_hfsplus.c -o disable_journal_hfsplus
moi@moi-XXXXXXX:~$ sudo disable_journal_hfsplus /dev/sdb1
[sudo] Mot de passe de moi :
sudo: disable_journal_hfsplus : commande introuvable
Ubuntu 22.04
Hors ligne
#3 Le 18/05/2019, à 17:24
- bennytox_x
Re : [TUTORIEL] Ecrire sur une partition HFS+ (macintosh)
Pour lancer la commande après avoir compilé il faut taper
sudo ./disable_journal_hfsplus /dev/sdd2
Faut pas oublier le ./ c'est tout.
Cela dit même après le message de confirmation qui dit pourtant :
attributes = 0x80002800
journal has been disabled.
Bah c'est toujours journalisé pour moi !
Hors ligne