نصب آرچ بدون پارتیشن بندی مجزا کنار ویندوز روی پارتیشن ویندوزی
قبلا گفته بودم میشه آرچ رو بدون پارتیشن بندی مجزا کنار ویندوز روی پارتیشن ویندوزی نصب کرد و من دارم اینکارو میکنم که پس از تکمیل آموزشش رو قرار میدم
البته با اینکه کامل تکمیل نشده ولی به وضعیت پایدار و قابل قبولی رسیده که حالا آموزشش رو اینجا قرار میدم.پست قبلی من تو همین تاپیک که نحوه نصب آرچ رو از طریق یه لینوکس لایو یا نصب شده دیگه رو آموزش میداد و پست اول تاپیک رو باید خونده و درک کرده باشید.
توجه : کلیه دستورات با مجوز root اجرا شود.با دستور su به root لاگین کنید.
هدفی که من در نظر گرفتم نصب آرچ روی یک فایل ایمیج raw(خام) روی پارتیشن NTFS ویندوزی و بوت اون از طریق ویندوز و بدون نیاز به نصب هر لینوکسی روی پارتیشن فیزیکی بود که ابتدا توی فروم آرچ لینوکس ایران سوالش رو مطرح کردم و همونطور که توقع داشتم هیچ جوابی نگرفتم.سوالی که من کرده بودم تحت عنوان
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
به صورت زیر بود :
نقل قول:
با سلام
طبق تحقیقی که کردم نصب و بوت آرچ روی یه فایل مستقر روی پارتیشن ntfs ویندوز ممکنه.مطالبی که من پیدا کردم ناقصه و قدیمی مربوط به initscript که حالا جاشو داده به systemdبا دستور dd یه فایل خام ایجاد و با دستور mkfs.ext4 اونو فرمت و با دستور mount اونو سوار و با pacstrap بسته های baseو ntfs-3g و fuse و net-tools رو روی پارتیشن مجازی نصب میکنیم.باید یه hook به خصوص ایجاد بشه و به mkinitcpio.conf اضافه بشه و یه سری تغییرات دیگه و ایمیج initramfs سفارشی ساخته بشه.من مطلبی به درد بخوری راجع به syntax منوی گراب و به خصوص آرگومانهایی که به کرنل فرستاده میشند پیدا نکردم.فقط منوی گراب مربوط به نصب از طریق ایمیج ایزوی arch موجود بود.کسی هست که اطلاعات دقیقی از این فرآیند داشته باشه.خیلی میتونه به درد بخوره.
ابتدا نیاز به یه فایل خام با حجم مناسب(حدود 10 گیگ) روی پارتیشن ntfs داشتم البته با یک شرط و اون اینکه این فایل باید یک تکه باشد(و fragment نباشد)درایور ntfs-3g موجود در لینوکس که برای خواندن و نوشتن در پارتیشنهای ntfs مورد استفاده قرار میگیرد متاسفانه نمیتواند یک تکه بودن فایل ایجاد شده رو تضمین کند به نحوی که من روی پارتیشن ntfs خالی با حجم 19.5 گیگ فایلی با حجم 11 گیگ ایجاد کردم که 218 تکه داشت !!! به ناچار باید فایل در سیستم عامل ویندوز ایجاد گردد.فرض کنید پارتیشن ntfs در ویندوز با درایو f و ترجیحا خالی میباشد.با دستور زیر یک فایل با حجم 10 گیگ روی آن ایجاد میشود :
کد:
fsutil file createnew f:\arch.img 10737418240
حجم فایل به بایت است و دستور باید در خط فرمان اجرا شود.پس از ایجاد فایل با defragmenter ویندوز یا با نرم افزار wincontig در ویندوز یا filefrag در لینوکس باید اطمینان حاصل کنید فایل یک تکه باشد.برای سادگی فعلا از هارد اینترنال اصلی استفاده کنید البته روی هارد اکسترنال هم میتوان اینکار را انجام داد ولی نیاز به تغییراتی دارد که فعلا راجع به آن تحقیق نکردم(تیاز به wait جهت آماده سازی و سوار کردن سیستم فایل از درایو usb میباشد)حالا به لینوکس لایو یا نصب شده بوت کنید و فایل را آماده کنید.درایو ntfs من در مسیر /media/Programming & Storage/ سوار شده است. در کلیه دستورات شما باید آن را جایگزین کنید(با mount point خودتان)
کد:
/dev/sda8 on /media/Programming & Storage type fuseblk (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other,blksize=4096)
پیرو آموزش قبلی در این
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
باید فایل root-image.fs(حاوی سیستم فایل لایو آرچ به فرمت squashfs) را از ایزوی آرچ اکسترکت و در همان درایو حاوی arch.img قرار دهید.حالا باید فایل خام arch.img را فرمت کنید تا قابل استفاده باشد :
کد:
cd "/media/Programming & Storage/"
mkfs.ext4 -L arch_on_image arch.img
با دستور mkfs.ext4 فایل سیستم ext4 روی ایمیج خام ایجاد میگردد ابتدا سوالی از کاربر میشود که با y پاسخ دهید.خروجی این دستور :
کد:
# mkfs.ext4 -L arch_on_image arch.img
mke2fs 1.42.8 (20-Jun-2013)
arch.img is not a block special device.
Proceed anyway? (y,n) y
Filesystem label=arch_on_image
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
622592 inodes, 2490368 blocks
124518 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2550136832
76 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
دستور زیر را وارد کنید:
کد:
cd /tmp && mkdir arch_iso
mount /media/Programming\ \&\ Storage/root-image.fs /tmp/arch_iso/
mount /media/Programming\ \&\ Storage/arch.img /tmp/arch_iso/mnt/
سیستم فایل لایو سی دی نصب آرچ در مسیر tmp/arch_iso/ سوار میشود و فایل arch.img در زیر شاخه mnt/ از آن نصب میشود.با دستور زیر به سی دی لایو نصاب آرچ chroot و base آرچ را طبق آموزشهای تاپیک نصب کنید فقط لازم نیست از دستور genfstab برای ایجاد etc/fstab/ استفاده کنید:
کد:
/tmp/arch_iso/usr/bin/arch-chroot /tmp/arch_iso/
sed -ri 's:^#\[multilib\][ ]*$:[multilib]\nInclude = /etc/pacman.d/mirrorlist:g' /etc/pacman.conf
pacstrap -i /mnt/ base base-devel
pacman -r /mnt/ -S fuse ntfs-3g
\cp -R /etc/pacman.d/ /mnt/etc/
echo -e "/dev/loop0\t\t/\t\text4\t\tdefaults\t\t0\t1" > /mnt/etc/fstab
در دستورات بالا بعد از chroot مخزن multilib در فایل پیکربندی etc/pacman.conf/ فعال میکنیم که فقط برای معماری x86_64 مفید است.با دستور pacstrap گروه های نرم افزاری base و base-devel را نصب میکنیم.با دستور pacman باید fuse و ntfs-3g نصب شود.دستور آخر هم ورودی مورد نیاز برای فایل etc/fstab/ را میسازد.با دستور exit از محیط chroot سی دی لایو نصاب آرچ خارج میشویم و حالا باید به ایمیج محل نصب آرچ chroot بزنیم :
کد:
/tmp/arch_iso/usr/bin/arch-chroot /tmp/arch_iso/mnt/
حالا نوبت به ویرایش فایل etc/locale.gen/ میرسد به جای ویرایش دستی میتوان از دستورات زیر استفاده کرد :
کد:
sed -ri 's:^#en_US\.UTF-8 UTF-8(.*):en_US.UTF-8 UTF-8:g' /etc/locale.gen
sed -ri 's:^#fa_IR UTF-8(.*):fa_IR UTF-8:g' /etc/locale.gen
با یک دستور grep میتوان مطمین شد فایل به درستی ویرایش شده باشد :
کد:
sh-4.2# grep -E '^[^#]+' /etc/locale.gen
en_US.UTF-8 UTF-8
fa_IR UTF-8
در ادمه :
کد:
sed -ri 's:^#\[multilib\][ ]*$:[multilib]\nInclude = /etc/pacman.d/mirrorlist:g' /etc/pacman.conf
locale-gen
echo LANG=en_US.UTF-8 > /etc/locale.conf
ln -s /usr/share/zoneinfo/Asia/Tehran /etc/localtime
hwclock --systohc --utc
echo Forozan > /etc/hostname
passwd
useradd -m -G wheel,lp,video,audio -s /bin/bash ahmad && passwd ahmad
به جای forozan شما نام دیگری را برای hostname وارد کنید و به جای ahmad هم نام کاربری خودتان را.حالا نوبت به تغییرات بنیادینی میرسد که برای بوت لازم است برای این تغییرات از منابع زیر کمک گرفته شده است:
کد:
http://code.google.com/p/archlive/wiki/BootArchFromLoop
http://felixc.at/KnowledgeBase?highlight=%28%28ArchLinux-loopback%29%29
البته هر دوی این منابع قدیمی و مربوط به initscript هستند در حالیکه هم اکنون آرچ به systemd مهاجرت کرده و میباست تغییرات مناسب اعمال شود ولی کمک عمده ای کردند. برای باز کردن لینک googlecode باید از شیلتر شکن استفاده کرد.دستور زیر را تایپ کنید :
کد:
nano /lib/initcpio/install/automount
متن زیر را به درون این محیط کپی پیست و فایل را ذخیره کنید :
کد:
build ()
{
add_module 'loop'
add_module 'fuse'
add_binary "/usr/bin/blkid"
add_binary "/usr/bin/ntfs-3g"
add_file "/usr/bin/mount.ntfs"
add_file "/usr/bin/mount.ntfs-3g"
add_runscript automount
}
help ()
{
cat<<HELPEOF
This hook auto mount the root device base on cmdline.
Can support:
1. Boot from normal harddisk or USB disk;
2. Boot from CD-ROM or DVD-ROM;
3. Boot from loop device file (made by dd or other tools);
4. Boot from squashfs files;
...
HELPEOF
}"
دستور زیر را تایپ کنید :
کد:
nano /lib/initcpio/hooks/automount
متن زیر را به درون این محیط کپی پیست و فایل را ذخیره کنید :
کد:
run_hook ()
{
# Boot parameters as: real_root=loop=/dev/sda1 root_file=arch_root.img
case ${real_root} in loop\=*)
loop=${real_root/loop=}
if [ -e ${loop} ]; then
if [ "x${UNION}" = "x" ];then UNION="/new_root"; fi
if [ "x${HOST}" = "x" ];then HOST="/host"; fi
fstype=$(blkid -u filesystem -o value -s TYPE -p ${loop})
if [ "${readwrite}" = "no" ]; then rwopt="ro"; else rwopt="rw"; fi
#add ntfs-3g , mount.ntfs & mount.ntfs-3g to FILES - Add loop & fuse to MODULES in mkinitcpio.conf
if [ "${fstype}" = "ntfs" ]; then
mount -t ${fstype} -o ${rwopt},nosuid,nodev,noatime,user_id=0,group_id=0,allow_other,big_writes ${loop} ${HOST}
else
mount -t ${fstype} -o ${rwopt} ${loop} ${HOST}
fi
loop_host="`basename ${loop} 2>/dev/null`"
if [ "x${loop_host}" = "x" ];then loop_host="/mnt";else loop_host="/mnt/${loop_host}"; fi
if [ -f ${HOST}/${root_file} ]; then
loopfile="${HOST}/${root_file}"
fstype=$(blkid -u filesystem -o value -s TYPE -p "${loopfile}")
if [ "${fstype}" = "squashfs" ]; then rwopt="ro"; fi
mount -t ${fstype} -o ${rwopt},sync ${loopfile} ${UNION}
mkdir -p ${UNION}${HOST}
mkdir -p ${UNION}${loop_host}
mount -o bind ${HOST} ${UNION}${loop_host}
export MOUNTED=1
fi
fi
;;
esac
}
با دستور nano /lib/initcpio/init فایل init را برای ویرایش باز کنید و قبل از خط mount_handler=default_mount_handler چند خط زیر را وارد کنید :
کد:
export HOST="/host"
export UNION="/new_root"
mkdir -p $HOST
# Change to "MOUNTED=1" when root mounted successfully.
export MOUNTED="0"
حالا خط "${mount_handler} /new_root" را پیدا و با ۲ خط زیر جایگزین کنید :
کد:
# If hook scripts success mounted root, then skip Arch default mount handler.
if [ "$MOUNTED" = "0" ]; then ${mount_handler} $UNION; fi
حالا دستور mkinitcpio -p linux رو اجرا کنید تا فایل initramfs ایجاد بشه.دیگه میتونید exit رو تایپ و از محیط chroot خارج شید.محض اطمینان پس از خروج دستور sync رو اجرا کنید.جالا باید یه ورودی در فایل boot/grub/grub.cfg/ ایجاد کنید تا سیستم عامل آرچ مستقر روی ایمیج رو بتونید بوت کنید:
کد:
menuentry "Arch x86_64 (on loop)" {
load_video
set gfxpayload=keep
insmod gzio
insmod part_msdos
insmod ext2
insmod loopback
insmod ntfs
loopback loop (hd0,msdos8)/arch.img
set root=(loop)
linux /boot/vmlinuz-linux real_root=loop=/dev/sda8 root_file=arch.img quiet
initrd /boot/initramfs-linux.img
}
or
menuentry 'Arch x86_64 (on loop)' --class arch --class gnu-linux --class gnu --class os {
load_video
set gfxpayload=keep
insmod gzio
insmod part_gpt
insmod ext2
insmod loopback
insmod ntfs
loopback loop (hd0,gpt8)/arch.img
set root=(loop)
linux /boot/vmlinuz-linux real_root=loop=/dev/sda8 root_file=arch.img quiet
initrd /boot/initramfs-linux.img
}
با توجه به اینکه هارد شما gpt باشه یا msdos یکی از ۲ گزینه بالا رو اضافه کنید(اکثرا msdos هستند) دستورات load_video و set gfxpayload=keep رو میتونید(و یا باید) حذف کنید.سینتکس صحیح رو با مرور فایل grub.cfg و مشاهده اون میتونید بفهمید.به ورودیهای قبلی توجه کنید.ضمنا sda8 در سیستم من ممکن است با سیستم شما متفاوت باشد عدد 8 را با شماره پارتیشن ntfs حاوی arch.img جایگزین کنید.اگر نام فایل ایمیج متفاوت است آنرا نیز تغییر دهید.فایل را دخیره و ری استارت کنید و ...من kde و درایور گرافیک رو رو این سیستم نصب کردم و این یه نما از اون :یه سری مطالب و ملاحظات وجود داره که تو پست بعدی میگم.