# NASA-HW6
資工二 B07902046 高長聖
## NFS:
### 1.
reference: https://linuxize.com/post/how-to-mount-an-nfs-share-in-linux/
#### (1)
先在lab12的VM中,創造新的資料夾/hw6
#### (2)
在/etc/fstab中,加入:
```
10.217.44.92:/e/NASA_flag /hw6 nfs defaults 0 0
```
#### (3)
```bash=
mount /hw6
mount 10.217.44.92:/e/NASA_flag
```
#### (4)
最後,進入/nfs,裡面flag的內容: NASA{M0un71n6_NF5!}

### 2.
reference: http://linux.vbird.org/linux_server/0330nfs.php#What_NFS_perm
NFS的permission checking mechanism是當user想要存取server端的filesystem的時候,server端會自主或者以NIS來確認user身分,並檢查是否有permission可以進行操作。
但如果要mount別人的資料夾,需要在server端更改/etc/fstab以及/etc/exports的檔案,因此沒有權限的人無法進行這種行為。再者,即使擁有更改以上兩個檔案的權限,受制於想要mount的directory的權限,也不一定有機會。
## Fix the VM:
### Disk Corruption:
reference:
https://www.cgsecurity.org/wiki/TestDisk_Step_By_Step
http://www.iitk.ac.in/LDP/LDP/Linux-Filesystem-Hierarchy/html/mnt.html
https://wiki.archlinux.org/index.php/Chroot#Using_arch-chroot
https://superuser.com/questions/595818/add-usr-local-sbin-to-the-path-of-a-user
https://docs.pagure.org/docs-fedora/the-grub2-bootloader.html
#### (1)
啟動VM:
```bash=
qemu-img create -f qcow2 -b /tmp2/nasa-hw6/VMfix.qcow2 vm0.qcow2
#將VMfix.qcow2複製到資料夾
qemu-system-x86_64 \
-enable-kvm \
-smp 2,cores=1 \
-m 2G \
-hda vm0.qcow2 \
-cdrom /tmp2/nasa-hw6/archlinux-2020.05.01-x86_64.iso \
-netdev user,id=n0 \
-device rtl8139,netdev=n0 \
-vnc :23,password \
-monitor stdio
#啟動VM,並用VNC連線進去
```
#### (2)
下載testdisk,並進入其console:
```bash=
pacman -Syu testdisk
testdisk
```
#### (3)
立用[Create] $\rightarrow$ [Disk /dev/sda] $\rightarrow$ [EFI GPT] $\rightarrow$ [Analyze] $\rightarrow$ [Quick search]來檢查/dev/sda下的partition:

最後用[write]寫入
#### (4)
將所有的sda\*都mount到一個自創的資料夾,查看裡面的內容後之後umount,在/dev/sda2的裡面看到/etc/fstab:

#### (5)
但由於根據之前所看的內容,BIOS boot partition在原本應該是sda1,其餘的必須往後移一個位置,因此更改/etc/fstab為:

#### (6)
由於/mnt具有此vm的root directory的性質,因此,先將對應到/mnt的/dev/sda2 mount上去,之後再對mount好的/mnt,將/dev/sda\* mount到相應的位置:
```bash=
mount /dev/sda2 /mnt
mount /dev/sda1 /mnt/boot
mount /dev/sda5 /mnt/home
mount /dev/sda4 /mnt/usr
mount /dev/sda3 /mnt/var
```
#### (7)
利用fdisk創造新的BIOS boot partition /dev/sda6:
```bash=
fdisk
n #add a new partition, and all the settings are difault
t #change the type of partition to bios boot (4)
w #write changes
```
#### (8)
利用arch-chroot,進入原本要修復的VM:
```bash=
arch-chroot /mnt /usr/bin/bash
```
#### (9)
安裝並啟動grub2:
```bash=
yum install grub2
export PATH=$PATH:/usr/sbin >> ~/.bashrc #由於grub2是裝在sbin 因此要將sbin加入PATH
grub2-install /dev/sda #install grub2 to sda
grub2-mkconfig -o /boot/grub2/grub.cfg #make configuration file for grub2
```
#### (10)
關掉VM,並用以下指令重新啟動,並用VNC連線:
```bash=
qemu-system-x86_64 \
-enable-kvm \
-smp 2,cores=1 \
-m 2G \
-hda vm0.qcow2 \
-netdev user,id=n0 \
-device rtl8139,netdev=n0 \
-vnc :23,password \
-monitor stdio
```
#### (11)
可以開機,並且裡面的partition都已經修復

### Broken Pacman
#### 1.
reference:
https://unix.stackexchange.com/questions/364439/how-to-manually-boot-arch-linux-from-preboot-emergency-shell
此error message的發生,通常是在更新或者是安裝的時候,遺失某些檔案所造成的。而此題的情況,可能是因為朋友太久沒有更新此系統,而導致boot partition以及pacman library無法正常安裝或者遺失。
#### 2.
reference:
https://wiki.archlinux.org/index.php/Pacman_(%E6%AD%A3%E9%AB%94%E4%B8%AD%E6%96%87)
https://www.ostechnix.com/fix-pacman-error-loading-shared-libraries-error-arch-linux/
#### (1)
啟動VM:
```bash=
qemu-img create -f qcow2 /tmp2/nasa-hw6/arch-packages-fix.qcow2 vm1.qcow2
#將.qcow2複製到資料夾
qemu-system-x86_64 \
-enable-kvm \
-smp 1,cores=1 \
-m 2G \
-hda vm1.qcow2 \
-cdrom /tmp2/nasa-hw6/archlinux-2020.05.01-x86_64.iso \
-netdev user,id=n0 \
-device rtl8139,netdev=n0 \
-vnc :29,password \
-monitor stdio \
-boot d
#啟動VM,並用VNC連線進去
```
#### (2)
用lsblk發現有兩個partition sda1、sda2,先將其mount在自創的一個資料夾,查看裡面內容,再umount,發現:

#### (3)
將sda1和sda2 mount到/mnt對應的位置:
```bash=
mount /dev/sda1 /mnt
mount /dev/sda2 /mnt/boot
```
#### (4)
利用arch-chroot,進入原本要修復的VM:
```bash=
arch-chroot /mnt /usr/bin/bash
```
#### (5)
嘗試重整軟體包後更新:
```bash=
pacman -Syyu
```
到一半時,跳出:

#### (6)
嘗試安裝libp11-kit:
```bash=
pacman -S libp11-kit
```
#### (7)
重新建立一份 initramfs 映像:
```bash=
mkinitcpio -p linux
```
#### (8)
重新開機,並用以下指令開啟VM:
```bash=
qemu-system-x86_64 \
-enable-kvm \
-smp 1,cores=1 \
-m 2G \
-hda vm1.qcow2 \
-netdev user,id=n0 \
-device rtl8139,netdev=n0 \
-bios /usr/share/ovmf/x64/OVMF.fd \
-vnc :31,password \
-monitor stdio
```
#### (9)
測試pacman可否使用:
$\Rightarrow$ 原本VM裡面沒有git指令:

利用:
```bash=
pacman -Syu git
```
結果順利下載git指令:

(10) 用nasa的身分登入,得到flag:

### Arch Linux Installation with PXE
#### 1.
path: /home/student/07/b07902046/nasa/hw_6/2.3
##### (1)
利用./start.sh,啟動PXE server,自己更改vnc password,然後用vnc連線進去
##### (2)
啟動PXE服務:
```bash=
# username root password nasa
darkhttpd /mnt/archiso
```
##### (3)
create新的img並啟動:
```bash=
qemu-img create -f qcow2 <vm-name> <vm-size>
./start2.sh <vm-name>
```
#### 2.
reference:
https://wiki.archlinux.org/index.php/Preboot_Execution_Environment
https://www.simplified.guide/ssh/copy-file
https://bbs.archlinux.org/viewtopic.php?id=187250
##### (1)
啟動VM:
```bash=
qemu-img create -f qcow2 -b /tmp2/nasa-hw6/arch.qcow2 vm2.qcow2
qemu-system-x86_64 \
-enable-kvm \
-smp 1,cores=1 \
-m 2G \
-hda vm2.qcow2 \
-netdev user,id=n0 \
-device rtl8139,netdev=n0 \
-netdev socket,id=vlan,mcast=230.0.0.1:1257 \
-bios /usr/share/ovmf/x64/OVMF.fd \
-vnc :31,password \
-monitor stdio
#啟動VM,並用VNC連線進去
```
##### (2)
建立一個image的mount point,並將工作站上/tmp2/nasa-hw6/的arch linux iso複製到VM:
```bash=
mkdir -p /mnt/archiso
scp linux1.csie.org:/tmp2/nasa-hw6/archlinux-2020.05.01-x86_64.iso arch.iso
```
##### (3)
重新啟動,之後將arch.iso mount在/mnt/archiso
```bash=
reboot
mount -o loop,ro /root/arch.iso /mnt/archiso
```
##### (4)
設定網卡:
```bash=
ip link set ens3 up
ip addr add 192.168.0.1/24 dev ens3
```
##### (5)
利用dnsmasq架設dhcp和TFTP server:
```bash=
pacman -Syu dnsmasq
vim /etc/dnsmasq.conf
###
port=0
interface=ens3
bind-interfaces
dhcp-range=192.168.0.50,192.168.0.150,12h
dhcp-boot=/arch/boot/syslinux/lpxelinux.0
dhcp-option-force=209,boot/syslinux/archiso.cfg
dhcp-option-force=210,/arch/
dhcp-option-force=66,192.168.0.1
enable-tftp
tftp-root=/mnt/archiso
###
systemctl start dnsmasq.service
```
##### (6)
利用darkhttpd,使filesystem得以轉移,啟動PXE服務:
```bash=
pacman -Syu darkhttpd
darkhttpd /mnt/archiso
```
得到:
