Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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