Không thể nâng cấp do không gian đĩa / khởi động thấp


123

Tôi cố gắng làm do-release-upgrade nhưng sau đó tôi nhận được:

Không đủ dung lượng đĩa trống

Việc nâng cấp đã bị hủy bỏ. Việc nâng cấp cần tổng cộng 25,7 M dung lượng trống trên đĩa '/ boot'. Vui lòng giải phóng ít nhất 25,7 M không gian đĩa trên '/ boot'. Dọn rác của bạn và xóa các gói tạm thời của các bản cài đặt cũ bằng cách sử dụng 'sudo apt-get clean'.

Đầu ra của df:

                    237251272 214797108  10402504  96% /
udev                    488120         4    488116   1% /dev
tmpfs                   198676       668    198008   1% /run
none                      5120         0      5120   0% /run/lock
none                    496684         0    496684   0% /run/shm
/dev/sda1               233191    225867         0 100% /boot

Làm thế nào mà không còn chỗ trống khi khởi động? Đây là đầu ra của ls -as /boot:

total 221839
    4 .
    4 ..
  645 abi-2.6.32-34-generic-pae
  698 abi-2.6.35-30-generic-pae
  727 abi-2.6.38-12-generic-pae
  727 abi-3.0.0-12-generic-pae
  727 abi-3.0.0-13-generic-pae
  727 abi-3.0.0-14-generic-pae
  727 abi-3.0.0-15-generic-pae
  727 abi-3.0.0-16-generic-pae
  727 abi-3.0.0-17-generic-pae
  727 abi-3.0.0-19-generic-pae
  761 abi-3.0.0-20-generic-pae
  115 config-2.6.32-34-generic-pae
  128 config-2.6.35-30-generic-pae
  136 config-2.6.38-12-generic-pae
  140 config-3.0.0-12-generic-pae
  140 config-3.0.0-13-generic-pae
  140 config-3.0.0-14-generic-pae
  140 config-3.0.0-15-generic-pae
  140 config-3.0.0-16-generic-pae
  140 config-3.0.0-17-generic-pae
  140 config-3.0.0-19-generic-pae
  140 config-3.0.0-20-generic-pae
    5 grub
10773 initrd.img-2.6.32-34-generic-pae
13619 initrd.img-2.6.35-30-generic-pae
15365 initrd.img-2.6.38-12-generic-pae
16481 initrd.img-3.0.0-12-generic-pae
16487 initrd.img-3.0.0-13-generic-pae
16501 initrd.img-3.0.0-14-generic-pae
16476 initrd.img-3.0.0-15-generic-pae
16481 initrd.img-3.0.0-16-generic-pae
16478 initrd.img-3.0.0-17-generic-pae
   12 lost+found
  174 memtest86+.bin
  176 memtest86+_multiboot.bin
 1700 System.map-2.6.32-34-generic-pae
 1841 System.map-2.6.35-30-generic-pae
 2115 System.map-2.6.38-12-generic-pae
 2141 System.map-3.0.0-12-generic-pae
 2141 System.map-3.0.0-13-generic-pae
 2143 System.map-3.0.0-14-generic-pae
 2146 System.map-3.0.0-15-generic-pae
 2147 System.map-3.0.0-16-generic-pae
 2147 System.map-3.0.0-17-generic-pae
 2148 System.map-3.0.0-19-generic-pae
 2149 System.map-3.0.0-20-generic-pae
    2 vmcoreinfo-2.6.32-34-generic-pae
    2 vmcoreinfo-2.6.35-30-generic-pae
    2 vmcoreinfo-2.6.38-12-generic-pae
    2 vmcoreinfo-3.0.0-12-generic-pae
    2 vmcoreinfo-3.0.0-13-generic-pae
    2 vmcoreinfo-3.0.0-14-generic-pae
    2 vmcoreinfo-3.0.0-15-generic-pae
    2 vmcoreinfo-3.0.0-16-generic-pae
    2 vmcoreinfo-3.0.0-17-generic-pae
    2 vmcoreinfo-3.0.0-19-generic-pae
    2 vmcoreinfo-3.0.0-20-generic-pae
 4092 vmlinuz-2.6.32-34-generic-pae
 4347 vmlinuz-2.6.35-30-generic-pae
 4567 vmlinuz-2.6.38-12-generic-pae
 4675 vmlinuz-3.0.0-12-generic-pae
 4676 vmlinuz-3.0.0-13-generic-pae
 4681 vmlinuz-3.0.0-14-generic-pae
 4698 vmlinuz-3.0.0-15-generic-pae
 4700 vmlinuz-3.0.0-16-generic-pae
 4700 vmlinuz-3.0.0-17-generic-pae
 4703 vmlinuz-3.0.0-19-generic-pae
 4705 vmlinuz-3.0.0-20-generic-pae

Đầu ra của uname -a:

 Linux kitsch 3.0.0-17-generic-pae #30-Ubuntu SMP Thu Mar 8 17:53:35 UTC 2012 i686 i686 i386 GNU/Linux

Thêm đầu ra ls -l /bootuname -acâu hỏi của bạn.
jippie

Cũng thêm đầu ra cho dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'câu hỏi của bạn.
jippie

ls -as /bootcó thể hữu ích thay thế. Nó sẽ chỉ bao gồm kích thước của các tập tin.
adempewolff

đầu ra của ls -l / boot khá dài quá đăng ở đây vì vậy đây là một pastebin pastyin.com/yM1aEJUx
kẹp

5
Không có nó không phải là. Nó là nguyên nhân của vấn đề của bạn. Nếu câu hỏi của bạn thực sự nhận được quá lâu sẽ có người chỉnh sửa nó. Sử dụng các dịch vụ bên ngoài như pastebin sẽ phá vỡ giá trị của câu hỏi để tham khảo trong tương lai.
jippie

Câu trả lời:


160

Phân vùng / boot của bạn chứa đầy các kernel cũ. Nó làm điều đó đôi khi, không chắc chắn tại sao nó không bao giờ được sửa chữa. Bạn có thể dễ dàng loại bỏ các hạt nhân cũ nếu bạn biết chúng đã đi vào gói nào.

Đầu tiên kiểm tra uname -ađể kiểm tra phiên bản hiện tại của bạn.

Sau đó chạy lệnh sau:

dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'

Lệnh này sẽ liệt kê tất cả các gói mà bạn không còn cần nữa. Tôi không thích loại bỏ chúng một cách tự động, tôi muốn kiểm soát khi loại bỏ hạt nhân. Vì vậy, đối với mỗi gói được liệt kê, hãy làm như sau:

sudo apt-get -y purge some-kernel-package

Intermezzo

Intermezzo này mô tả chi tiết hơn cách các lệnh hoạt động và cố gắng khắc phục sự cố linux-libc-dev:amd64. Hầu hết người dùng có thể bỏ qua đoạn này.

  • dpkg -l 'linux-*' liệt kê tất cả các gói có tên bắt đầu bằng 'linux-'
  • sed '/^ii/!d; remove all lines that do *not* start withii`
  • uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/" tìm phiên bản kernel đang chạy
  • /'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d Xóa tất cả các dòng, ngoại trừ các dòng chứa số phiên bản kernel đang chạy
  • s/^[^ ]* [^ ]* \([^ ]*\).*/\1/ Đối với mỗi danh sách dòng chỉ có tên gói
  • /[0-9]/!d Xóa các dòng không chứa số.

Để khắc phục sự cố của Frederick Nord, tôi nghĩ rằng lệnh có thể được sửa đổi như sau:

dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d;/^linux-\(headers\|image\)/!d'

Về cơ bản, nó bổ sung một bộ lọc bổ sung:

  • / ^ linux- (tiêu đề \ | hình ảnh) /! d Xóa tất cả các dòng không bắt đầu bằng linux-headershoặclinux-image

/ Intermezzo

Nơi some-kernel-packagecó thể được thay thế bằng một trong các gói được liệt kê. Chỉ cần lưu ý rằng bạn không loại bỏ các gói kernel đang sử dụng hiện tại (như được liệt kê bởi uname -a), vd. sudo apt-get purge -y linux-headers-3.0.0-12Vân vân.

Nó có thể được tự động hóa hơn nữa bằng cách sử dụng lệnh xargs, nhưng tôi không thích điều đó. Đó là một điều cá nhân. Tuy nhiên, đây là lệnh để làm như vậy:

dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | xargs sudo apt-get -y purge

Đây là giao diện của tôi /boot, một hạt nhân dự phòng (2.6,38-11) chỉ trong trường hợp và 3.2.0-24 là hiện tại:

$ ls -l /boot
total 59388
-rw-r--r-- 1 root root   730545 Sep 13  2011 abi-2.6.38-11-generic
-rw-r--r-- 1 root root   791023 Apr 25 13:51 abi-3.2.0-24-generic
-rw-r--r-- 1 root root   130326 Sep 13  2011 config-2.6.38-11-generic
-rw-r--r-- 1 root root   140341 Apr 25 13:51 config-3.2.0-24-generic
drwxr-xr-x 3 root root     5120 May 27 17:46 grub
-rw-r--r-- 1 root root 20883146 Oct  1  2011 initrd.img-2.6.38-11-generic
-rw-r--r-- 1 root root 22474219 May  5 09:04 initrd.img-3.2.0-24-generic
drwxr-xr-x 2 root root    12288 Apr 16  2009 lost+found
-rw-r--r-- 1 root root   176764 Nov 27 11:00 memtest86+.bin
-rw-r--r-- 1 root root   178944 Nov 27 11:00 memtest86+_multiboot.bin
-rw------- 1 root root  2656297 Sep 13  2011 System.map-2.6.38-11-generic
-rw------- 1 root root  2884358 Apr 25 13:51 System.map-3.2.0-24-generic
-rw------- 1 root root     1369 Sep 13  2011 vmcoreinfo-2.6.38-11-generic
-rw------- 1 root root  4526784 Sep 13  2011 vmlinuz-2.6.38-11-generic
-rw------- 1 root root  4965776 Apr 25 13:51 vmlinuz-3.2.0-24-generic

Và sử dụng hệ thống tập tin:

$ df -h /boot
Filesystem Size Used Avail Use% Mounted
/dev/sda5  228M  63M  154M  29% /boot

2
Giải pháp này được truyền cảm hứng rất nhiều trên một bài viết của OzzyFrank tại ubuntugenius.wordpress.com/2011/01/08/ ích
jippie

6
Vâng, tại sao vấn đề này là câu hỏi? Điều này không nên để người dùng xử lý.
Elijah Lynn

2
FWIW: Điều này cũng phù hợp với linux-libc-dev: amd64 đối với tôi. Vì vậy, nó rất có thể là một chút quá hào phóng.
Frederick Nord

4
It does that sometimes, not sure why it is never fixedUbuntu đã đưa ra quyết định, dù tốt hay xấu, cung cấp các hạt nhân mới thường xuyên như các gói mới thay vì nâng cấp lên các gói hiện có, để cung cấp tùy chọn cài đặt nhiều hạt nhân theo ý muốn. Tôi đồng ý rằng giả định này không phù hợp với 95% những người chỉ muốn hạt nhân mới nhất (và có thể là một dự phòng trong trường hợp có vấn đề khởi động mới) và những người không muốn tự mình quản lý các hạt nhân đã cài đặt. Có lẽ trong tương lai Ubuntu sẽ thay đổi hành vi này. Bây giờ, hãy chắc chắn rằng / boot của bạn rất lớn.
thomasrutter

1
@thomasrutter Nếu bạn (như tôi và 95% số người bạn đang nói về) nghĩ rằng lỗi này là rất quan trọng, bình chọn vào nó ở đây: bugs.launchpad.net/ubuntu/+source/update-manager/+bug/1183692
FriendFX

46

sudo apt-get autoremove

đã lừa tôi, nó đã dọn sạch thành công tất cả các gói kernel chưa sử dụng.


3
điều này LAF không đúng. từ man apt-getautoremove được sử dụng để loại bỏ các gói được cài đặt tự động để đáp ứng các phụ thuộc cho một số gói và không còn cần thiết nữa. một kernel sẽ không được cài đặt để đáp ứng các phụ thuộc, chúng được cài đặt trong quá trình nâng cấp.
dward

5
@neon_overload Tôi chỉ đăng nó vì nó đã lừa tôi.
cởi trần

1
@dward Nó đã giải phóng một số không gian cho tôi: trước khi autremove: /dev/sda1, 240M total, 171M used, 57M free, 75% used /boot sau: /dev/sda1, 240M total, 129M used, 98M free, 57% used /boot
Stefan Rogin

6
Cần có một nút để thực hiện tác vụ này trong hộp thoại "Không đủ dung lượng đĩa trống". Điều này đặc biệt sẽ giúp người dùng mới làm quen với dòng lệnh.
Martin R.

1
Đã thực hiện mánh khóe mà không phá vỡ hệ điều hành của tôi
Ruthvik Vaila 22/03/2017

8

Tương đương với câu trả lời được chấp nhận - một cách khác (có thể) dễ dàng hơn là cài đặt ubuntu-tweakcông cụ, nó có thể được tải xuống từ đây . Chuyển đến "Janitor" và chọn "Hạt nhân cũ" để dọn dẹp. Nó có thể được thực hiện trong một vài cú nhấp chuột. (thử nghiệm trên máy tính để bàn 14.04)

nhập mô tả hình ảnh ở đây


Tình huống thiếu không gian trên /bootxảy ra mọi lúc nên đây là giải pháp yêu thích của tôi - ứng dụng dễ chạy, thực hiện công việc chỉ với một cú nhấp chuột.
s3m3n

2

So với các câu trả lời GUI khác ở đây, ưu điểm của câu trả lời này là Ubuntu Bash gốc được sử dụng mà không cần cài đặt các ứng dụng của bên thứ ba.

Giải pháp dựa trên Zenity và Bash

Zenity cung cấp giao diện GUI đẹp cho thiết bị đầu cuối để xử lý danh sách và chọn các mục bằng nút radio :

hạt nhân 1

Hạt nhân hiện tại bạn đã khởi động không thể bị loại bỏ và không có trong danh sách. Kích thước được báo cáo là bao nhiêu sẽ được lưu trong /bootthư mục. Nhiều hơn được lưu trên đĩa của bạn vì các nhị phân kernel cũng nằm trong các khu vực khác. Ngày 27 tháng 7 năm 2017 lưu ý: Các thư mục /usr/src/*kernel_version*/lib/modules/*kernel_version*hiện cũng được bao gồm.

Các Date Modified được phát hiện bằng cách sử dụng statlệnh. Trên hệ thống của tôi, ngày đó được "chạm" mỗi khi kernel được khởi động bằng cách này ( Làm thế nào để bạn biết khi nào một phiên bản kernel cụ thể được khởi động lần cuối? ) Kịch bản khởi động lại cron . Tuy nhiên, trên hệ thống của bạn, ngày sẽ là ngày phát hành kernel, không phải là lần cuối bạn khởi động nó.

apt-get purge cho bạn cơ hội phá thai

Bạn được cung cấp một cơ hội cuối cùng để xem mọi thứ sẽ bị xóa và xem tổng dung lượng đĩa (hơi sai lệch) sẽ được phục hồi:

The following packages will be REMOVED:
  linux-headers-4.7.1-040701* linux-headers-4.7.1-040701-generic*
  linux-headers-4.7.2-040702* linux-headers-4.7.2-040702-generic*
  linux-headers-4.7.3-040703* linux-headers-4.7.3-040703-generic*
  linux-headers-4.8.1-040801* linux-headers-4.8.1-040801-generic*
  linux-headers-4.8.10-040810* linux-headers-4.8.10-040810-generic*
  linux-headers-4.8.11-040811* linux-headers-4.8.11-040811-generic*
  linux-headers-4.8.4-040804* linux-headers-4.8.4-040804-generic*
  linux-headers-4.8.5-040805* linux-headers-4.8.5-040805-generic*
  linux-image-4.7.1-040701-generic* linux-image-4.7.2-040702-generic*
  linux-image-4.7.3-040703-generic* linux-image-4.8.1-040801-generic*
  linux-image-4.8.10-040810-generic* linux-image-4.8.11-040811-generic*
  linux-image-4.8.4-040804-generic* linux-image-4.8.5-040805-generic*
0 upgraded, 0 newly installed, 24 to remove and 2 not upgraded.
After this operation, 2,330 MB disk space will be freed.
Do you want to continue? [Y/n] 

Mật mã

Sao chép mã này vào một tệp thực thi có tên rm-kernelstrong /usr/local/bin:

#!/bin/bash

# NAME: rm-kernels
# PATH: /usr/local/bin
# DESC: Provide zenity item list of kernels to remove

# DATE: Mar 10, 2017. Modified Jul 28, 2017.

# NOTE: Will not delete current kernel.

#       With 10 kernels on an SSD, empty cache from sudo prompt (#) using:
#       # free && sync && echo 3 > /proc/sys/vm/drop_caches && free
#       First time for `du` 34 seconds.
#       Second time for `du` 1 second.

# PARM: If any parm 1 passed use REAL kernel size, else use estimated size.
#       By default `du` is not used and estimated size is displayed.

# Must be running as sudo
if [[ $(id -u) != 0 ]]; then
    zenity --error --text "root access required. Use: sudo rm-kernels"
    exit 99
fi

OLDIFS="$IFS"
IFS="|"
choices=()

current_version=$(uname -r)

for f in /boot/vmlinuz*
do
    if [[ $f == *"$current_version"* ]]; then continue; fi # skip current version
    [[ $f =~ vmlinuz-(.*) ]]
    v=${BASH_REMATCH[1]}        # example: 4.9.21-040921-generic
    v_main="${v%-*}"            # example: 4.9.21-040921

    # Kernel size in /boot/*4.9.21-040921-generic*
    s=$(du -ch /boot/*-$v* | awk '/total/{print $1}')

    if [[ $# -ne 0 ]] ; then    # Was a parameter passed?
        if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
             # Kernel headers size in /usr/src/*4.9.21-040921*
             s2=$(du -ch --max-depth=1 /usr/src/*-$v_main* | awk '/total/{print $1}')
        else
             s2="0M"            # Linux Headers are not installed
        fi
        # Kernel image size in /lib/modules/4.9.21-040921-generic*
        s3=$(du -ch --max-depth=1 /lib/modules/$v* | awk '/total/{print $1}')
    else
        # Estimate sizof of optional headers at 125MB and size of image at 220MB
        if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
             s2="125M"
        else
             s2="0M"            # Linux Headers are not installed
        fi
        s3="220M"
    fi

    # Strip out "M" provided by human readable option of du and add 3 sizes together
    s=$(( ${s//[^0-9]*} + ${s2//[^0-9]*} + ${s3//[^0-9]*} ))
    t=$(( t + s ))
    s=$s" MB"
    d=$(date --date $(stat -c %y $f) '+%b %d %Y') # Last modified date for display
    choices=("${choices[@]}" false "$v" "$d" "$s")
done

# adjust width & height below for your screen 640x480 default for 1920x1080 HD screen
# also adjust font="14" below if blue text is too small or too large

choices=(`zenity \
        --title "rm-kernels - Total: $t MB excluding: $current_version" \
        --list \
        --separator="$IFS" \
        --checklist --multiple \
        --text '<span foreground="blue" font="14">Check box next to kernel(s) to remove</span>' \
        --width=640 \
        --height=480 \
        --column "Select" \
        --column "Kernel Version Number" \
        --column "Modified Date" \
        --column " Size " \
        "${choices[@]}"`)
IFS="$OLDIFS"

i=0
list=""
for choice in "${choices[@]}" ; do
    if [ "$i" -gt 0 ]; then list="$list- "; fi # append "-" from last loop
    ((i++))

    short_choice=$(echo $choice | cut -f1-2 -d"-")
    header_count=$(find /usr/src/linux-headers-$short_choice* -maxdepth 0 -type d | wc -l)

    # If -lowlatency and -generic are purged at same time the _all header directory
    # remains on disk for specific version with no -generic or -lowlatency below.
    if [[ $header_count -lt 3 ]]; then
        # Remove all w.x.y-zzz headers
        list="$list""linux-image-$choice- linux-headers-$short_choice"
    else
        # Remove w.x.y-zzz-flavour header only, ie -generic or -lowlatency
        list="$list""linux-image-$choice- linux-headers-$choice" 
    fi

done

if [ "$i" -gt 0 ] ; then
     apt-get purge $list
fi

LƯU Ý: Bạn cần có quyền sudo để tạo tệp để sử dụng:

gksu gedit /usr/local/bin/rm-kernels

Để làm cho tập tin thực thi sử dụng:

sudo chmod +x /usr/local/bin/rm-kernels

GHI CHÚ: Đối với phiên bản máy chủ (Dựa trên văn bản, không phải GUI) của tập lệnh này, hãy xem: Làm cách nào để xóa các phiên bản kernel cũ để dọn sạch menu khởi động?


Cập nhật ngày 28 tháng 7 năm 2017

Kích thước tính toán của mỗi hạt nhân được lấy từ /boot/*kernel_version*đó có 5 tệp tổng cộng ~ 50 MB. Công thức đã thay đổi để bao gồm các tệp trong /usr/src/*kernel_version*/lib/modules/*kernel_version*. Kích thước tính toán cho mỗi hạt nhân hiện là ~ 400 MB. Các mã trên cho rm-kernelsrm-kernels-serverđã được cập nhật. Tuy nhiên, các màn hình mẫu ở trên chưa phản ánh những thay đổi này.

Mặc định là ước tính kích thước tệp cho các tiêu đề linux ở mức 125 MB và hình ảnh linux ở mức 220 MB vì ducó thể bị chậm một cách khó khăn trừ khi các tệp nằm trong bộ đệm. Để có được kích thước thực bằng cách sử dụng duchuyển bất kỳ tham số nào cho tập lệnh.

Tổng số tất cả các kích thước kernel (không bao gồm phiên bản đang chạy hiện tại không thể xóa được) hiện được hiển thị trên thanh tiêu đề.

Hộp thoại được sử dụng để hiển thị Ngày truy cập cuối cùng của mỗi hạt nhân . Ngày này có thể được ghi đè hàng loạt cho tất cả các hạt nhân trong quá trình sao lưu hoặc các hoạt động tương tự. Thay vào đó, hộp thoại hiển thị Ngày sửa đổi .


Bạn thật tuyệt! Thực sự rất cảm ơn! Bạn làm tôi hạnh phúc!
zhartaunik

0

Bạn có thể dễ dàng xử lý hạt nhân thông qua trình quản lý gói synap. Nhưng trước tiên, bạn nên biết một tên phát hành kernel được sử dụng hiện tại, trong dấu nhắc thiết bị đầu cuối:

linux@linux-desktop:~$ uname -r 4.4.0-75-generic Vì vậy, ít nhất phiên bản này bạn nên giữ nguyên. Mở synaptic và bắt đầu điền vào chỗ giữ bộ lọc nhanh như hiển thị bên dưới: nhập mô tả hình ảnh ở đây Bây giờ bạn có thể chọn tất cả các gói bạn muốn xóa và thực hiện các thao tác sau: Đánh dấu để xóa hoàn toàn -> Áp dụng . Tôi sẽ đề nghị giữ lại ít nhất một gói kernel mới nhất và một kernel trước đó. Ví dụ, trong trường hợp này, bạn có thể thoát khỏi linux-image-4.4.0-66-genericlinux-image-Extra-4.4.0-66-generic , nhưng tốt nhất là giữ 4.4.0-72 và tất nhiên 4.4.0-75 .



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.