ThaiTux.info - ntfs https://thaitux.info/taxonomy/term/75 bash: สคริปต์แก้ Boot record ของ NTFS https://thaitux.info/node/754 <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><h3>update 2556-12-03</h3> <p>ลองใช้สคริปต์กับพาร์ติชั่นที่ขนาดไม่เท่ากันแล้วปรากฎว่าใช้ไม่ได้ เพราะ NTFS เก็บข้อมูลหลายอย่างมากกว่าแค่จุดเริ่มต้นและขนาด (ดูที่ <a href="http://www.ntfs.com/ntfs-partition-boot-sector.htm">NTFS Partition Boot Sector</a>)</p> <p>วิธีที่ได้ผลกว่าคือ ฟอร์แมตไดร์ฟไว้ก่อน -> เก็บ boot sector ไว้ 72 ไบต์ -> ทำ ntfsclone -> เอา boot recort ที่เก็บไว้มาเขียนทับ</p> <p>ตัวอย่างเช่น จะคัดลอก ไดร์ฟ /dev/sda1 ไปยัง /dev/sdb1 ขั้นตอนจะเป็นดังนี้</p> <pre>$ <strong>sudo mkfs.ntfs -f /dev/sdb1</strong> $ <strong>sudo dd if=/dev/sdb1 of=sdb1.img bs=72 count=1</strong> $ <strong>sudo ntfsclone -O /dev/sdb1 /dev/sda1</strong> $ <strong>sudo dd if=sdb1.img of=/dev/sdb1</strong></pre><hr /> <p>*** สคริปต์ด้านล่างนี้ ล้าสมัยแล้ว ***</p> <p>แก้ปัญหาเวลาใช้ <a href="http://en.wikipedia.org/wiki/Ntfsprogs">ntfsclone</a> ในการ restore พาร์ติชั่น NTFS มาลงในฮาร์ดดิสก์ลูกใหม่ ซึ่งจุดเริ่มต้นและขนาดอาจไม่เท่าของเดิม</p> <p>วิธีการคือใช้ข้อมูลจากตาราง Master Boot Record ปัจจุบัน มาเขียนทับ boot record ของพาร์ติชั่น NTFS ที่ต้องการ โดยใช้เชลล์สคริปต์</p> <pre>$ <strong>vi ntfs_fix_boot_sector.sh</strong></pre><!--break--><pre> #!/bin/bash function usage() { cat &lt;&lt;EOF Fix NTFS boot record: Usage: $0 DEVICE Example: $0 /dev/sda1 EOF exit 1 } if [ ! "$1" ]; then usage fi PART=$1 if [ ! -b "$PART" ]; then echo -e "$PART not found. Exit.\n" usage fi BSF="`echo $PART | tr '/' '_'`.img" BSFB=${BSF}.bak BSFD="${BSF}_`date +%F`.bak" function reverse_byte () { #reverse_byte HEXSTR local S=$1 #HEXSTR local B local C while [ "$S" ]; do B=${S:(-2)} S=${S:0:-2} C="${C}\\x${B}" done echo $C } function replace_byte () { #replace_byte OFFSET LENGTH NUMBER local O=$1 #OFFSET local L=$2 #LENGTH local N=$3 #NUMBER let NL=${L}*2 XN=`printf "%0${NL}x" $N` RXN=`reverse_byte $XN` #echo "printf $RXN | dd of=$BSF bs=1 seek=$O count=$L conv=notrunc" printf $RXN | sudo dd of=$BSF bs=1 seek=$O count=$L conv=notrunc &gt; /dev/null 2&gt;&amp;1 } sudo dd if=$PART of=$BSF bs=512 count=1 &gt; /dev/null 2&gt;&amp;1 TMP="/tmp/$0_${RANDOM}.txt" HDD=$PART while [ "`echo ${HDD:(-1)} | tr '0123456789' ' '`" == " " ]; do HDD=${HDD:0:-1} done sudo fdisk -l $HDD &gt; $TMP if ! cat $TMP | grep $PART | grep NTFS &gt; /dev/null 2&gt;&amp;1; then echo -e "$PART is not NTFS partition. Exit.\n" sudo rm $TMP sudo rm $BSF usage fi if [ ! -f "$BSFB" ]; then cp $BSF $BSFB else cp $BSF $BSFD fi echo "Fixing $PART ..." HEADS=`cat $TMP | grep 'sectors/track' | cut -d, -f1 | cut -d\ -f1` SECTORS=`cat $TMP | grep 'sectors/track' | cut -d, -f2 | cut -d\ -f2` START=`cat $TMP | grep "${PART} " | awk -F' ' '{ print $2 }'` END=`cat $TMP | grep "${PART} " | awk -F' ' '{ print $4 }'` if [ "$START" == "*" ]; then START=`cat $TMP | grep "${PART} " | awk -F' ' '{ print $3 }'` END=`cat $TMP | grep "${PART} " | awk -F' ' '{ print $4 }'` fi let LENGTH=$END-$START OFFSET_HEADS=26 OFFSET_SECTORS=24 OFFSET_START=28 OFFSET_LENGTH=40 LEN_HEADS=1 LEN_SECTORS=1 LEN_START=4 LEN_LENGTH=4 for i in HEADS SECTORS START LENGTH; do A="OFFSET_${i}" B="LEN_${i}" replace_byte ${!A} ${!B} ${!i} done echo "Fix with heads=$HEADS, sectors/track=$SECTORS, start=$START, length=$LENGTH" sudo dd if=$BSF of=$PART &gt; /dev/null 2&gt;&amp;1 sudo rm $TMP cat &lt;&lt;EOF Command used: sudo dd if=$BSF of=$PART Revert with command: sudo dd if=$BSFB of=$PART EOF </pre><p> ตัวอย่าง สมมุติว่าพาร์ติชั่นที่ต้องการเป็น /dev/sda1 คำสั่งคือ</p> <pre>$ <strong>ntfs_fix_boot_record.sh /dev/sda1</strong></pre><p> ได้ผลลัพธ์คือ</p> <pre> Fixing /dev/sda1 ... Fix with heads=255, sectors/track=63, start=2048, length=62914559 Command used: sudo dd if=_dev_sda1.img of=/dev/sda1 Revert with command: sudo dd if=_dev_sda1.img.bak of=/dev/sda1 </pre><h3>ที่มา:</h3> <ul> <li><a href="http://www.2pi.info/software/copying-windows-new-hard-drive.html">Copying Windows to a New Hard Drive Using Linux</a></li> </ul> </div></div></div><div class="field field-name-taxonomy-vocabulary-1 field-type-taxonomy-term-reference field-label-above"><div class="field-label">Topic:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/taxonomy/term/3">debian</a></div><div class="field-item odd"><a href="/taxonomy/term/75">ntfs</a></div><div class="field-item even"><a href="/taxonomy/term/96">bash</a></div></div></div> Tue, 26 Nov 2013 02:42:12 +0000 wd 754 at https://thaitux.info https://thaitux.info/node/754#comments ubuntu: อ่านเขียน ntfs https://thaitux.info/node/61 <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p>ทดลองเมานต์แบบทั้งอ่านและเขียนบนอูบุนตู Edgy</p> <p>เอามาจาก <a href="http://everythingelse.wordpress.com/2006/07/19/89/">HOWTO : Install NTFS-3G On Ubuntu (Enables NTFS Read/Write Support)</a></p> <p>เอาแพคเกจที่ต้องการ<br /> <code>$ sudo apt-get install ntfs-3g</code></p> <p>ต้องโหลดโมดูล fuse ในเคอร์เนล<br /> <code>$ sudo modprobe fuse</code></p> <p>เริ่มเมาต์ได้แล้ว สมมุติว่าพาร์ติชั่น ntfs อยู่ที่ /dev/hda2<br /> และเราต้องการให้ไปเมานต์ที่ /media/ntfs<br /> <code>$ sudo mkdir -p /media/ntfs<br /> $ sudo mount -t ntfs-3g /dev/hda2 /media/ntfs</code></p> <p><i>( <u>หมายเหตุ</u><br /> ถ้าเป็นอิมเมจไฟล์ของ qemu ก็สามารถเมานต์ได้เหมือนกัน<br /> สมมุติว่าไฟล์ชื่อ winxp.img สามารถเมานต์ด้วยคำสั่ง<br /> <code>$ sudo mount -t ntfs-3g -o loop,offset=32256 winxp.img /media/ntfs</code><br /> จบ )</i></p> <p>เสร็จแล้ว อ่านเขียนได้แล้ว</p> <p>ถ้าต้องการให้เป็นแบบอัติโนมัติ<br /> แก้ไข /etc/fstab ให้เมานต์ตอนบูต</p> <pre>... /dev/hda2 /media/ntfs ntfs-3g silent,umask=0,locale=en_US.utf8 0 0 ...</pre><p> ถ้าต้องการให้เป็นแบบอ่านเขียนตอนบูต<br /> ให้เติม fuse ลงใน /etc/modules</p> <pre>... fuse ...</pre><p> <strong>update 51-12-27</strong><br /> บนเดเบียน<br /> <code>$ sudo aptitude install ntfs-3g fuse-utils<br /> $ sudo mkdir -p /media/ntfs<br /> $ sudo mount -t ntfs-3g /dev/hda2 /media/ntfs -o force</code></p> </div></div></div><div class="field field-name-taxonomy-vocabulary-1 field-type-taxonomy-term-reference field-label-above"><div class="field-label">Topic:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/taxonomy/term/2">ubuntu</a></div><div class="field-item odd"><a href="/taxonomy/term/75">ntfs</a></div></div></div> Thu, 26 Oct 2006 11:32:09 +0000 wd 61 at https://thaitux.info https://thaitux.info/node/61#comments