Làm cách nào để Linux nhận ra ổ đĩa SATA / dev / sda mới mà tôi đã hoán đổi mà không cần khởi động lại?


41

Hoán đổi một ổ đĩa SATA / dev / sda không hoạt động tốt, nhưng khi tôi đổi sang một ổ đĩa mới, nó không được nhận ra:

[root@fs-2 ~]# tail -18 /var/log/messages
May 5 16:54:35 fs-2 kernel: ata1: exception Emask 0x10 SAct 0x0 SErr 0x50000 action 0xe frozen
May 5 16:54:35 fs-2 kernel: ata1: SError: { PHYRdyChg CommWake }
May 5 16:54:40 fs-2 kernel: ata1: link is slow to respond, please be patient (ready=0)
May 5 16:54:45 fs-2 kernel: ata1: device not ready (errno=-16), forcing hardreset
May 5 16:54:45 fs-2 kernel: ata1: soft resetting link
May 5 16:54:50 fs-2 kernel: ata1: link is slow to respond, please be patient (ready=0)
May 5 16:54:55 fs-2 kernel: ata1: SRST failed (errno=-16)
May 5 16:54:55 fs-2 kernel: ata1: soft resetting link
May 5 16:55:00 fs-2 kernel: ata1: link is slow to respond, please be patient (ready=0)
May 5 16:55:05 fs-2 kernel: ata1: SRST failed (errno=-16)
May 5 16:55:05 fs-2 kernel: ata1: soft resetting link
May 5 16:55:10 fs-2 kernel: ata1: link is slow to respond, please be patient (ready=0)
May 5 16:55:40 fs-2 kernel: ata1: SRST failed (errno=-16)
May 5 16:55:40 fs-2 kernel: ata1: limiting SATA link speed to 1.5 Gbps
May 5 16:55:40 fs-2 kernel: ata1: soft resetting link
May 5 16:55:45 fs-2 kernel: ata1: SRST failed (errno=-16)
May 5 16:55:45 fs-2 kernel: ata1: reset failed, giving up
May 5 16:55:45 fs-2 kernel: ata1: EH complete

Tôi đã thử một vài thứ để làm cho máy chủ tìm thấy / dev / sda mới, chẳng hạn như rescan-scsi-bus.sh nhưng chúng không hoạt động:

[root@fs-2 ~]# echo "---" > /sys/class/scsi_host/host0/scan
-bash: echo: write error: Invalid argument
[root@fs-2 ~]#
[root@fs-2 ~]# /root/rescan-scsi-bus.sh -l
[snip]
0 new device(s) found.
0 device(s) removed.
[root@fs-2 ~]#
[root@fs-2 ~]# ls /dev/sda
ls: /dev/sda: No such file or directory

Tôi đã kết thúc việc khởi động lại máy chủ. / dev / sda đã được công nhận, tôi đã sửa phần mềm RAID và mọi thứ đều ổn. Nhưng lần sau, làm cách nào để Linux có thể nhận ra ổ đĩa SATA mới mà tôi đã hoán đổi mà không cần khởi động lại?

Hệ điều hành được đề cập là RHEL5.3:

[root@fs-2 ~]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 5.3 (Tikanga)

Ổ cứng là Seagate Barracuda ES.2 SATA 3.0-Gb / s 500 GB, model ST3500320NS.

Đây là đầu ra lscpi:

[root@fs-2 ~]# lspci
00:00.0 RAM memory: nVidia Corporation MCP55 Memory Controller (rev a2)
00:01.0 ISA bridge: nVidia Corporation MCP55 LPC Bridge (rev a3)
00:01.1 SMBus: nVidia Corporation MCP55 SMBus (rev a3)
00:02.0 USB Controller: nVidia Corporation MCP55 USB Controller (rev a1)
00:02.1 USB Controller: nVidia Corporation MCP55 USB Controller (rev a2)
00:04.0 IDE interface: nVidia Corporation MCP55 IDE (rev a1)
00:05.0 IDE interface: nVidia Corporation MCP55 SATA Controller (rev a3)
00:05.1 IDE interface: nVidia Corporation MCP55 SATA Controller (rev a3)
00:05.2 IDE interface: nVidia Corporation MCP55 SATA Controller (rev a3)
00:06.0 PCI bridge: nVidia Corporation MCP55 PCI bridge (rev a2)
00:08.0 Bridge: nVidia Corporation MCP55 Ethernet (rev a3)
00:09.0 Bridge: nVidia Corporation MCP55 Ethernet (rev a3)
00:0a.0 PCI bridge: nVidia Corporation MCP55 PCI Express bridge (rev a3)
00:0b.0 PCI bridge: nVidia Corporation MCP55 PCI Express bridge (rev a3)
00:0c.0 PCI bridge: nVidia Corporation MCP55 PCI Express bridge (rev a3)
00:0d.0 PCI bridge: nVidia Corporation MCP55 PCI Express bridge (rev a3)
00:0e.0 PCI bridge: nVidia Corporation MCP55 PCI Express bridge (rev a3)
00:0f.0 PCI bridge: nVidia Corporation MCP55 PCI Express bridge (rev a3)
00:18.0 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron] HyperTransport Technology Configuration
00:18.1 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron] Address Map
00:18.2 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron] DRAM Controller
00:18.3 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron] Miscellaneous Control
00:19.0 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron] HyperTransport Technology Configuration
00:19.1 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron] Address Map
00:19.2 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron] DRAM Controller
00:19.3 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron] Miscellaneous Control
03:00.0 VGA compatible controller: Matrox Graphics, Inc. MGA G200e [Pilot] ServerEngines (SEP1) (rev 02)
04:00.0 PCI bridge: NEC Corporation uPD720400 PCI Express - PCI/PCI-X Bridge (rev 06)
04:00.1 PCI bridge: NEC Corporation uPD720400 PCI Express - PCI/PCI-X Bridge (rev 06)

Cập nhật : Có lẽ trong hàng tá trường hợp, chúng tôi đã buộc phải khởi động lại máy chủ vì trao đổi nóng không "chỉ hoạt động". Cảm ơn câu trả lời để xem thêm về bộ điều khiển SATA. Tôi đã bao gồm đầu ra lspci cho hệ thống có vấn đề ở trên (tên máy chủ: fs-2). Tôi vẫn có thể sử dụng một số trợ giúp để hiểu chính xác những gì không được hỗ trợ về phần cứng thông minh về mặt trao đổi nóng cho hệ thống đó. Xin vui lòng cho tôi biết những gì đầu ra khác ngoài lspci có thể hữu ích.

Tin tốt là trao đổi nóng "chỉ hoạt động" ngày hôm nay trên một trong các máy chủ của chúng tôi (tên máy chủ: www-1), rất hiếm đối với chúng tôi. Đây là đầu ra lspci:

[root@www-1 ~]# lspci
00:00.0 RAM memory: nVidia Corporation MCP55 Memory Controller (rev a2)
00:01.0 ISA bridge: nVidia Corporation MCP55 LPC Bridge (rev a3)
00:01.1 SMBus: nVidia Corporation MCP55 SMBus (rev a3)
00:02.0 USB Controller: nVidia Corporation MCP55 USB Controller (rev a1)
00:02.1 USB Controller: nVidia Corporation MCP55 USB Controller (rev a2)
00:04.0 IDE interface: nVidia Corporation MCP55 IDE (rev a1)
00:05.0 IDE interface: nVidia Corporation MCP55 SATA Controller (rev a3)
00:05.1 IDE interface: nVidia Corporation MCP55 SATA Controller (rev a3)
00:05.2 IDE interface: nVidia Corporation MCP55 SATA Controller (rev a3)
00:06.0 PCI bridge: nVidia Corporation MCP55 PCI bridge (rev a2)
00:08.0 Bridge: nVidia Corporation MCP55 Ethernet (rev a3)
00:09.0 Bridge: nVidia Corporation MCP55 Ethernet (rev a3)
00:0b.0 PCI bridge: nVidia Corporation MCP55 PCI Express bridge (rev a3)
00:0c.0 PCI bridge: nVidia Corporation MCP55 PCI Express bridge (rev a3)
00:0f.0 PCI bridge: nVidia Corporation MCP55 PCI Express bridge (rev a3)
00:18.0 Host bridge: Advanced Micro Devices [AMD] K10 [Opteron, Athlon64, Sempron] HyperTransport Configuration
00:18.1 Host bridge: Advanced Micro Devices [AMD] K10 [Opteron, Athlon64, Sempron] Address Map
00:18.2 Host bridge: Advanced Micro Devices [AMD] K10 [Opteron, Athlon64, Sempron] DRAM Controller
00:18.3 Host bridge: Advanced Micro Devices [AMD] K10 [Opteron, Athlon64, Sempron] Miscellaneous Control
00:18.4 Host bridge: Advanced Micro Devices [AMD] K10 [Opteron, Athlon64, Sempron] Link Control
00:19.0 Host bridge: Advanced Micro Devices [AMD] K10 [Opteron, Athlon64, Sempron] HyperTransport Configuration
00:19.1 Host bridge: Advanced Micro Devices [AMD] K10 [Opteron, Athlon64, Sempron] Address Map
00:19.2 Host bridge: Advanced Micro Devices [AMD] K10 [Opteron, Athlon64, Sempron] DRAM Controller
00:19.3 Host bridge: Advanced Micro Devices [AMD] K10 [Opteron, Athlon64, Sempron] Miscellaneous Control
00:19.4 Host bridge: Advanced Micro Devices [AMD] K10 [Opteron, Athlon64, Sempron] Link Control
03:00.0 VGA compatible controller: Matrox Graphics, Inc. MGA G200e [Pilot] ServerEngines (SEP1) (rev 02)
04:00.0 PCI bridge: NEC Corporation uPD720400 PCI Express - PCI/PCI-X Bridge (rev 06)
04:00.1 PCI bridge: NEC Corporation uPD720400 PCI Express - PCI/PCI-X Bridge (rev 06)
09:00.0 SCSI storage controller: LSI Logic / Symbios Logic SAS1064ET PCI-Express Fusion-MPT SAS (rev 04)

Tôi sẽ kiểm tra trạng thái của bộ điều khiển SATA của bạn trong phiên bản nhân Linux mà bạn đang sử dụng. Nó có thể là một lỗi hoặc đơn giản không được hỗ trợ
Nathan

Là 0 số XE, hay 1?

3
Đó là bus 0. / sys / class / scsi_host chứa host0 đến host5. dmesg hiển thị ata1 đến ata6. ata1 tương ứng với host0, ata2 tương ứng với host1, v.v.
Philip Durbin

Câu trả lời:


43

Nếu bộ điều khiển SATA của bạn hỗ trợ trao đổi nóng, nó sẽ "chỉ hoạt động (tm)."

Để buộc quét lại trên SCSI BUS (mỗi cổng SATA hiển thị dưới dạng SCSI BUS) và tìm các ổ đĩa mới, bạn sẽ sử dụng:

echo "0 0 0" >/sys/class/scsi_host/host<n>/scan

Ở trên, <n> là số XE.


Xin lỗi, không có niềm vui; chạy lệnh đó chỉ kích hoạt cùng một lần quét lại tự động được kích hoạt khi tôi cắm ổ đĩa lúc đầu. Cảm ơn, mặc dù!
hakamadare

Rất có thể một số cấu hình cần được thực hiện trên bộ điều khiển đột kích để nó nhìn thấy đĩa. Trong trường hợp của tôi, cần phải thêm đĩa mới vào cuộc đột kích.
MikeKulls

Tôi bị từ chối ngay cả khi sử dụng sudovà khi chuyển sang người dùng root.
Aaron Franke

Trên hệ thống của tôi đã khởi động từ ổ SSD NVMe, điều này đã hoạt động để phát hiện một chiếc SATA HD mới được cắm. Tôi sử dụng powertopđể làm giảm nhiều thứ hơn, vì vậy có lẽ cổng SATA mà tôi cắm ổ đĩa đã ngủ hoàn toàn. (Hệ thống này có một ổ đĩa quang SATA kết nối và phát hiện lúc khởi động, nhưng nó có lẽ là ngủ, quá.) Như những người khác đề nghị, để tránh đặt lại liên kết SATA cho ổ đĩa hoạt động, con số ra mà hostid đã được sử dụng và không scannhững , chỉ có một nơi bạn cắm vào một ổ đĩa mới. (Hoặc bất kỳ ai chưa sử dụng nếu bạn không biết cách đánh số.)
Peter Cordes

18
echo "- - -" >/sys/class/scsi_host/host<n>/scan
       ^ ^
        \_\_______ note spaces between the dashes.

5
Hãy cẩn thận với điều này: dmesg cho thấy rằng nó khó thiết lập lại tất cả các liên kết SATA của tôi. Có thể đáng thử nghiệm trước khi chạy nó trong sản xuất và mất hàng tấn viết.
Ivan Kozik

12

Khi một ổ đĩa bị lỗi trong một số trường hợp, Linux sẽ không nhận ra rằng bạn thực sự đã rút nó ra khỏi mảng. Nếu bạn gặp vấn đề đó (như tôi đã làm sáng nay), bạn có thể làm như sau:

echo 1 > /sys/block/<devnode>/device/delete

Ví dụ: trong trường hợp của tôi / dev / sda đã thất bại và tôi không muốn khởi động lại máy chủ, vì vậy tôi đã làm:

echo 1 > /sys/block/sda/device/delete

Sau khi tôi làm điều đó, ổ đĩa mới (thực sự đã được thêm vào vật lý) ngay lập tức được nhìn thấy.

Nếu nó không hiển thị tại thời điểm này, bạn cũng có thể thực hiện việc này để buộc quét lại:

echo "- – -" > /sys/class/scsi_host/host<n>/scan

Rằng "- -" là ký tự đại diện cho kênh, id & LUN tương ứng, vì vậy bạn có thể hạn chế quét đối với một số tập hợp con nếu bạn muốn bằng cách chỉ định số thay thế.

Trước khi bắt đầu, bạn cũng có thể:

readlink /sys/block/<devnode>

Điều này sẽ cho bạn thấy đường dẫn với số máy chủ phù hợp để đăng nhập / Proc / scsi / scsi cho sự biến mất sau khi xóa.


7

Làm thế nào về điều này (dường như hoạt động trong Ubuntu):

sudo partprobe


Bạn cũng có thể cần 'yum install parted'
Antonio

partedFTW ... bạn nên biết nó tốt bên cạnh các nghi phạm thông thường như fdisk, gdisk, cgdisk, testdisk.
sjas

6

Tôi không thể tin rằng chưa có ai đề cập đến AHCI ... bộ điều khiển SATA của bạn phải ở chế độ AHCI để cho phép trao đổi nóng. Kiểm tra điều này bằng cách nhìn vào trình điều khiển bạn đang sử dụng:

root@peter:~ # find /sys -name sdk
/sys/devices/pci0000:00/0000:00:11.0/ata5/host4/target4:0:0/4:0:0:0/block    /sdk
/sys/block/sdk
/sys/class/block/sdk

root@peter:~ # readlink /sys/devices/pci0000:00/0000:00:11.0/driver
../../../bus/pci/drivers/ahci

root@peter:~ # lspci -k | less
[... big long output... search for ahci or your pci address, or use the awk below ...]

root@peter:~ # lspci -k | awk '$1 == "00:11.0" {x=1}; x && /in use/ {print $0; exit}'
    Kernel driver in use: ahci

Xem cách nó nói "ahci" ở đó.

Nếu không, hãy kích hoạt nó trong BIOS của bạn. Ngoài ra, một số BIOS, đặc biệt là trên các máy chủ hoặc UEFI có cài đặt "Hoán đổi nóng = bật / tắt" trên mỗi đĩa mà bạn cũng nên bật nếu nó tồn tại.


1
Bạn là người bạn tốt nhất mới của tôi: D
allyourcode

2

Đây là lý do tại sao tôi cần khởi động lại máy tính ...

Tôi chỉ trao đổi nóng / dev / sdc của tôi. Tôi đã sử dụng scsiadd -r 3 0 0 để tắt nguồn đĩa cũ trước khi rút nó ra. Sau đó, sau khi cài đặt đĩa mới, đĩa mới không xuất hiện dưới dạng / dev / sdc mà là / dev / sdd. Sau khi khởi động lại, đĩa sẽ xuất hiện lại dưới dạng / dev / sdc.

Vì vậy, có vẻ như hotswap hoạt động Ok, có thể chỉ là / dev / sd * không còn như trước nữa.

Đây có thể là một câu trả lời cho vấn đề của bạn?


Hmmm, tốt, rescan-scsi-bus.sh đã hoạt động trên / Proc / scsi / scsi, giống như scsiadd dường như vậy. Dù sao, chúng tôi đang thử một nhà cung cấp máy chủ khác để có thể trao đổi nóng sẽ "chỉ hoạt động" cho chúng tôi trong tương lai.
Philip Durbin

4
Vâng, bạn không thể đi xung quanh đó, gần như tôi có thể nói. Đây là lý do tại sao bạn sử dụng nhãn đĩa hoặc UUID và gắn fs của bạn bằng cách đó (theo cách thủ công hoặc trong fstab), bạn có thể đặt nó và sau đó nó không thay đổi. Bí quyết duy nhất là cài đặt bộ tải khởi động của bạn để cài đặt vào ổ đĩa mới, nhưng vẫn hoạt động khi khởi động lại, mặc dù từ một số thử nghiệm nhanh với GRUB (Tôi đã thay thế sda trên máy bằng sd [a, b, c, d] và phần mềm raid1 cho tất cả các phần hệ thống của fs).
Ronald Pottol

1
Bạn không bao giờ nên sử dụng các thiết bị / dev / sd * trong các tệp cấu hình như fstab. Bạn không bao giờ nên cho rằng tên luôn giống nhau. Thay vào đó, bạn nên sử dụng cú pháp UUID = ... (không có dấu ngoặc kép), chẳng hạn như bạn thấy trong man fstab. Để tìm ra UUID, sử dụng lệnh blkid. (cách khác, bạn có thể thích nhãn hoặc id; cũng thấy / dev / đĩa / by- *)
Peter

1

DVD của tôi trên máy Fedora 16 của tôi được kết nối với giao diện SATA. Nó đã bị khóa và không mở hoặc đóng. Chạy partprobe khi root giúp cdrom / DVD của tôi hoạt động trở lại. Tôi nghĩ nó sẽ giúp ích cho máy bao phấn nơi tôi gặp vấn đề trao đổi nóng thường xuyên. Cảm ơn!


1

Bộ điều khiển Fusion-MPT SAS mà bạn có là bộ điều khiển RAID cấp thấp. Nếu bạn không sử dụng nó cho RAID, nó vẫn có thể cung cấp một lớp cản trở / trừu tượng không có ích.

Bạn có thể cần chọc vào bộ điều khiển RAID với trạng thái mpt hoặc lsiutil để làm cho nó thực sự quét xe buýt.

http://hwear.le-vert.net/wiki/LSIFusionMPT có một lượng tài liệu tốt, nhưng tôi không thể nói rằng tôi đã xác minh nó.


1

Trong một số trường hợp, trao đổi nóng có thể cần phải được bật trên BIOS của bo mạch chủ và / hoặc bộ điều khiển SATA. Điều này hoàn toàn phụ thuộc vào việc thực hiện và mô hình của cả hai, nhưng nếu bạn có on-board điều khiển SATA rằng nên hỗ trợ hotswap thì giá trị của nó chải qua BIOS bo mạch chủ. Thẻ SATA có thể có hoặc không có cài đặt BIOS riêng, nhiều thẻ cấp thấp hơn không có, nhưng thẻ cấp máy chủ thường làm.

Nếu tôi nhớ lại một cách chính xác thì tôi cần điều này với một số bo mạch chủ Gigabyte, và có lẽ một số khác. Tôi cần nó để một khay SATA trao đổi nóng hoạt động; với tính năng bị vô hiệu hóa, việc xóa ổ đĩa không gây ra sự cố nhưng một ổ đĩa mới sẽ không đăng ký cho đến khi khởi động lại. Kích hoạt cài đặt hoạt động như mong đợi, các ổ đĩa được đặt trong khay ngay lập tức được tạo ra và có sẵn cho HĐH.


Chỉ cần kiểm tra một máy trong nhà mà tôi biết đã có cái này; nó đang chạy bo mạch chủ Gigabyte Z77X-UD3H với bộ điều khiển Marvell 88SE9172 và bộ điều khiển Intel 7 Series / C210 trên bo mạch
STW

1

Tôi biết câu hỏi này đã cũ, nhưng tôi đã có một số thành công mà tôi không thấy báo cáo ở nơi khác. Có vấn đề tương tự trên Dell Precision 380 ngày hôm nay. Cuối cùng, nó đã hoạt động bằng cách thực hiện một số kết hợp sau:

echo "- - -" > /sys/class/scsi_host/host2/scan
echo 1 > /sys/class/scsi_device/2:0:0:0/device/reset
echo 1 > /sys/devices/pci0000:00/0000:00:1f.2/rescan
echo 1 > /sys/devices/pci0000:00/0000:00:1f.2/reset

CẢNH BÁO: Điều này cũng có thể phá vỡ các thiết bị ATA khác trên hệ thống. Nếu bạn đã gắn hệ thống tập tin trên các i dev đó, điều đó có khả năng kết thúc tồi tệ. Tình hình của tôi không quan tâm, nhưng có thể bạn.

Chính xác thì những lệnh nào ở trên là cần thiết, và theo thứ tự nào, tôi không biết vào lúc này. Một số lệnh có thể cần phải được lặp lại. Nếu tôi phải đoán, tôi sẽ nói làm theo thứ tự hiển thị ở trên, sau đó một scsi_host khác quét lại vào cuối. Tôi đã làm khá nhiều trong những chuyến thám hiểm của tôi.

Lệnh đầu tiên (quét scsi_host) báo cho người trung gian SCSI quét tất cả các xe buýt cho các thiết bị mới / đã thay đổi. Lệnh thứ hai cố gắng đặt lại mục tiêu SCSI (thiết bị đĩa). Hai cái cuối cùng đang làm việc với trình điều khiển cho chính bộ điều khiển AHCI.

Tôi tìm thấy các mục trong câu hỏi chủ yếu bằng cách kiểm tra chi tiết và thử nghiệm táo bạo.

Bạn có thể khớp các nút scsi_device với thiết bị và mô hình thiết bị với (sử dụng grep để in tên tệp ở phía trước nội dung):

grep . /sys/class/scsi_device/*/device/model

Chữ số đầu tiên của ID thiết bị SCSI phải là số scsi_host. Sau đó, bạn có thể khớp các nút scsi_host với các nút thiết bị của họ với:

ls -l /sys/class/scsi_host

Tôi nghi ngờ tôi sẽ không bao giờ có cơ hội tinh chỉnh hơn nữa, vì vậy tôi muốn chia sẻ thông tin này với hy vọng giúp người khác đến gần hơn. Nếu tôi có thêm thông tin, tôi sẽ chỉnh sửa câu trả lời này để phản ánh.

Hi vọng điêu nay co ich.


0

Để hotplug hoạt động, bạn phải tải mô-đun acpiphp.

[root@example ~]# modprobe acpiphp

rõ ràng nếu bạn muốn nó hoạt động khi khởi động, bạn sẽ phải cấu hình nó sẽ được tải vào lúc khởi động - một cách là tạo / chỉnh sửa /etc/rc.modules (được gọi bởi RC.sysinit) và thêm dòng:

modprobe acpiphp

hãy nhớ nếu bạn tạo tệp này để chmod + x nó, vì nó được gọi theo cách đó.


Hấp dẫn. Tôi chưa bao giờ nghe nói về acpiphp. Cảm ơn. Nó dường như là viết tắt của Cấu hình nâng cao và Giao diện nguồn cắm nóng PCI. Tất nhiên, PCI là kết nối thành phần ngoại vi.
Philip Durbin

2
acpiphp dành cho cắm nóng PCI, nghĩa là thêm và tháo thẻ PCI nóng . Một số hệ thống đắt tiền hỗ trợ này. Và cũng có nhiều nhà ảo thuật.
derobert
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.