Thursday, November 21, 2024

Công nghệ Passthrough

-

1. Công nghệ Passthrough là gì?

Công nghệ Passthrough là một phương pháp cho phép máy ảo truy cập trực tiếp vào một thiết bị phần cứng của hệ thống vật lý, như card đồ họa hay card mạng, giống như trên một hệ thống vật lý.

Công nghệ Passthrough thường được sử dụng trong ảo hóa để cung cấp hiệu suất cao cho các ứng dụng đòi hỏi tài nguyên phần cứng, như các ứng dụng đồ họa hoặc các ứng dụng máy chủ mạng. Khi sử dụng công nghệ Passthrough, máy ảo có thể truy cập trực tiếp vào thiết bị phần cứng và sử dụng nó như một phần của máy ảo.

Công nghệ Passthrough thường được sử dụng với IOMMU (Input-Output Memory Management Unit) để cấu hình truy cập trực tiếp vào thiết bị phần cứng. Khi IOMMU được kích hoạt, các máy ảo có thể truy cập trực tiếp vào thiết bị phần cứng thông qua VFIO (Virtual Function I/O) driver, cho phép các ứng dụng trong máy ảo sử dụng thiết bị phần cứng giống như trên một hệ thống vật lý.

Tổng quát, công nghệ Passthrough là một phương pháp cho phép máy ảo truy cập trực tiếp vào thiết bị phần cứng của hệ thống vật lý, cho phép các ứng dụng trong máy ảo sử dụng tài nguyên phần cứng giống như trên một hệ thống vật lý.

Như vậy VFIO và IOMMU là các công nghệ được sử dụng trong ảo hóa để chia sẻ thiết bị phần cứng như card đồ họa với các máy ảo.

VFIO là một kỹ thuật cho phép máy ảo truy cập trực tiếp vào một thiết bị phần cứng thông qua một driver ảo. Điều này cho phép các ứng dụng trong máy ảo sử dụng thiết bị phần cứng như thể nó đang chạy trên một hệ thống vật lý. VFIO được sử dụng để chia sẻ các thiết bị như card đồ họa, card mạng, hay card âm thanh.

IOMMU (Input-Output Memory Management Unit) là một tính năng của bộ xử lý cho phép truy cập trực tiếp vào bộ nhớ của hệ thống. IOMMU cho phép máy ảo truy cập trực tiếp vào các thiết bị phần cứng thông qua VFIO. Điều này giúp tăng hiệu suất và cải thiện tính bảo mật của hệ thống ảo hóa.

2. Danh sách card đồ hoạ hỗ trợ công nghệ Passthrough.

AMD

Nvidia

Bạn có thể xem danh sách các loại phần cứng hỗ trợ IOMMU tại https://en.wikipedia.org/wiki/List_of_IOMMU-supporting_hardware

Nếu bạn sử dụng một CPU có hỗ trợ IOMMU, bạn sẽ có thể sử dụng tính năng này để chia sẻ các thiết bị phần cứng như card đồ họa với các máy ảo. Khi bạn kích hoạt IOMMU trong BIOS của hệ thống, CPU sẽ được cấu hình để cho phép các máy ảo truy cập trực tiếp vào các thiết bị phần cứng thông qua VFIO.

Khi bạn chia sẻ card đồ họa với máy ảo thông qua VFIO và IOMMU, máy ảo sẽ có quyền truy cập trực tiếp vào card đồ họa. Điều này cho phép các ứng dụng trong máy ảo sử dụng card đồ họa như thể nó đang chạy trên một hệ thống vật lý.

Tuy nhiên, việc chia sẻ card đồ họa giữa các máy ảo sử dụng VFIO và IOMMU có thể ảnh hưởng đến hiệu suất của hệ thống. Vì vậy, bạn nên kiểm tra cấu hình của hệ thống để đảm bảo rằng nó đủ mạnh để hỗ trợ việc chia sẻ card đồ họa giữa các máy ảo.

3. Các giải pháp ảo hóa sau đây hỗ trợ công nghệ Passthrough

Dưới đây là các giải pháp ảo hóa sau đây hỗ trợ công nghệ Passthrough:

  • VMware vSphere ESXi: Đây là một giải pháp ảo hóa được sử dụng rộng rãi trong doanh nghiệp và được hỗ trợ công nghệ Passthrough cho các thiết bị PCIe.
  • KVM (Kernel-based Virtual Machine): KVM là một giải pháp ảo hóa nguồn mở và miễn phí trên hệ điều hành Linux. Nó cung cấp hỗ trợ Passthrough cho các thiết bị PCIe, USB và GPU.
  • Microsoft Hyper-V: Hyper-V là một giải pháp ảo hóa được tích hợp sẵn trên hệ điều hành Windows Server. Nó cung cấp hỗ trợ Passthrough cho các thiết bị PCIe.
  • Xen: Xen là một giải pháp ảo hóa nguồn mở và miễn phí. Nó hỗ trợ Passthrough cho các thiết bị PCIe, USB và GPU.
  • Proxmox VE: Đây là một giải pháp ảo hóa nguồn mở và miễn phí được xây dựng trên nền tảng KVM và LXC. Nó cung cấp hỗ trợ Passthrough cho các thiết bị PCIe và GPU.
  • Oracle VM VirtualBox: VirtualBox là một giải pháp ảo hóa miễn phí và được sử dụng rộng rãi cho mục đích phát triển và kiểm thử. Nó cung cấp hỗ trợ Passthrough cho các thiết bị USB và PCI.

Lưu ý rằng, để sử dụng công nghệ Passthrough, hệ thống phải hỗ trợ công nghệ IOMMU (Input-Output Memory Management Unit) và các driver VFIO (Virtual Function I/O). Bạn nên kiểm tra cấu hình của hệ thống để đảm bảo rằng nó hỗ trợ công nghệ Passthrough và IOMMU.

4. Một số lưu ý khi sử dụng Passthrough.

Khi bạn truyền GPU cho một máy ảo thì máy chủ không còn có quyền truy cập GPU nữa. Nó sẽ được sử dụng độc quyền bởi máy ảo đó.

Nếu bạn muốn sử dụng GPU đồng thời cho nhiều máy ảo, bạn cần phải có nhiều GPU hoặc sử dụng các giải pháp ảo hoá GPU như NVIDIA GRID hoặc AMD MxGPU. Những giải pháp này cho phép chia sẻ tài nguyên GPU giữa nhiều máy ảo, tạo ra nhiều máy ảo đồng thời sử dụng GPU một cách hiệu quả. Tuy nhiên, chúng yêu cầu phần cứng hỗ trợ đặc biệt và giá thành cao hơn so với các giải pháp chia sẻ GPU thông thường.

NVIDIA GRID hoặc AMD MxGPU là công nghệ ảo hoá GPU để chia sẻ tài nguyên GPU giữa các máy ảo. Các ảo hoá hỗ trợ NVIDIA GRID và AMD MxGPU bao gồm:

  • Citrix Hypervisor (trước đây là XenServer)
  • VMware vSphere vDGA (Virtual Dedicated Graphics Acceleration)
  • Microsoft RemoteFX

Ngoài ra, còn có một số ảo hoá như Proxmox và QEMU/KVM có thể triển khai ảo hoá GPU bằng cách sử dụng công nghệ passthrough GPU, nhưng chúng không hỗ trợ NVIDIA GRID hoặc AMD MxGPU trực tiếp.

5. Tthực hành triển khai công nghệ passthrough với Proxmox.

Bạn là một người đam mê PC và muốn thử nghiệm với ảo hoá và bạn vừa nâng cấp lên vga RTX series 3000 và không biết làm gì với card đồ họa series 2000 của mình, mình có một dự án để bạn thực hiện.

Mình sẽ giả định rằng bạn đã có một máy chủ Proxmox với một GPU dư để cấu hình.

Proxmox là một nền tảng ảo hoá dựa trên Linux, cho phép bạn tạo ra các máy ảo trên một máy chủ vật lý. Khi bạn có một GPU dư thừa, bạn có thể sử dụng công nghệ passthrough để chuyển giao card đồ họa từ máy chủ sang máy ảo. Điều này cho phép bạn sử dụng GPU đó cho mục đích của máy ảo, chẳng hạn như chơi game, mà không ảnh hưởng đến hiệu suất hoạt động của máy chủ.

Vì vậy, với dự án này, bạn có thể sử dụng GPU của series 2000 trên một máy ảo trên máy chủ Proxmox của mình, trong khi GPU của series 3000 được sử dụng cho mục đích khác trên máy chủ của bạn.

Khi bạn sử dụng công nghệ Passthrough để chuyển giao card đồ họa (GPU) từ máy chủ (host) sang máy ảo (VM), thì máy chủ sẽ không còn có quyền truy cập vào GPU nữa. Điều này có nghĩa là bạn không thể sử dụng GPU đó trên máy chủ trong khi máy ảo đang sử dụng nó. Vì vậy, để tránh trường hợp này, mình khuyên bạn nên thêm một GPU thứ hai vào máy chủ của mình. Bằng cách đó, bạn có thể sử dụng một GPU cho mục đích của máy chủ, trong khi GPU khác được sử dụng bởi máy ảo.

Tuy nhiên, bạn vẫn có thể remote vào máy chủ thông qua các phương thức khác như SSH hoặc VNC. Tuy nhiên, truy cập này chỉ giúp bạn quản lý hệ thống, không thể sử dụng GPU được truyền cho máy ảo.

Lưu ý rằng GPU không thể được chia sẻ giữa các máy ảo, có nghĩa là một GPU chỉ có thể được sử dụng bởi một máy ảo tại một thời điểm. Vì vậy, nếu bạn muốn chạy nhiều máy ảo cùng một lúc và muốn tất cả các máy ảo này có thể sử dụng GPU, bạn cần phải cung cấp một GPU riêng cho mỗi máy ảo.

Lưu ý rằng Passthrough có thể không được hỗ trợ trên một số thiết bị hoặc môi trường cụ thể. Bạn cần phải kiểm tra kỹ càng trước khi triển khai tính năng này để đảm bảo tính ổn định và an toàn cho hệ thống của mình.

Bước 1: Chỉnh sửa file Grub.

Bạn cần truy cập vào máy chủ Proxmox của mình thông qua SSH để chỉnh sửa file cấu hình Grub. File cấu hình Grub là một file cấu hình khởi động của hệ thống Linux, nơi bạn có thể thiết lập các thông số để tùy chỉnh cách hệ thống khởi động. Grub sẽ đọc file cấu hình này để quyết định cách hệ thống sẽ khởi động.

Trong file cấu hình Grub, bạn cần tìm và cập nhật dòng “GRUB_CMDLIN_LINUX_DEFAULT”. Mặc định, nó sẽ được thiết lập là “quiet”, điều này có nghĩa là hệ thống sẽ không hiển thị bất kỳ thông báo nào trong quá trình khởi động. Tuy nhiên, để thực hiện một số tùy chỉnh trên hệ thống của bạn, bạn có thể muốn bật chế độ ghi log hoặc hiển thị thông báo khởi động. Dưới đây là file Grub cấu hình mặc định của Proxmox.

GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="Proxmox Virtual Environment"
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX=""

Chức năng của chúng được giải thích như sau:

  • GRUB_DEFAULT=0: Thiết lập mặc định chọn mục khởi động đầu tiên (nếu không có thao tác nào được thực hiện) là mục đầu tiên trong danh sách các mục khởi động.
  • GRUB_TIMEOUT=5: Thiết lập thời gian chờ để chọn mục khởi động trong trường hợp người dùng không lựa chọn mục nào, ở đây được thiết lập là 5 giây.
  • GRUB_DISTRIBUTOR=”Proxmox Virtual Environment”: Cung cấp thông tin về bản phân phối hệ điều hành mà GRUB đang chạy, ở đây là Proxmox Virtual Environment.
  • GRUB_CMDLINE_LINUX_DEFAULT=”quiet “: Thiết lập các thông số mặc định cho Linux khi khởi động. Ở đây, được thiết lập là “quiet” nghĩa là hệ thống sẽ không hiển thị bất kỳ thông báo nào trong quá trình khởi động.
  • GRUB_CMDLINE_LINUX=””: Thiết lập các thông số Linux khi khởi động, đây là nơi để thêm các tùy chọn tùy chỉnh của riêng bạn.

Để tùy chỉnh các thông số cho hệ thống Proxmox, bạn hãy thay đổi các thông số trong file cấu hình GRUB này và đối với các CPU Intel, để kích hoạt IOMMU, bạn cần thêm tham số “intel_iommu=on” vào dòng lệnh GRUB_CMDLINE_LINUX_DEFAULT trong file cấu hình GRUB.

Cụ thể, nội dung của dòng này sẽ được chỉnh sửa như sau:

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"

Sau khi chỉnh sửa, bạn cần lưu lại và cập nhật lại grub bằng lệnh “update-grub”. Lệnh này sẽ cập nhật grub với các thay đổi mới nhất trong file cấu hình.

Cuối cùng, bạn cần khởi động lại máy chủ Proxmox bằng lệnh reboot để các thay đổi được áp dụng. Sau khi khởi động lại, các CPU Intel của bạn sẽ được kích hoạt IOMMU để hỗ trợ công nghệ passthrough khi ảo hóa.

Bước 2: chỉnh sửa file modules.

Để có thể sử dụng công nghệ passthrough trên Proxmox và chia sẻ GPU cho máy ảo Windows 10, bạn cần thực hiện một số bước tiếp theo.

Trước tiên, bạn cần thêm các module cần thiết vào file /etc/modules. Để làm điều này, mở file /etc/modules và thêm các dòng sau:

cat >> /etc/modules << 'OEF'
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
OEF

Sau khi thêm, lưu file và đóng nó lại.

Bước 3: Chặn các drives từ máy chủ.

Trong bước này, chúng ta sẽ chặn driver của host machine để không bị xung đột với driver được cài đặt trên máy ảo. Để làm điều này, chúng ta sẽ chỉnh sửa file /etc/modprobe.d/pve-blacklist.conf.

echo -e """blacklist nvidiafb\nblacklist nvidia\nblacklist radeon\nblacklist nouveau""" > /etc/modprobe.d/pve-blacklist.conf

Các dòng trên sẽ chặn driver nvidiafb, nvidia, radeon, và nouveau khỏi việc tải lên host machine. Như vậy, chỉ các driver cần thiết cho việc hoạt động của host machine sẽ được tải lên, tránh xung đột với driver được sử dụng trên máy ảo.

Sau khi đã hoàn tất, lưu lại file và khởi động lại Proxmox Host để cập nhật các thay đổi.

Bước 4: Thiết lập VM cho Windows 10.

Hãy tạo 1 VM bằng cách bấm chuột phải vào node muốn tạo và chọn Create VM.

Đặt tên và tên cho VM.

Chọn ISO Windows 10 và thông tin Guest OS.

Phần System hãy lựa chọn các thông tin như dưới.

Tương tự phần Disks hãy lựa chọn Bus/Device là VirtIO Block, Cache là Write through, lựa chọn Storage và Disk size (GiB). Nhớ tích vào I0 thread.

In the CPU section, select the number of cores and sockets, in the type section select the host and select the Extra CPU Flags lựa chọn là flags=+pcid.

Lựa chọn RAM, sử dụng công thức 1024*1GB RAM. Ví dụ muốn lấy 16GB RAM thì sử dụng công thức 1024*16=16384.

Phần network lựa chọn Model Network là VirtIO (paravirtualized).

Và đây là phần review lại quá trình thiết lập, nếu không còn gì thay đổi bạn hãy bấm Finish.

Bây giờ bạn đã có VM (1) và hãy bấm vào (2).

Thêm 1 đĩa CD và gắn ISO “virtio-win-0.1.171.iso”. ISO này bạn có thể download từ https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.171-1/virtio-win-0.1.171.iso

Lựa chọn ISO virtio-win-0.1.171.iso.

Và đây là kết quả, bạn đã gắn 2 ISO như hình.

Bây giờ hãy start VM và bắt đầu quá trình cài đặt Windows 10.

Bước 5: Cài đặt Windows 10.

Các bước cài đặt Windows 10 cũng như các bạn cài ở máy tính để bàn hoặc laptop. Bấm Next để tiếp tục.

Chọn Install now.

Bấm “I don’t have a product key”.

Chọn 1 bạn Windows 10 mà bạn thích, mình lựa chọn Windows 10 Pro.

Hãy tích vào “Accept the licence terms” và bấm Next.

Hãy lựa chọn “Custom: Install Windows only (advanced)”.

Tại đây bạn sẽ không thấy bất kỳ ổ đĩa nào khả dụng, lý do là mình đang chọn ổ đĩa có SCSI Controller là VirtIO SCSI. Bạn hãy thêm driver cho loại SCSI Controller này bằng cách bấm vào Load driver.

Chọn Browse.

Tìm đến ISO virtio-win-0.1.171.iso mà chúng ta đã mount lúc thiết lập VM và lựa chọn theo folder dưới.

Nếu đúng driver bạn sẽ nhận được thông báo “Red Hat VirtIO SCSI controller (D:\amd64\w10\viostor.inf)” như dưới.

Quá trình cài đặt driver bắt đầu.

Sau khi cài đặt xong bạn sẽ nhận được ổ đĩa để cài đặt.

Hãy lựa chọn disk và thiết lập trình tự như dưới.

Quá trình cài đặt Windows 10 bắt đầu.

Bước 6: Cài đặt driver cho Windows 10.

Sau khi cài đặt xong, bạn hãy vào Device Manager bằng cách vào run gõ devmgmt.msc. Bạn sẽ nhận được 3 trình điều khiển chưa có driver như dưới.

Hãy thực hiện các bước như dưới để cài đặt trình điều khiển cho chúng.

Lựa chọn “Browse my computer for drivers”.

Tìm đến đĩa mount của ISO “virtio-win-0.1.171.iso”.

Bấm Next. Lưu ý nếu bạn biết được ISO mount vào vị trí nào thì có thể gõ thằng vào “Search for drivers in this location” cũng được.

Bấm Install để quá trình cài driver bắt đầu.

Đây là kết quả cài đặt driver cho Red Hat VirtIO Ethernet Adapter thành công. Giờ đây bạn có thể thiết lập card mạng để đi internet.

Bạn có thể thấy Network của bạn đã cài thành công và có thể đi internet, phần speed 100.0Gbs bạn đừng quan tâm nhé vì đây chỉ là network ảo hoá.

Tiếp theo bạn hãy thực hiện các bước tương tự để áp dụng cho 2 driver còn thiếu.

Và đây là kết quả khi bạn cài xong 2 driver còn lại.

Ở phần tiếp theo bạn hãy vào ổ đĩa mount theo đường dẫn như dưới, copy thư mục amd64.

Bạn hãy bỏ vào một nơi nào đó và hãy đổi tên cho nó để dễ dàng phân biệt, và dưới đây là hình ảnh sau khi mình sao chép và đổi tên xong cho nó.

Đứng tại thư mục này bạn hãy vào “Windows PowerShell” với quyền Admin.

Chạy lệnh “.\blnsvr.exe -i” để cài đặt service Balloon. Mình sẽ giải thích cho các bạn dịch vụ Balloon là gì?

Trong ảo hóa máy chủ, Balloon là một công nghệ cho phép hệ thống tài nguyên của máy chủ vật lý được phân chia và chia sẻ giữa các máy ảo. Balloon sử dụng một tiến trình đặc biệt trên mỗi máy ảo để quản lý và điều chỉnh lượng bộ nhớ và tài nguyên khác được phân bổ cho máy ảo đó.

Khi máy chủ vật lý cần thêm tài nguyên cho một máy ảo khác, Balloon giúp giải phóng các tài nguyên bên trong máy ảo đó, cho phép máy chủ vật lý có thể sử dụng các tài nguyên đó để phục vụ các máy ảo khác.

Ngoài ra, Balloon cũng có thể giúp giảm thiểu lượng tài nguyên sử dụng bởi các máy ảo không cần sử dụng toàn bộ tài nguyên được phân bổ cho nó. Điều này giúp tối ưu hóa tài nguyên và hiệu quả hóa hoạt động của hệ thống ảo hóa.

Sau khi cài đặt xong dịch vụ Balloon bạn hãy bật RPD cho nó.

Tiếp theo hãy tắt VM Windows 10 này và chúng ta sẽ qua bước tiếp theo.

Bước 7: Gắn VGA cho VM chạy Windows 10.

Trên Web GUI của Proxmox bạn hãy thêm 1 driver mới cho VM, cụ thể là thêm 1 khe PCI.

Lựa chọn 1 card màn hình bạn muốn gắn vào máy ảo, ví dụ “GeForce RTX 2060”.

Hoặc mình cũng có thêm 1 card đồ hoạ khác là “Radeon RX 470/480/570/570X/580/580X/590”. Lý do mình có 2 card vì mainboard của mình có tới 2 khe vga nên mình đã cắm 2 vga vào 2 khe này.

Trong trường hợp này mình sử dụng GeForce RTX 2060 để gắn cho VM.

Và đây là kết quả khi bạn gắn xong vga.

Hãy ssh vào Proxmox và tìm đến file “/etc/pve/qemu-server/100.conf”. Với định dạng file 100.conf chính là VM có ID là 100 đang chạy Windows 10.

Tại phần config CPU, bạn hãy thêm một option như sau:

cpu: host,flags=+pcid

Chỉnh sửa thành.

cpu: host,hidden=1,flags=+pcid

Như vậy nội dung đầy đủ sau khi chỉnh sửa sẽ như dưới.

agent: 1
bios: ovmf
boot: order=virtio0;ide2;net0;ide0
cores: 8
cpu: host,hidden=1,flags=+pcid
efidisk0: data-ssd:vm-100-disk-0,efitype=4m,size=4M
hostpci0: 0000:81:00,pcie=1,x-vga=1
ide0: local:iso/virtio-win-0.1.171.iso,media=cdrom,size=363020K
ide2: local:iso/Win10_21H2_EnglishInternational_x64.iso,media=cdrom,size=5748118K
machine: pc-q35-7.2
memory: 16384
meta: creation-qemu=7.2.0,ctime=1682218731
name: VM-Gamer
net0: virtio=62:B3:2A:2D:2B:54,bridge=vmbr0,firewall=1
numa: 0
ostype: win10
scsihw: virtio-scsi-pci
smbios1: uuid=140c3ae6-f429-41e5-9905-f2447fb64f03
sockets: 1
vga: std
virtio0: data-ssd:vm-100-disk-1,backup=0,cache=writethrough,iothread=1,size=120G
vmgenid: 1599d91f-f4a4-4fee-a74d-b8fbfdcc94e1

Trong đó, tham số “cpu: host” cho phép máy ảo sử dụng tất cả các tính năng của CPU host, bao gồm hỗ trợ cho công nghệ passthrough. Tham số “hidden=1” làm cho CPU host ẩn đi khỏi máy ảo để tránh các xung đột với các CPU ảo khác. Tham số “flags=+pcid” bật hỗ trợ PCID (Process Context Identifier) trên CPU host, giúp tăng hiệu suất khi sử dụng các ứng dụng đa luồng.

Sau khi thêm các dòng này vào file cấu hình của máy ảo, lưu file và đóng nó lại.

Cuối cùng, bạn cần thêm PCI device được chuyển cho máy ảo. Để làm điều này, bạn cần truy cập giao diện quản lý Proxmox và thêm PCI device tương ứng với GPU đã chuyển cho máy ảo. Việc thêm PCI device sẽ cho phép máy ảo sử dụng GPU được chuyển cho nó để hiển thị hình ảnh và thực hiện các tác vụ đồ họa.

Sau khi chỉnh sửa file config xong, bạn cũng sẽ thấy sự thay đổi ở trên phần Processors trên Web GUI.

Bước 8: Cài đặt Driver cho Vga.

Hãy bật VM lên và bạn sẽ thấy vga đã được gắn vào VM nhưng nó chưa có driver.

Bạn hãy tải driver phù hợp với vga và cài đặt nó. Với vga của mình thì mình chỉ lựa chọn cài đặt NVIDIA Graphics Driver.

Bấm Next.

Quá trình cài đặt bắt đầu.

Sau khi cài đặt xong bạn có thể khởi động lại VM.

Bước 9: Kiểm tra.

Đâ là kết quả khi bạn đã cài xong driver.

Bạn có thể test nó với 1 game bất kỳ.

Hoặc có thể test xem video.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories